使用外部負載平衡器公開 Ingress 閘道

總覽

透過 Cloud Service Mesh,您可以部署及管理 Ingress 閘道,做為服務網格的一部分。您可以使用外部負載平衡器 (叢集外部的實體或軟體負載平衡器),將流量傳送至 Ingress 閘道,進一步設定叢集的負載平衡。

本頁說明如何使用 Cloud Service Mesh 設定外部負載平衡器。或者,您也可以使用多個後端設定來設定 Ingress

事前準備

如要完成本文中的步驟,您需要下列資源:

  • 已安裝 Cloud Service Mesh 的 Kubernetes 叢集。

  • 外部負載平衡器,可存取叢集執行的節點。您可以使用負載平衡器的外部 IP 位址,設定這個外部負載平衡器,做為叢集 Ingress 閘道的前端。

設定環境

從可存取要使用的叢集的工作站執行下列指令。確認 kubectl 工具已設定為使用叢集專屬的叢集環境。

  1. 設定環境變數。

    export ASM_INGRESSGATEWAY_NAMESPACE=asm-ingressgateway
    export ASM_INGRESSGATEWAY_DEPLOYMENT_NAME=asm-ingressgateway
    export ASM_INGRESSGATEWAY_SERVICE_NAME=asm-ingressgateway
    export ASM_INGRESSGATEWAY_NODE_LABEL=asm-ingressgateway
    
  2. 設定外部負載平衡器的 IP address

    export EXTERNAL_LB_IP_ADDRESS=EXTERNAL_LB_IP_ADDRESS
    
  3. [\Optional/] Label the ingress gateway nodes. 這可確保閘道部署至叢集中的特定節點。

    kubectl label nodes INGRESSGATEWAY_NODE_IP ${ASM_INGRESSGATEWAY_NODE_LABEL}=
    
    • INGRESSGATEWAY_NODE_IP:是 Kubernetes 叢集中的節點,用於代管輸入閘道。針對您擁有的每個 Ingress 節點,執行這個 kubectl 指令。

建立 Ingress 閘道

完成本節中的操作說明前,請先判斷控制層實作方式。請按照「找出控制層實作項目」一文中的指示操作。

  1. 建立命名空間。這個命名空間用於部署 Ingress 閘道。

    kubectl create namespace ${ASM_INGRESSGATEWAY_NAMESPACE}
    
  1. 啟用要用於注入的命名空間。步驟取決於控制層實作方式

    代管 (TD)

    1. 將預設插入標籤套用至命名空間:
    kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
        istio.io/rev- istio-injection=enabled --overwrite
    

    受管理 (Istiod)

    建議:執行下列指令,將預設插入標籤套用至命名空間:

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio.io/rev- istio-injection=enabled --overwrite
    

    如果您是使用受管理 Istiod 控制平面的現有使用者: 建議您使用預設插入功能,但系統也支援以修訂版本為準的插入功能。請按照下列指示操作:

    1. 執行下列指令,找出可用的發布管道:

      kubectl -n istio-system get controlplanerevision
      

      輸出結果會與下列內容相似:

      NAME                AGE
      asm-managed-rapid   6d7h
      

      注意:如果上述清單中出現兩個控制層修訂版本,請移除其中一個。叢集不支援多個控制層通道。

      在輸出內容中,「NAME」欄位下方的值是與 Cloud Service Mesh 版本適用的發布管道對應的修訂版本標籤。

    2. 將修訂版本標籤套用至命名空間:

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      

    叢集內

    建議:執行下列指令,將預設插入標籤套用至命名空間:

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio.io/rev- istio-injection=enabled --overwrite
    

    建議您使用預設插入方式,但系統也支援以修訂版本為準的插入方式: 請按照下列操作說明進行:

    1. 使用下列指令找出 istiod 上的修訂版本標籤:

      kubectl get deploy -n istio-system -l app=istiod -o \
         jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. 將修訂版本標籤套用至命名空間。在下列指令中,REVISION_LABEL 是您在上一步記下的 istiod 修訂版本標籤值。

      kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \
          istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      
  2. 套用Ingress 閘道資訊清單檔案

    kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} apply --filename https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-service-mesh-samples/main/docs/ingress-gateway-external-lb/ingress-gateway.yaml
    

    預期輸出內容:

    serviceaccount/asm-ingressgateway created
    role.rbac.authorization.k8s.io/asm-ingressgateway created
    rolebinding.rbac.authorization.k8s.io/asm-ingressgateway created
    deployment.apps/asm-ingressgateway created
    service/asm-ingressgateway created
    poddisruptionbudget.policy/asm-ingressgateway created
    horizontalpodautoscaler.autoscaling/asm-ingressgateway created
    
  3. 使用外部負載平衡器 IP 位址修補 ingressgateway 服務。

    cat <<EOF > asm-external-ip-patch.yaml
    spec:
      externalIPs:
        - ${EXTERNAL_LB_IP_ADDRESS}
      loadBalancerIP: ${EXTERNAL_LB_IP_ADDRESS}
    EOF
    
    kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} patch service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --patch "$(cat asm-external-ip-patch.yaml)"
    
  4. [選用] 修補輸入閘道節點標籤親和性的 ingressgateway 部署作業。

    cat <<EOF > asm-ingress-node-label-patch.yaml
    spec:
      template:
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: ${ASM_INGRESSGATEWAY_NODE_LABEL}
                    operator: Exists
    EOF
    
    kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} patch deployment/${ASM_INGRESSGATEWAY_DEPLOYMENT_NAME} --patch "$(cat asm-ingress-node-label-patch.yaml)"
    

