在 Minikube 环境中使用 NGINX Ingress 控制器配置 Ingress

Ingress是一种 API 对象, 其中定义了一些规则使得集群中的服务可以从集群外访问。 Ingress 控制器负责满足 Ingress 中所设置的规则。

本节为你展示如何配置一个简单的 Ingress,根据 HTTP URI 将服务请求路由到服务 webweb2

准备开始

本教程假设你正在使用 minikube 运行一个本地 Kubernetes 集群。 参阅安装工具了解如何安装 minikube

你必须拥有一个 Kubernetes 的集群,同时你必须配置 kubectl 命令行工具与你的集群通信。 建议在至少有两个不作为控制平面主机的节点的集群上运行本教程。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面的 Kubernetes 练习环境之一:

你的 Kubernetes 服务器版本必须不低于版本 1.19. 要获知版本信息,请输入 kubectl version.

如果你使用的是较早的 Kubernetes 版本,请切换到该版本的文档。

创建一个 Minikube 集群

如果你还未在本地搭建集群,运行 minikube start 创建集群。

启用 Ingress 控制器

  1. 为了启用 NGINIX Ingress 控制器,可以运行下面的命令:

    1. minikube addons enable ingress
  2. 检查验证 NGINX Ingress 控制器处于运行状态:

    1. kubectl get pods -n ingress-nginx

    说明:

    最多可能需要等待一分钟才能看到这些 Pod 运行正常。

    输出类似于:

    1. NAME READY STATUS RESTARTS AGE
    2. ingress-nginx-admission-create-g9g49 0/1 Completed 0 11m
    3. ingress-nginx-admission-patch-rqp78 0/1 Completed 1 11m
    4. ingress-nginx-controller-59b45fb494-26npt 1/1 Running 0 11m

部署一个 Hello World 应用

  1. 使用下面的命令创建一个 Deployment:

    1. kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0

    输出:

    1. deployment.apps/web created
  2. 将 Deployment 暴露出来:

    1. kubectl expose deployment web --type=NodePort --port=8080

    输出类似于:

    1. service/web exposed
  3. 验证 Service 已经创建,并且可以从节点端口访问:

    1. kubectl get service web

    输出类似于:

    1. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    2. web NodePort 10.104.133.249 <none> 8080:31637/TCP 12m
  4. 使用节点端口信息访问服务:

    1. minikube service web --url

    输出类似于:

    1. http://172.17.0.15:31637
    1. curl http://172.17.0.15:31637

    输出类似于:

    1. Hello, world!
    2. Version: 1.0.0
    3. Hostname: web-55b8c6998d-8k564

    你现在应该可以通过 Minikube 的 IP 地址和节点端口来访问示例应用了。 下一步是让自己能够通过 Ingress 资源来访问应用。

创建一个 Ingress

下面是一个定义 Ingress 的配置文件,负责通过 hello-world.info 将请求转发到你的服务。

  1. 根据下面的 YAML 创建文件 example-ingress.yaml

    service/networking/example-ingress.yaml 在 Minikube 环境中使用 NGINX Ingress 控制器配置 Ingress - 图1

    1. apiVersion: networking.k8s.io/v1
    2. kind: Ingress
    3. metadata:
    4. name: example-ingress
    5. annotations:
    6. nginx.ingress.kubernetes.io/rewrite-target: /$1
    7. spec:
    8. rules:
    9. - host: hello-world.info
    10. http:
    11. paths:
    12. - path: /
    13. pathType: Prefix
    14. backend:
    15. service:
    16. name: web
    17. port:
    18. number: 8080
  2. 通过运行下面的命令创建 Ingress 对象:

    1. kubectl apply -f https://k8s.io/examples/service/networking/example-ingress.yaml

    输出类似于:

    1. ingress.networking.k8s.io/example-ingress created
  3. 验证 IP 地址已被设置:

    1. kubectl get ingress

    说明:

    此操作可能需要几分钟时间。

    接下来你将会在 ADDRESS 列中看到 IPv4 地址,例如:

    1. NAME CLASS HOSTS ADDRESS PORTS AGE
    2. example-ingress <none> hello-world.info 172.17.0.15 80 38s
  4. 验证 Ingress 控制器能够转发请求流量:

    1. curl --resolve "hello-world.info:80:$( minikube ip )" -i http://hello-world.info

    你应该看到类似输出:

    1. Hello, world!
    2. Version: 1.0.0
    3. Hostname: web-55b8c6998d-8k564

    你也可以从浏览器访问 hello-world.info

    • 可选

      查看 Minikube 报告的外部 IP 地址:

      1. minikube ip

      将类似以下这一行添加到你计算机上的 /etc/hosts 文件的末尾(需要管理员访问权限):

      1. 172.17.0.15 hello-world.info

      说明:

      1. 更改 IP 地址以匹配 `minikube ip` 的输出。

      更改完成后,在浏览器中访问 URL hello-world.info,请求将被发送到 Minikube。

创建第二个 Deployment

  1. 使用下面的命令创建第二个 Deployment:

    1. kubectl create deployment web2 --image=gcr.io/google-samples/hello-app:2.0

    输出类似于:

    1. deployment.apps/web2 created
  2. 将第二个 Deployment 暴露出来:

    1. kubectl expose deployment web2 --port=8080 --type=NodePort

    输出类似于:

    1. service/web2 exposed

编辑现有的 Ingress

  1. 编辑现有的 example-ingress.yaml,在文件最后添加以下行:

    1. - path: /v2
    2. pathType: Prefix
    3. backend:
    4. service:
    5. name: web2
    6. port:
    7. number: 8080
  2. 应用变更:

    1. kubectl apply -f example-ingress.yaml

    输出类似于:

    1. ingress.networking/example-ingress configured

测试你的 Ingress

  1. 访问 Hello World 应用的第一个版本:

    1. curl --resolve "hello-world.info:80:$( minikube ip )" -i http://hello-world.info

    输出类似于:

    1. Hello, world!
    2. Version: 1.0.0
    3. Hostname: web-55b8c6998d-8k564
  2. 访问 Hello World 应用的第二个版本:

    1. curl --resolve "hello-world.info:80:$( minikube ip )" -i http://hello-world.info/v2

    输出类似于:

    1. Hello, world!
    2. Version: 2.0.0
    3. Hostname: web2-75cd47646f-t8cjk

    说明:

    如果你执行了更新 /etc/hosts 的可选步骤,你也可以从你的浏览器中访问 hello-world.infohello-world.info/v2

接下来