使用 NGINX Ingress 控制器在 Minikube 上设置 Ingress
Ingress 是一个 API 对象,它定义了允许外部访问集群中服务的规则。一个 Ingress 控制器 实现了 Ingress 中设置的规则。
此页面展示了如何设置一个简单的 Ingress,它根据 HTTP URI 将请求路由到服务 'web' 或 'web2'。
开始之前
本教程假设您使用 minikube
运行本地 Kubernetes 集群。访问 安装工具 了解如何安装 minikube
。
注意
本教程使用一个需要 AMD64 架构的容器。如果您在使用不同 CPU 架构的计算机上使用 minikube,可以尝试使用可以模拟 AMD64 的驱动程序。例如,Docker Desktop 驱动程序可以做到这一点。您需要有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在至少有两个节点的集群上运行本教程,这些节点不充当控制平面主机。如果您还没有集群,可以使用 minikube 创建一个,或者您可以使用以下 Kubernetes 游乐场之一
您的 Kubernetes 服务器必须是 1.19 或更高版本。要检查版本,请输入kubectl version
。如果您使用的是旧版本的 Kubernetes,请切换到该版本的文档。创建 minikube 集群
如果您还没有在本地设置集群,请运行 minikube start
来创建一个集群。
启用 Ingress 控制器
要启用 NGINX Ingress 控制器,请运行以下命令
minikube addons enable ingress
验证 NGINX Ingress 控制器是否正在运行
kubectl get pods -n ingress-nginx
注意
您可能需要等待一分钟才能看到这些 Pod 运行正常。输出类似于
NAME READY STATUS RESTARTS AGE ingress-nginx-admission-create-g9g49 0/1 Completed 0 11m ingress-nginx-admission-patch-rqp78 0/1 Completed 1 11m ingress-nginx-controller-59b45fb494-26npt 1/1 Running 0 11m
部署一个 hello, world 应用
使用以下命令创建一个 Deployment
kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0
输出应该是
deployment.apps/web created
验证 Deployment 是否处于 Ready 状态
kubectl get deployment web
输出应该类似于
NAME READY UP-TO-DATE AVAILABLE AGE web 1/1 1 1 53s
公开 Deployment
kubectl expose deployment web --type=NodePort --port=8080
输出应该是
service/web exposed
验证 Service 是否已创建,并且是否在节点端口上可用
kubectl get service web
输出类似于
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web NodePort 10.104.133.249 <none> 8080:31637/TCP 12m
使用
minikube service
命令通过 NodePort 访问 Service。请按照您的平台说明操作minikube service web --url
输出类似于
http://172.17.0.15:31637
调用上一步输出中获得的 URL
curl http://172.17.0.15:31637
# The command must be run in a separate terminal. minikube service web --url
输出类似于
http://127.0.0.1:62445 ! Because you are using a Docker driver on darwin, the terminal needs to be open to run it.
从另一个终端调用上一步输出中获得的 URL
curl http://127.0.0.1:62445
输出类似于Hello, world! Version: 1.0.0 Hostname: web-55b8c6998d-8k564
您现在可以通过 Minikube IP 地址和 NodePort 访问示例应用程序。下一步让您使用 Ingress 资源访问应用程序。
创建 Ingress
以下清单定义了一个 Ingress,它通过 hello-world.example
将流量发送到您的 Service。
从以下文件创建
example-ingress.yaml
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: ingressClassName: nginx rules: - host: hello-world.example http: paths: - path: / pathType: Prefix backend: service: name: web port: number: 8080
通过运行以下命令创建 Ingress 对象
kubectl apply -f https://k8s.io/examples/service/networking/example-ingress.yaml
输出应该是
ingress.networking.k8s.io/example-ingress created
验证 IP 地址是否已设置
kubectl get ingress
注意
这可能需要几分钟。您应该在
ADDRESS
列中看到一个 IPv4 地址;例如NAME CLASS HOSTS ADDRESS PORTS AGE example-ingress nginx hello-world.example 172.17.0.15 80 38s
通过按照您的平台说明操作,验证 Ingress 控制器是否正在引导流量
注意
如果在 MacOS(Darwin)上使用 Docker 驱动程序,网络将受到限制,并且无法直接访问节点 IP。要使 Ingress 正常工作,您需要打开一个新的终端并运行minikube tunnel
。
它需要sudo
权限,因此在提示时提供密码。curl --resolve "hello-world.example:80:$( minikube ip )" -i http://hello-world.example
minikube tunnel
输出类似于
Tunnel successfully started NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ... The service/ingress example-ingress requires privileged ports to be exposed: [80 443] sudo permission will be asked for it. Starting tunnel for service example-ingress.
从一个新的终端中,调用以下命令
curl --resolve "hello-world.example:80:127.0.0.1" -i http://hello-world.example
您应该看到Hello, world! Version: 1.0.0 Hostname: web-55b8c6998d-8k564
或者,您也可以从浏览器访问
hello-world.example
。在计算机上的
/etc/hosts
文件末尾添加一行(您需要管理员访问权限)查找 minikube 报告的外部 IP 地址
minikube ip
172.17.0.15 hello-world.example
注意
将 IP 地址更改为与minikube ip
的输出匹配。127.0.0.1 hello-world.example
在您进行此更改后,您的 Web 浏览器将向 Minikube 发送对
hello-world.example
URL 的请求。
创建第二个 Deployment
使用以下命令创建另一个 Deployment
kubectl create deployment web2 --image=gcr.io/google-samples/hello-app:2.0
输出应该是
deployment.apps/web2 created
验证 Deployment 是否处于 Ready 状态
kubectl get deployment web2
输出应该类似于
NAME READY UP-TO-DATE AVAILABLE AGE web2 1/1 1 1 16s
公开第二个 Deployment
kubectl expose deployment web2 --port=8080 --type=NodePort
输出应该是
service/web2 exposed
编辑现有的 Ingress
编辑现有的
example-ingress.yaml
清单,并在末尾添加以下行- path: /v2 pathType: Prefix backend: service: name: web2 port: number: 8080
应用更改
kubectl apply -f example-ingress.yaml
您应该看到
ingress.networking/example-ingress configured
测试您的 Ingress
访问 Hello World 应用的第一个版本。
curl --resolve "hello-world.example:80:$( minikube ip )" -i http://hello-world.example
minikube tunnel
输出类似于
Tunnel successfully started NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ... The service/ingress example-ingress requires privileged ports to be exposed: [80 443] sudo permission will be asked for it. Starting tunnel for service example-ingress.
从一个新的终端中,调用以下命令
curl --resolve "hello-world.example:80:127.0.0.1" -i http://hello-world.example
输出类似于
Hello, world! Version: 1.0.0 Hostname: web-55b8c6998d-8k564
访问 Hello World 应用的第二个版本。
curl --resolve "hello-world.example:80:$( minikube ip )" -i http://hello-world.example/v2
minikube tunnel
输出类似于
Tunnel successfully started NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ... The service/ingress example-ingress requires privileged ports to be exposed: [80 443] sudo permission will be asked for it. Starting tunnel for service example-ingress.
从一个新的终端中,调用以下命令
curl --resolve "hello-world.example:80:127.0.0.1" -i http://hello-world.example/v2
输出类似于
Hello, world! Version: 2.0.0 Hostname: web2-75cd47646f-t8cjk
注意
如果您执行了更新/etc/hosts
的可选步骤,您也可以从浏览器访问hello-world.example
和hello-world.example/v2
。
下一步
- 详细了解 Ingress
- 详细了解 Ingress 控制器
- 详细了解 服务