在 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 控制器,可以运行下面的命令:

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

    kubectl get pods -n ingress-nginx
    

    输出类似于:

    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 应用

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

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

    输出:

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

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

    输出类似于:

    service/web exposed
    
  1. 验证 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
    
  1. 使用节点端口信息访问服务:

    minikube service web --url
    

    输出类似于:

    http://172.17.0.15:31637
    
    curl http://172.17.0.15:31637
    

    输出类似于:

    Hello, world!
    Version: 1.0.0
    Hostname: web-55b8c6998d-8k564
    

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

创建一个 Ingress

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

  1. 根据下面的 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
  1. 通过运行下面的命令创建 Ingress 对象:

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

    输出类似于:

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

    kubectl get ingress
    

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

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

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

    你应该看到类似输出:

    Hello, world!
    Version: 1.0.0
    Hostname: web-55b8c6998d-8k564
    

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

    • 可选

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

      minikube ip
      

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

      172.17.0.15 hello-world.info
      

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

创建第二个 Deployment

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

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

    输出类似于:

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

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

    输出类似于:

    service/web2 exposed
    

编辑现有的 Ingress

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

    - path: /v2
      pathType: Prefix
      backend:
        service:
          name: web2
          port:
            number: 8080
    
  1. 应用变更:

    kubectl apply -f example-ingress.yaml
    

    输出类似于:

    ingress.networking/example-ingress configured
    

测试你的 Ingress

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

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

    输出类似于:

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

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

    输出类似于:

    Hello, world!
    Version: 2.0.0
    Hostname: web2-75cd47646f-t8cjk
    

接下来