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

此教程演示了如何部署用于将外部流量路由到 TKG 集群中服务的 Contour Ingress 控制器。Contour 是 VMware 参与的一个开源项目。

前提条件

  • 查看 Kubernetes 文档中的 Ingress 资源。
  • 查看 Contour Ingress 控制器。
  • 置备 TKG 集群。
  • 连接到 TKG 集群。

过程

  1. 创建一个 ClusterRoleBinding,以允许服务帐户管理集群的所有资源。
    kubectl create clusterrolebinding default-tkg-admin-privileged-binding 
    --clusterrole=psp:vmware-system-privileged --group=system:authenticated
    注: 如果需要更严格的安全性,请在 projectcontour 命名空间上使用 RoleBinding。请参见 将默认 Pod 安全策略应用于 TKG Service 集群
  2. 创建名为 projectcontour 的命名空间。
    这是 Contour Ingress 控制器部署的默认命名空间
    kubectl create ns projectcontour
  3. 下载最新的 Contour Ingress 控制器 YAML:Contour Ingress 部署
  4. 使用文本编辑器打开 contour.yaml 文件。
  5. 通过在每行前面加上 # 符号,注释掉以下两行:
    第 1632 行:
    # service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
    
    第 1634 行:
    # externalTrafficPolicy: Local
    
  6. 通过应用 contour.yaml 文件部署 Countour。
    kubectl apply -f contour.yaml
  7. 验证是否已部署 Contour Ingress 控制器和 Envoy 负载均衡器服务。
    kubectl get services -n projectcontour
    NAME      TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                      AGE
    contour   ClusterIP      198.63.146.166   <none>          8001/TCP                     120m
    envoy     LoadBalancer   198.48.52.47     192.168.123.5   80:30501/TCP,443:30173/TCP   120m
  8. 验证 Contour 和 Envory Pod 是否正在运行。
    kubectl get pods -n projectcontour
    NAME                       READY   STATUS      RESTARTS   AGE
    contour-7966d6cdbf-skqfl   1/1     Running     1          21h
    contour-7966d6cdbf-vc8c7   1/1     Running     1          21h
    contour-certgen-77m2n      0/1     Completed   0          21h
    envoy-fsltp                1/1     Running     0          20h
  9. 使用外部 IP 地址对负载均衡器执行 Ping 操作。
    ping 192.168.123.5
    PING 192.168.123.5 (192.168.123.5) 56(84) bytes of data.
    64 bytes from 192.168.123.5: icmp_seq=1 ttl=62 time=3.50 ms
    
  10. 创建名为 ingress-nihao.yaml 的 Ingress 资源。
    创建 YAML。
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: ingress-nihao
    spec:
      rules:
      - http:
          paths:
          - path: /nihao
            backend:
              serviceName: nihao
              servicePort: 80
    
    应用 YAML。
    kubectl apply -f ingress-nihao.yaml
    验证是否已创建 Ingress 资源。
    kubectl get ingress
    Envoy LoadBalancer 的外部 IP 地址(在此示例中为 192.168.123.5)由 Ingress 对象使用。
    NAME            CLASS    HOSTS   ADDRESS         PORTS   AGE
    ingress-nihao   <none>   *       192.168.123.5     80      17s
  11. 部署具有后端应用程序的测试服务。
    创建以下名为 ingress-nihao-test.yaml 的 YAML 文件。
    kind: Service
    apiVersion: v1
    metadata:
      name: nihao
    spec:
      selector:
        app: nihao
        tier: backend
      ports:
      - protocol: TCP
        port: 80
        targetPort: http
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nihao
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nihao
          tier: backend
          track: stable
      template:
        metadata:
          labels:
            app: nihao
            tier: backend
            track: stable
        spec:
          containers:
            - name: nihao
              image: "gcr.io/google-samples/hello-go-gke:1.0"
              ports:
                - name: http
                  containerPort: 80
    
    应用 YAML。
    kubectl apply -f ingress-nihao-test.yaml
    验证是否已创建 nihao 服务。
    kubectl get services
    NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    nihao        ClusterIP   10.14.21.22     <none>        80/TCP     15s
    
    验证是否已创建后端部署。
    kubectl get deployments
    NAME    READY   UP-TO-DATE   AVAILABLE   AGE
    nihao   3/3     3            3           2m25s
    
    验证后端 pod 是否存在。
    kubectl get pods
    NAME                     READY   STATUS    RESTARTS   AGE
    nihao-8646584495-9nm8x   1/1     Running   0          106s
    nihao-8646584495-vscm5   1/1     Running   0          106s
    nihao-8646584495-zcsdq   1/1     Running   0          106s
  12. 获取 Contour Ingress 控制器使用的负载均衡器的公用 IP 地址。
    kubectl get ingress
    NAME            CLASS    HOSTS   ADDRESS         PORTS   AGE
    ingress-nihao   <none>   *       10.19.14.76     80      13m
  13. 使用浏览器,导航到公用 IP,并包含 Ingress 路径。
    http://10.19.14.76/nihao
    将返回消息“hello”。
    {"message":"Hello"}

结果

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