準備使用 GKE Gateway API 進行設定

本文所述的設定適用於預先發布版客戶,但我們不建議新的 Cloud Service Mesh 使用者採用。詳情請參閱 Cloud Service Mesh 總覽

本指南說明如何準備環境,以便透過 Cloud Service Mesh 使用 Google Kubernetes Engine Gateway API。大致來說,您需要執行下列步驟:

  1. 啟用必要的 Google Cloud API 服務。
  2. 部署 GKE 叢集。
  3. 設定 IAM 權限。
  4. 安裝必要的自訂資源定義 (CRD)。
  5. 將叢集註冊至機群。
  6. [選用] 啟用多叢集服務 (多叢集服務探索)。
  7. 啟用服務網格。

如果您未使用 GKE,請使用服務路由 API,並建立 Mesh 資源。

事前準備

請確認部署作業的元件符合下列規定:

  • GKE 必須是 1.20 以上版本。
  • 系統僅支援xDS 第 3 版 API 以上版本。
    • 最低 Envoy 版本為 1.20.0
    • 最低 gRPC 啟動產生器版本為 v0.14.0
  • GKE 叢集必須處於虛擬私有雲原生 (別名 IP) 模式
  • 不支援在 Compute Engine 上自行管理的 Kubernetes 叢集 (與 GKE 相反)。
  • GKE Gateway 功能列出的任何額外限制,都適用於 Cloud Service Mesh 與 GKE Gateway API 的整合。
  • GKE 節點和 Pod 的服務帳戶必須具備存取 Traffic Director API 的權限。如要進一步瞭解必要權限,請參閱「啟用服務帳戶以存取 Traffic Director API」。
  • 適用於每項專案的資源用量和後端服務配額限制。

啟用必要的 Google Cloud API 服務

  1. 如果專案尚未啟用必要的 API,請執行下列指令:

    gcloud services enable --project=PROJECT_ID \
      container.googleapis.com \
      gkehub.googleapis.com \
      multiclusteringress.googleapis.com \
      trafficdirector.googleapis.com \
      networkservices.googleapis.com
    
  2. 如要在車隊中納入多個叢集,請啟用 multiclusterservicediscovery API:

    gcloud services enable --project=PROJECT_ID \
       multiclusterservicediscovery.googleapis.com
    

部署 GKE 叢集

請按照這些操作說明部署 GKE 叢集。

  1. us-west1-a 區域中建立名為 gke-1 的 GKE 叢集:

    gcloud container clusters create gke-1 \
      --zone=us-west1-a \
      --enable-ip-alias \
      --workload-pool=PROJECT_ID.svc.id.goog \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --enable-mesh-certificates \
      --release-channel=regular \
      --project=PROJECT_ID
    
    • --enable-ip-alias:這個旗標會建立虛擬私有雲原生叢集,並讓 Pod 的 IP 位址可在虛擬私有雲網路中轉送。
    • --workload-pool:這個旗標可讓叢集加入專案的工作負載身分集區。
    • --scopes:這個標記會指定指派給叢集節點的 OAuth 範圍。
    • --release-channel:這個旗標會指定 regular 管道。
    • --enable-mesh-certificates:如果 Cloud Service Mesh 的自動 mTLS 功能日後可能推出,這個標記就會啟用該功能。
  2. 取得叢集憑證:

    gcloud container clusters get-credentials gke-1 --zone=us-west1-a
    
  3. 重新命名叢集環境:

    kubectl config rename-context gke_PROJECT_ID_us-west1-a_gke-1 gke-1
    

設定資料層的 IAM 權限

在本示範部署作業中,您會將 Cloud Service Mesh 用戶端角色 roles/trafficdirector.client 授予 GKE 叢集中的所有服務帳戶和經過驗證的使用者。您必須具備這個 IAM 角色,才能授權資料層中的 Cloud Service Mesh 用戶端 (例如 Envoy) 從 Cloud Service Mesh 接收設定。

如果您不想將用戶端角色授予所有已驗證的使用者,而是偏好將角色限制在服務帳戶,請參閱 GKE Workload Identity 指南,為服務設定具有 roles/trafficdirector.client 角色的專用 Kubernetes 服務帳戶。

  1. client 角色指派給服務帳戶:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "group:PROJECT_ID.svc.id.goog:/allAuthenticatedUsers/" \
      --role "roles/trafficdirector.client"
    

