Kubernetes Ingress 资源提供从集群外部到集群中的一个或多个服务的 HTTP 或 HTTPS 路由。TKG 集群通过第三方控制器(例如 Nginx)支持 Ingress。

此教程演示了如何部署基于 NGINX 的 Kubernetes Ingress 服务,用于将外部流量路由到 Tanzu Kubernetes 集群中的服务。Ingress 服务需要 Ingress 控制器。我们使用 Helm 安装 NGINX Ingress 控制器。Helm 是适用于 Kubernetes 的软件包管理器。

注: 完成此任务的方法有多种。本文中的步骤提供了一种方法。在给定的环境中,其他方法可能更适合。

前提条件

  • 查看 Kubernetes 文档中的 Ingress 资源。
  • 查看 Nginx Ingress 控制器文档。
  • 置备 TKG 集群。
  • 如有必要,请启用 Pod 安全策略。
  • 连接到 TKG 集群。

过程

  1. 参考文档,安装 Helm。
  2. 使用 Helm 安装 NGINX Ingress 控制器。
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm install ingress-nginx ingress-nginx/ingress-nginx
  3. 验证 Nginx Ingress 控制器是否部署为 LoadBalancer 类型的服务。
    kubectl get services
    NAME                                 TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
    ingress-nginx-controller             LoadBalancer   10.16.18.20    10.19.14.76   80:30635/TCP,443:30873/TCP   59m
    ingress-nginx-controller-admission   ClusterIP      10.87.41.25    <none>        443/TCP                      59m
    
  4. 使用外部 IP 地址对负载均衡器执行 Ping 操作。
    ping 10.19.14.76
    Pinging 10.19.14.76 with 32 bytes of data:
    Reply from 10.19.14.76: bytes=32 time<1ms TTL=62
    Reply from 10.19.14.76: bytes=32 time=1ms TTL=62
    
  5. 验证 Nginx Ingress 控制器是否正在运行。
    kubectl get pods
    NAME                                        READY   STATUS    RESTARTS   AGE
    ingress-nginx-controller-7c6c46898c-v6blt   1/1     Running   0          76m
  6. 创建具有 Ingress 规则和路径且名为 ingress-hello.yaml 的 Ingress 资源。
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: ingress-hello
    spec:
      rules:
      - http:
          paths:
          - path: /hello
            backend:
              serviceName: hello
              servicePort: 80
    
    注意: 从 Kubernetes v1.22 开始,Kubernetes API networking.k8s.io/v1beta1 已弃用。将使用新的 API networking.k8s.io/v1,该 API 涉及到一些清单更改,有关更改详细信息,请单击此处: https://kubernetes.io/docs/reference/using-api/deprecation-guide/
  7. 部署 ingress-hello 资源。
    kubectl apply -f ingress-hello.yaml
    ingress.networking.k8s.io/ingress-hello created
  8. 验证该 Ingress 资源是否已部署。
    请注意,IP 地址映射到 Ingress 控制器的外部 IP。
    kubectl get ingress
    NAME            CLASS    HOSTS   ADDRESS         PORTS   AGE
    ingress-hello   <none>   *       10.19.14.76     80      51m
  9. 创建名为 ingress-hello-test.yaml 的 hello 测试应用程序和服务。
    kind: Service
    apiVersion: v1
    metadata:
      name: hello
    spec:
      selector:
        app: hello
        tier: backend
      ports:
      - protocol: TCP
        port: 80
        targetPort: http
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: hello
          tier: backend
          track: stable
      template:
        metadata:
          labels:
            app: hello
            tier: backend
            track: stable
        spec:
          containers:
            - name: hello
              image: "gcr.io/google-samples/hello-go-gke:1.0"
              ports:
                - name: http
                  containerPort: 80
    
  10. 部署 ingress-hello-test 资源。
    kubectl apply -f ingress-hello-test.yaml
    service/hello created
    deployment.apps/hello created
  11. 验证 hello 部署是否可用。
    kubectl get deployments
    NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
    hello                      3/3     3            3           4m59s
    ingress-nginx-controller   1/1     1            1           3h39m
    
  12. 获取 Nginx Ingress 控制器使用的负载均衡器的公用 IP 地址。
    kubectl get ingress
    NAME            CLASS    HOSTS   ADDRESS         PORTS   AGE
    ingress-hello   <none>   *       10.19.14.76     80      13m
  13. 使用浏览器,导航到公用 IP,并包含 Ingress 路径。
    http://10.19.14.76/hello
    将返回消息“hello”。
    {"message":"Hello"}

结果

浏览器可从外部通过 Ingress 控制器使用负载均衡器的外部 IP 地址访问集群内部运行的服务管理的后端应用程序。