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

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

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

准备开始

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

你的 Kubernetes 服务器版本必须不低于版本 1.19. 要获知版本信息,请输入 kubectl version. 如果你使用的是较早的 Kubernetes 版本,请切换到该版本的文档。

创建一个 Minikube 集群

使用 Katacoda

本地

如果已经在本地安装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
    1. kubectl get pods -n kube-system

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

    输出类似于:

    1. NAME READY STATUS RESTARTS AGE
    2. default-http-backend-59868b7dd6-xb8tq 1/1 Running 0 1m
    3. kube-addon-manager-minikube 1/1 Running 0 3m
    4. kube-dns-6dcb57bcc8-n4xd4 3/3 Running 0 2m
    5. kubernetes-dashboard-5498ccf677-b8p5h 1/1 Running 0 2m
    6. nginx-ingress-controller-5984b97644-rnkrg 1/1 Running 0 1m
    7. storage-provisioner 1/1 Running 0 2m

    请确保可以在输出中看到一个名称以 nginx-ingress-controller- 为前缀的 Pod。

部署一个 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

    说明: 如果使用的是 Katacoda 环境,在终端面板顶端,请点击加号标志。 然后点击 Select port to view on Host 1。 输入节点和端口号(这里是31637),之后点击 Display Port

    输出类似于:

    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. /etc/hosts 文件的末尾添加以下内容(需要管理员访问权限):

    说明: 如果你在本地运行 Minikube 环境,需要使用 minikube ip 获得外部 IP 地址。 Ingress 列表中显示的 IP 地址会是内部 IP 地址。

    1. 172.17.0.15 hello-world.info

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

  5. 验证 Ingress 控制器能够转发请求流量:

    1. curl hello-world.info

    你应该看到类似输出:

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

    说明: 如果你在使用本地 Minikube 环境,你可以从浏览器中访问 hello-world.info。

创建第二个 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. 访问 HelloWorld 应用的第一个版本:

    1. curl hello-world.info

    输出类似于:

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

    1. curl hello-world.info/v2

    输出类似于:

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

    说明: 如果你在本地运行 Minikube 环境,你可以使用浏览器来访问 hello-world.info 和 hello-world.info/v2。

接下来