安裝必要的自訂資源定義

  1. 安裝使用 Gateway API 和 Cloud Service Mesh 時所需的自訂資源定義 (CRD):

    kubectl apply -k "github.com/kubernetes-sigs/gateway-api/config/crd/experimental?ref=v0.6.0"
    
    kubectl kustomize "https://github.com/GoogleCloudPlatform/gke-networking-recipes.git/gateway-api/config/mesh/crd" \
    | kubectl apply -f -
    
  2. 執行下列指令,確認叢集是否已自動安裝必要 CRD:

    kubectl get crds
    

    輸出內容會列出下列 CRD 和其他與 Gateway API 無關的 CRD,且建立日期各不相同:

    NAME                                             CREATED AT
    gatewayclasses.gateway.networking.k8s.io                           2023-08-08T05:29:03Z
    gateways.gateway.networking.k8s.io                                 2023-08-08T05:29:03Z
    grpcroutes.gateway.networking.k8s.io                               2023-08-08T05:29:03Z
    httproutes.gateway.networking.k8s.io                               2023-08-08T05:29:03Z
    referencegrants.gateway.networking.k8s.io                          2023-08-08T05:29:04Z
    tcproutes.gateway.networking.k8s.io                                2023-08-08T05:29:04Z
    tdgrpcroutes.net.gke.io                                            2023-08-08T05:29:23Z
    tdmeshes.net.gke.io                                                2023-08-08T05:29:23Z
    tlsroutes.gateway.networking.k8s.io                                2023-08-08T05:29:05Z
    udproutes.gateway.networking.k8s.io                                2023-08-08T05:29:05Z
    

自訂資源 tdmeshes.net.gke.iotdgrpcroutes.net.gke.io 已在先前的步驟中安裝。

net.gke.io API 群組的 CRD 專屬於 GKE。這些資源不屬於 OSS Gateway API 實作,而是位於 networking.k8s.io API 群組。

向機群註冊叢集

成功建立叢集後,您必須向機群註冊叢集。將叢集註冊至機群後,您就能在註冊的叢集上選擇性啟用功能。

  1. 向機群註冊叢集:

    gcloud container hub memberships register gke-1 \
      --gke-cluster us-west1-a/gke-1 \
      --location global \
      --project=PROJECT_ID
    
  2. 確認叢集已向機群註冊:

    gcloud container hub memberships list --project=PROJECT_ID
    

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

    NAME   EXTERNAL_ID
    gke-1  657e835d-3b6b-4bc5-9283-99d2da8c2e1b
    

(選用) 啟用多叢集服務探索功能

透過多叢集服務探索功能,您可以將叢集本機服務匯出至註冊到機群的所有叢集。如果您不打算在機群中加入多個叢集,這個步驟為選用。

  1. 啟用多叢集服務探索功能:

    gcloud container hub multi-cluster-services enable \
      --project PROJECT_ID
    
  2. 授予 Multi-Cluster Service Discovery 所需的 Identity and Access Management (IAM) 角色:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-mcs/gke-mcs-importer]" \
      --role "roles/compute.networkViewer"
    
  3. 確認已為註冊的叢集啟用多叢集服務探索。系統可能需要幾分鐘的時間才會顯示所有叢集:

    gcloud container hub multi-cluster-services describe --project=PROJECT_ID
    

    您應該會看到 gke-1 的成員資格,類似於下列內容:

    createTime: '2021-04-02T19:34:57.832055223Z'
    membershipStates
      projects/PROJECT_NUM/locations/global/memberships/gke-1:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2021-05-27T11:03:07.770208064Z'
    name: projects/PROJECT_NUM/locations/global/features/multiclusterservicediscovery
    resourceState:
      state: ACTIVE
    spec: {}
    updateTime: '2021-04-02T19:34:58.983512446Z'
    

啟用 Cloud Service Mesh GKE 服務網格

在本節中,您將啟用服務網格。

  1. 在向機群註冊的叢集上啟用 Cloud Service Mesh GKE 服務網格:

    gcloud container hub ingress enable \
    --config-membership=projects/PROJECT_ID/locations/global/memberships/gke-1 \
      --project=PROJECT_ID
    
  2. 確認這項功能已啟用:

    gcloud container hub ingress describe --project=PROJECT_ID
    

    輸出結果應該會類似下列內容:

    createTime: '2021-05-26T13:27:37.460383111Z'
    membershipStates:
      projects/PROJECT_NUM/locations/global/memberships/gke-1:
        state:
          code: OK
          updateTime: '2021-05-27T15:08:19.397896080Z'
    resourceState:
     state: ACTIVE
    spec:
      multiclusteringress:
        configMembership: projects/PROJECT_ID/locations/global/memberships/gke-1
    state:
      state:
        code: OK
        description: Ready to use
        updateTime: '2021-05-26T13:27:37.899549111Z'
    updateTime: '2021-05-27T15:08:19.397895711Z'
    
  3. 授予下列 Identity and Access Management (IAM) 角色,這是 Gateway API 控制器所需的角色:

    export PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format="value (projectNumber)")
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-multiclusteringress.iam.gserviceaccount.com" \
      --role "roles/container.developer"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member "serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-multiclusteringress.iam.gserviceaccount.com" \
      --role "roles/compute.networkAdmin"
    

後續步驟

如要設定範例部署作業,請參閱下列指南: