--- title: 在 Minikube 环境中使用 NGINX Ingress 控制器配置 Ingress content_type: task weight: 100 min-kubernetes-server-version: 1.19 --- [Ingress](/zh/docs/concepts/services-networking/ingress/)是一种 API 对象,其中定义了一些规则使得集群中的 服务可以从集群外访问。 [Ingress 控制器](/zh/docs/concepts/services-networking/ingress-controllers/) 负责满足 Ingress 中所设置的规则。 本节为你展示如何配置一个简单的 Ingress,根据 HTTP URI 将服务请求路由到 服务 `web` 或 `web2`。 ## {{% heading "prerequisites" %}} {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} 如果你使用的是较早的 Kubernetes 版本,请切换到该版本的文档。 ### 创建一个 Minikube 集群 使用 Katacoda : {{< kat-button >}} 本地 : 如果已经在本地[安装Minikube](/zh/docs/tasks/tools/#minikube), 请运行 `minikube start` 创建一个集群。 ## 启用 Ingress 控制器 1. 为了启用 NGINIX Ingress 控制器,可以运行下面的命令: ```shell minikube addons enable ingress ``` 2. 检查验证 NGINX Ingress 控制器处于运行状态: {{< tabs name="tab_with_md" >}} {{% tab name="minikube v1.19 或更高版本" %}} ```shell kubectl get pods -n ingress-nginx ``` {{< note >}}最多可能需要等待一分钟才能看到这些 Pod 运行正常。{{< /note >}} 输出类似于: ``` 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 ``` {{% /tab %}} {{% tab name="minikube v1.18.1 或更早版本" %}} ```shell kubectl get pods -n kube-system ``` {{< note >}}最多可能需要等待一分钟才能看到这些 Pod 运行正常。{{< /note >}} 输出类似于: ``` 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 ``` 请确保可以在输出中看到一个名称以 `nginx-ingress-controller-` 为前缀的 Pod。 {{% /tab %}} {{< /tabs >}} ## 部署一个 Hello World 应用 1. 使用下面的命令创建一个 Deployment: ```shell kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0 ``` 输出: ``` deployment.apps/web created ``` 2. 将 Deployment 暴露出来: ```shell kubectl expose deployment web --type=NodePort --port=8080 ``` 输出: ``` service/web exposed ``` 3. 验证 Service 已经创建,并且可能从节点端口访问: ```shell kubectl get service web ``` 输出类似于: ```shell NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web NodePort 10.104.133.249 8080:31637/TCP 12m ``` 4. 使用节点端口信息访问服务: ```shell minikube service web --url ``` 输出类似于: ```shell http://172.17.0.15:31637 ``` {{< note >}} 如果使用的是 Katacoda 环境,在终端面板顶端,请点击加号标志。 然后点击 **Select port to view on Host 1**。 输入节点和端口号(这里是`31637`),之后点击 **Display Port**。 {{< /note >}} 输出类似于: ```shell Hello, world! Version: 1.0.0 Hostname: web-55b8c6998d-8k564 ``` 你现在应该可以通过 Minikube 的 IP 地址和节点端口来访问示例应用了。 下一步是让自己能够通过 Ingress 资源来访问应用。 ## 创建一个 Ingress 下面是一个定义 Ingress 的配置文件,负责通过 `hello-world.info` 将请求 转发到你的服务。 1. 根据下面的 YAML 创建文件 `example-ingress.yaml`: {{< codenew file="service/networking/example-ingress.yaml" >}} 2. 通过运行下面的命令创建 Ingress 对象: ```shell kubectl apply -f https://k8s.io/examples/service/networking/example-ingress.yaml ``` 输出: ``` ingress.networking.k8s.io/example-ingress created ``` 3. 验证 IP 地址已被设置: ```shell kubectl get ingress ``` {{< note >}} 此操作可能需要几分钟时间。 {{< /note >}} 接下来你将会在ADDRESS列中看到IPv4地址,例如: ``` NAME CLASS HOSTS ADDRESS PORTS AGE example-ingress hello-world.info 172.17.0.15 80 38s ``` 4. 在 `/etc/hosts` 文件的末尾添加以下内容(需要管理员访问权限): {{< note >}} 如果你在本地运行 Minikube 环境,需要使用 `minikube ip` 获得外部 IP 地址。 Ingress 列表中显示的 IP 地址会是内部 IP 地址。 {{< /note >}} ``` 172.17.0.15 hello-world.info ``` 添加完成后,在浏览器中访问URL `hello-world.info`,请求将被发送到 Minikube。 5. 验证 Ingress 控制器能够转发请求流量: ```shell curl hello-world.info ``` 你应该看到类似输出: ``` Hello, world! Version: 1.0.0 Hostname: web-55b8c6998d-8k564 ``` {{< note >}} 如果你在使用本地 Minikube 环境,你可以从浏览器中访问 hello-world.info。 {{< /note >}} ## 创建第二个 Deployment 1. 使用下面的命令创建第二个 Deployment: ```shell kubectl create deployment web2 --image=gcr.io/google-samples/hello-app:2.0 ``` 输出: ``` deployment.apps/web2 created ``` 2. 将第二个 Deployment 暴露出来: ```shell kubectl expose deployment web2 --port=8080 --type=NodePort ``` 输出: ``` service/web2 exposed ``` ## 编辑现有的 Ingress {#edit-ingress} 1. 编辑现有的 `example-ingress.yaml`,在文件最后添加以下行: ```yaml - path: /v2 pathType: Prefix backend: service: name: web2 port: number: 8080 ``` 2. 应用变更: ```shell kubectl apply -f example-ingress.yaml ``` 输出: ``` ingress.networking/example-ingress configured ``` ## 测试你的 Ingress 1. 访问 HelloWorld 应用的第一个版本: ```shell curl hello-world.info ``` 输出类似于: ``` Hello, world! Version: 1.0.0 Hostname: web-55b8c6998d-8k564 ``` 2. 访问 HelloWorld 应用的第二个版本: ```shell curl hello-world.info/v2 ``` 输出类似于: ``` Hello, world! Version: 2.0.0 Hostname: web2-75cd47646f-t8cjk ``` {{< note >}} 如果你在本地运行 Minikube 环境,你可以使用浏览器来访问 hello-world.info 和 hello-world.info/v2。 {{< /note >}} ## {{% heading "whatsnext" %}} * 进一步了解 [Ingress](/zh/docs/concepts/services-networking/ingress/)。 * 进一步了解 [Ingress 控制器](/zh/docs/concepts/services-networking/ingress-controllers/) * 进一步了解 [服务](/zh/docs/concepts/services-networking/service/)