準備使用 GKE Gateway API 進行設定

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

本指南說明如何為使用 Google Kubernetes Engine Gateway API 搭配 Cloud Service Mesh 做好環境準備。整體來說,您需要執行下列步驟:

  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 上的閘道功能列出的任何其他限制,都適用於 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 工作負載身分指南,為服務設定專用的 Kubernetes 服務帳戶,並為該帳戶指派 roles/trafficdirector.client 角色。

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

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

安裝必要的自訂資源定義

  1. 安裝在 Cloud Service Mesh 中使用 Gateway API 所需的自訂資源定義 (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,所有 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. 授予多叢集服務探索所需的 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. 授予 Gateway API 控制器所需的以下 Identity and Access Management (IAM) 角色:

    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"
    

後續步驟

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