Kubernetes 入口資源可提供從叢集外部到叢集中一或多個服務的 HTTP 或 HTTPS 路由。TKG 叢集透過第三方控制器 (例如 Contour) 支援入口。

此教學課程說明如何部署將外部流量路由至 TKG 叢集中服務的 Contour 入口控制器。Contour 是 VMware 參與的開放原始碼專案。

必要條件

  • 請檢閱 Kubernetes 說明文件中的入口資源。
  • 檢閱 Contour 入口控制器。
  • 佈建 TKG 叢集。
  • 連線至 TKG 叢集。

程序

  1. 建立 ClusterRoleBinding,以允許服務帳戶管理叢集的所有資源。
    kubectl create clusterrolebinding default-tkg-admin-privileged-binding 
    --clusterrole=psp:vmware-system-privileged --group=system:authenticated
    備註: 如果需要更嚴格的安全性,請在 projectcontour 命名空間上使用 RoleBinding。請參閱 將預設網繭安全性原則套用至 TKG 服務叢集
  2. 建立名為 projectcontour 的命名空間。
    這是 Contour 入口控制器部署的預設命名空間。
    kubectl create ns projectcontour
  3. 下載最新的 Contour 入口控制器 YAML:Contour 入口部署
  4. 使用文字編輯器開啟 contour.yaml 檔案。
  5. 透過在每行前面加上 # 符號,註解以下兩行標記:
    第 1632 行:
    # service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
    
    第 1634 行:
    # externalTrafficPolicy: Local
    
  6. 透過套用 contour.yaml 檔案來部署 Contour。
    kubectl apply -f contour.yaml
  7. 確認 Contour 入口控制器和 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 和 Envoy 網繭正在執行。
    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 的入口資源。
    建立 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
    確認入口資源是否已建立。
    kubectl get ingress
    Envoy LoadBalancer 的外部 IP 位址 (在此範例中為 192.168.123.5) 由入口物件使用。
    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
    
    確認後端網繭是否存在。
    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 入口控制器所使用的負載平衡器的公用 IP 位址。
    kubectl get ingress
    NAME            CLASS    HOSTS   ADDRESS         PORTS   AGE
    ingress-nihao   <none>   *       10.19.14.76     80      13m
  13. 使用瀏覽器,導覽至公用 IP,並包含入口路徑。
    http://10.19.14.76/nihao
    隨即傳回訊息「hello」。
    {"message":"Hello"}

結果

瀏覽器使用負載平衡器的外部 IP 位址透過入口控制器從外部存取由叢集內執行的服務所面向的後端應用程式。