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

本教學課程說明如何部署以 NGINX 為基礎的 Kubernetes 入口服務,用於將外部流量路由至 Tanzu Kubernetes 叢集中的服務。入口服務需要入口控制器。我們將使用 Helm 安裝 NGINX 入口控制器。Helm 是 Kubernetes 的套件管理程式。

備註: 有多種方式可完成此工作。此處的步驟提供了一種方法。在指定的環境中,其他方法可能更適合。

必要條件

  • 請檢閱 Kubernetes 說明文件中的入口資源。
  • 檢閱 Nginx 入口控制器說明文件。
  • 佈建 TKG 叢集。
  • 如有必要,請啟用網繭安全性原則。
  • 連線至 TKG 叢集。

程序

  1. 透過參考說明文件安裝 Helm。
  2. 使用 Helm 安裝 NGINX 入口控制器。
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm install ingress-nginx ingress-nginx/ingress-nginx
  3. 確認 Nginx 入口控制器是否已部署為 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 入口控制器是否正在執行。
    kubectl get pods
    NAME                                        READY   STATUS    RESTARTS   AGE
    ingress-nginx-controller-7c6c46898c-v6blt   1/1     Running   0          76m
  6. 使用入口規則和路徑建立名為 ingress-hello.yaml 的入口資源。
    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. 確認入口資源是否已部署。
    請注意,IP 位址將對應至入口控制器的外部 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 入口控制器所使用的負載平衡器的公用 IP 位址。
    kubectl get ingress
    NAME            CLASS    HOSTS   ADDRESS         PORTS   AGE
    ingress-hello   <none>   *       10.19.14.76     80      13m
  13. 使用瀏覽器,導覽至公用 IP,並包含入口路徑。
    http://10.19.14.76/hello
    隨即傳回訊息「hello」。
    {"message":"Hello"}

結果

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