設定外部負載平衡器

在本節中,您將設定外部負載平衡器,以便與叢集的輸入閘道連線。

擷取 Ingress 閘道 Service 連接埠資訊

  1. 取得 NodePorts

    export HTTP_INGRESS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
    export HTTPS_INGRESS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')
    export STATUS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="status-port")].nodePort}')
    
  2. 顯示 NodePorts

    echo HTTP_INGRESS_PORT=${HTTP_INGRESS_PORT}
    echo HTTPS_INGRESS_PORT=${HTTPS_INGRESS_PORT}
    echo STATUS_PORT=${STATUS_PORT}
    

設定外部負載平衡器

使用上一步驟中顯示的 NodePorts,設定外部負載平衡器與 Ingress 閘道之間的連線。

  1. 在負載平衡器設定中設定健康狀態檢查。

    hosts:    CLUSTER_NODE_IP
    Protocol: HTTP
    Port:     STATUS_PORT
    Path:     /healthz/ready
    
    • CLUSTER_NODE_IP:是 Kubernetes 叢集中節點的 IP 位址,用於代管輸入閘道。外部負載平衡器必須能連上這個 IP 位址。您可能需要多次設定這項設定,每個叢集節點一次。

    • STATUS_PORT:是NodePort,用於公開 Ingress 閘道的健康狀態 API。您可以從上一個步驟複製這項資訊。叢集中的每個節點值都相同。

  2. 在負載平衡器中設定節點集區,以路由傳送 HTTPHTTPS 流量。針對通訊埠 80 (HTTP) 和通訊埠 443 (HTTPS) 的流量,使用下列 IP:PORT 設定。

    80  ->  CLUSTER_NODE_IP:HTTP_INGRESS_PORT
    443 ->  CLUSTER_NODE_IP:HTTPS_INGRESS_PORT
    
    • CLUSTER_NODE_IP:是 Kubernetes 叢集中節點的 IP 位址,用於代管輸入閘道。外部負載平衡器必須能連上這個 IP 位址。您可能需要多次設定這項設定,每個叢集節點一次。

    • HTTP_INGRESS_PORT:是透過此 NodePort 公開 Ingress 閘道 HTTP 流量的機制。你可以從上一個步驟複製這項資訊。叢集中的每個節點值都相同。

    • HTTPS_INGRESS_PORT:是透過 NodePort 公開 Ingress 閘道 HTTPS 流量的 NodePort。你可以從上一個步驟複製這項資訊。叢集中的每個節點值都相同。

如要驗證設定,請確認負載平衡器的健康狀態檢查是否通過。

後續步驟