您正在查看 Kubernetes 版本的文档: v1.20
Kubernetes v1.20 版本的文档已不再维护。您现在看到的版本来自于一份静态的快照。如需查阅最新文档,请点击 最新版本。
在 Minikube 环境中使用 NGINX Ingress 控制器配置 Ingress
Ingress是一种 API 对象,其中定义了一些规则使得集群中的 服务可以从集群外访问。 Ingress 控制器 负责满足 Ingress 中所设置的规则。
本节为你展示如何配置一个简单的 Ingress,根据 HTTP URI 将服务请求路由到
服务 web 或 web2。
准备开始
你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,你可以通过 Minikube 构建一 个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:
要获知版本信息,请输入kubectl version.创建一个 Minikube 集群
- 点击 Launch Terminal 
- (可选操作)如果你在本地安装了 Minikube,运行下面的命令: - minikube start
启用 Ingress 控制器
- 为了启用 NGINIX Ingress 控制器,可以运行下面的命令: - minikube addons enable ingress
- 检查验证 NGINX Ingress 控制器处于运行状态: - kubectl get pods -n kube-system说明: 这一操作可能需要近一分钟时间。- 输出: - NAME READY STATUS RESTARTS AGE default-http-backend-59868b7dd6-xb8tq 1/1 Running 0 1m kube-addon-manager-minikube 1/1 Running 0 3m kube-dns-6dcb57bcc8-n4xd4 3/3 Running 0 2m kubernetes-dashboard-5498ccf677-b8p5h 1/1 Running 0 2m nginx-ingress-controller-5984b97644-rnkrg 1/1 Running 0 1m storage-provisioner 1/1 Running 0 2m
部署一个 Hello World 应用
- 使用下面的命令创建一个 Deployment: - kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0- 输出: - deployment.apps/web created
- 将 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 web --url- 输出: - http://172.17.0.15:31637说明: 如果使用的是 Katacoda 环境,在终端面板顶端,请点击加号标志。 然后点击 Select port to view on Host 1。 输入节点和端口号(这里是- 31637),之后点击 Display Port。- 输出: - Hello, world! Version: 1.0.0 Hostname: web-55b8c6998d-8k564- 你现在应该可以通过 Minikube 的 IP 地址和节点端口来访问示例应用了。 下一步是让自己能够通过 Ingress 资源来访问应用。 
创建一个 Ingress 资源
下面是一个 Ingress 资源的配置文件,负责通过 hello-world.info 将服务请求
转发到你的服务。
- 根据下面的 YAML 创建文件 - example-ingress.yaml:- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1 spec: rules: - host: hello-world.info 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说明: 此操作可能需要几分钟时间。- NAME CLASS HOSTS ADDRESS PORTS AGE example-ingress <none> hello-world.info 172.17.0.15 80 38s
- 在 - /etc/hosts文件的末尾添加以下内容:说明: 如果你在本地运行 Minikube 环境,需要使用- minikube ip获得外部 IP 地址。 Ingress 列表中显示的 IP 地址会是内部 IP 地址。- 172.17.0.15 hello-world.info- 此设置使得来自 - hello-world.info的请求被发送到 Minikube。
- 验证 Ingress 控制器能够转发请求流量: - curl hello-world.info- 输出: - Hello, world! Version: 1.0.0 Hostname: web-55b8c6998d-8k564说明: 如果你在使用本地 Minikube 环境,你可以从浏览器中访问 hello-world.info。
创建第二个 Deployment
- 使用下面的命令创建 v2 的 Deployment: - kubectl create deployment web2 --image=gcr.io/google-samples/hello-app:2.0- 输出: - deployment.apps/web2 created
- 将 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
- 访问 HelloWorld 应用的第一个版本: - curl hello-world.info- 输出: - Hello, world! Version: 1.0.0 Hostname: web-55b8c6998d-8k564
- 访问 HelloWorld 应用的第二个版本: - curl hello-world.info/v2- 输出: - Hello, world! Version: 2.0.0 Hostname: web2-75cd47646f-t8cjk说明: 如果你在本地运行 Minikube 环境,你可以使用浏览器来访问 hello-world.info 和 hello-world.info/v2。
接下来
- 进一步了解 Ingress。
- 进一步了解 Ingress 控制器
- 进一步了解服务