設定多叢集服務

本文說明如何啟用及使用多叢集 Service (MCS)。使用 MCS,即可在多個 Google Kubernetes Engine (GKE) 叢集間探索及叫用 Kubernetes Service。MCS 可讓 Service 具備彈性和擴充性,協助您建構高可用性且分散於各地的應用程式。使用 MCS 匯出 Service 時,機群中的所有叢集都能使用該 Service。

本文適用於負責管理叢集和團隊網路的網路工程師。如要進一步瞭解 Google Cloud 內容中提及的常見角色和工作範例,請參閱「常見的 GKE 使用者角色和工作」。

如要進一步瞭解 MCS 的運作方式和優點,請參閱「多叢集服務」。

由 MCS 管理的Google Cloud 資源

MCS 會管理 Google Cloud的下列元件:

  • Cloud DNS:MCS 會為機群叢集中每個匯出的 Service 設定 Cloud DNS 區域和記錄。這樣一來,您就能連線至在其他叢集中執行的 Service。系統會根據您選擇在叢集間匯出的 Service,建立、讀取、更新及刪除這些區域和記錄。

  • 防火牆規則:MCS 會設定防火牆規則,讓 Pod 在機群內跨叢集互相通訊。系統會根據您新增至機群的叢集,建立、讀取、更新及刪除防火牆規則。這些規則與 GKE 建立的規則類似,可讓 GKE 叢集內的 Pod 之間進行通訊。

  • Traffic Director 控制層:MCS 使用 Traffic Director 控制層追蹤端點及其在叢集中的健康狀態。

需求條件

MCS 須符合下列規定:

  • 為確保 MCS 正常運作,GKE 會使用較高的 RBAC 權限,將 gke-mcs-importer Pod 部署至節點。這些權限可讓匯入工具管理端點、服務和 ServiceImports,以便在機群中的叢集之間傳播服務中繼資料。匯入工具沒有查看或修改部署作業的權限。

  • MCS 僅支援從 Google Cloud上的虛擬私有雲原生 GKE 叢集匯出服務。詳情請參閱「建立 VPC 原生叢集」。您無法使用非虛擬私有雲原生 GKE Standard 叢集。

  • 叢集之間的連線能力取決於叢集是否在同一個虛擬私有雲網路、對接的虛擬私有雲網路或 Shared VPC 網路中運作。如果叢集位於獨立且未連線的網路,系統會封鎖對外部服務的呼叫。建議您在叢集位於相同虛擬私有雲網路的專案中啟用 MCS。不過,機群不得包含多個共用虛擬私有雲網路的叢集。

    如要在使用 Shared VPC 的跨專案機群上設定 MCS,請按照「使用 Shared VPC 設定多叢集服務」一文的指示操作。

  • 雖然機群可能跨越多個 Google Cloud 專案和虛擬私有雲網路,但單一多叢集服務必須從單一專案和單一虛擬私有雲網路匯出。

  • MCS 不支援網路政策。

  • 叢集必須啟用 HttpLoadBalancing 外掛程式。確認已啟用 HttpLoadBalancing 外掛程式。HttpLoadBalancing 外掛程式預設為啟用,不應停用。

定價

多叢集服務包含在 GKE 叢集管理費中,不需額外付費。您必須啟用 Traffic Director API,但 MCS 不會產生任何 Cloud Service Mesh 端點費用。

事前準備

開始之前,請務必完成下列工作:

  1. 安裝 Google Cloud SDK。

  2. 啟用 Google Kubernetes Engine API:

    啟用 Google Kubernetes Engine API

  3. 使用虛擬私有雲網路對接、Cloud Interconnect 或 Cloud VPN 連線虛擬私有雲網路。

  4. 啟用 MCS、機群 (中樞)、Resource Manager、Traffic Director、Cloud DNS 和 Connect Gateway API:

    gcloud services enable \
        multiclusterservicediscovery.googleapis.com \
        gkehub.googleapis.com \
        cloudresourcemanager.googleapis.com \
        trafficdirector.googleapis.com \
        dns.googleapis.com \
        connectgateway.googleapis.com \
        --project=PROJECT_ID
    

    將 PROJECT_ID 替換為您要將叢集註冊至機群的專案 ID。

在專案中啟用 MCS

MCS 要求參與的 GKE 叢集必須註冊至同一個機群。為機群啟用 MCS 功能後,任何叢集都能在機群中的叢集之間匯出 Service。

在 GKE 叢集啟用 MCS

  1. 為專案的機群啟用 MCS 功能:

    gcloud container fleet multi-cluster-services enable \
        --project PROJECT_ID
    

    將 PROJECT_ID 替換為您要將叢集註冊至機群的專案 ID。這是您的機群主專案。

    在機群主專案中啟用多叢集服務,會建立或確保 service-PROJECT_NUMBER@gcp-sa-mcsd.iam.gserviceaccount.com 服務帳戶存在。

  2. 將 GKE 叢集註冊至機群。強烈建議您在註冊叢集時,啟用 Workload Identity Federation for GKE。如未啟用 GKE 的 Workload Identity 聯盟,則須使用 Google Cloud 服務帳戶註冊叢集,以便進行驗證,並完成「驗證服務帳戶」中的額外步驟。

    如要使用 Workload Identity Federation for GKE 註冊叢集,請執行下列指令:

    gcloud container fleet memberships register MEMBERSHIP_NAME \
       --gke-cluster CLUSTER_LOCATION/CLUSTER_NAME \
       --enable-workload-identity \
       --project PROJECT_ID
    

    更改下列內容:

    • MEMBERSHIP_NAME:您為叢集選用的成員資格名稱,在機群中不得重複。一般來說,叢集的機群成員資格名稱就是叢集名稱,但如果機群中已有其他叢集使用原始名稱,您可能需要指定新名稱。
    • CLUSTER_LOCATION:叢集所在的可用區或區域。
    • CLUSTER_NAME:叢集名稱。
  3. 授予 MCS Importer 必要的 Identity and Access Management (IAM) 權限:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/gke-mcs/sa/gke-mcs-importer" \
        --role "roles/compute.networkViewer"
    

    更改下列內容:

    • PROJECT_ID:機群主專案的專案 ID。
    • PROJECT_NUMBER:機群主專案的專案編號。
  4. 確保機群中的每個叢集都有一個命名空間,可用來共用 Service。如有需要,請使用下列指令建立命名空間:

    kubectl create ns NAMESPACE
    

    將 NAMESPACE 替換為命名空間名稱。

  5. 執行下列指令,確認 MCS 已啟用:

    gcloud container fleet multi-cluster-services describe \
        --project PROJECT_ID
    

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

    createTime: '2021-08-10T13:05:23.512044937Z'
    membershipStates:
      projects/PROJECT_ID/locations/global/memberships/MCS_NAME:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2021-08-10T13:14:45.173444870Z'
    name: projects/PROJECT_NAME/locations/global/features/multiclusterservicediscovery
    resourceState:
      state: ACTIVE
    spec: {}
    

    如果 state 的值不是 ACTIVE,請參閱疑難排解一節。

驗證服務帳戶

如果您使用服務帳戶將 GKE 叢集註冊至機群,則須採取額外步驟來驗證服務帳戶。MCS 會部署名為 gke-mcs-importer 的元件。這個元件會接收 Traffic Director 控制層的端點更新,因此在啟用 MCS 時,您必須授予服務帳戶權限,才能讀取 Cloud Service Mesh 的資訊。

使用服務帳戶時,您可以使用 Compute Engine 預設服務帳戶,或自己的節點服務帳戶:

  • 如果您使用的是 Compute Engine 預設服務帳戶,請按照下列步驟操作:

    1. 啟用下列範圍:

      • https://www.googleapis.com/auth/compute.readonly
      • https://www.googleapis.com/auth/cloud-platform

      如要進一步瞭解如何啟用範圍,請參閱「變更執行個體的服務帳戶和存取權範圍」。

    2. 將專案的 roles/compute.networkViewer 角色授予服務帳戶。如要進一步瞭解如何授予角色,請參閱「授予單一角色」。

  • 如果您使用自己的節點服務帳戶,請將專案的 roles/compute.networkViewer 角色授予服務帳戶。如要進一步瞭解如何授予角色,請參閱「授予單一角色」。

使用 MCS

以下各節將說明如何使用 MCS。MCS 使用 Kubernetes 多叢集服務 API。

註冊要匯出的 Service

如要註冊 Service,以便匯出至機群中的其他叢集,請完成下列步驟:

  1. 建立名為 export.yaml 的 ServiceExport 物件:

    # export.yaml
    kind: ServiceExport
    apiVersion: net.gke.io/v1
    metadata:
     namespace: NAMESPACE
     name: SERVICE_EXPORT_NAME
    

    更改下列內容:

    • NAMESPACE:ServiceExport 物件的命名空間。這個命名空間必須與您要匯出的 Service 命名空間相符。
    • SERVICE_EXPORT_NAME:叢集中的 Service 名稱,要匯出至機群內的其他叢集。
  2. 執行下列指令,建立 ServiceExport 資源:

    kubectl apply -f export.yaml
    

Service 的初始匯出作業約需五分鐘,才能同步至機群中註冊的叢集。匯出 Service 後,系統會立即同步後續端點。

您可以從多個叢集匯出相同的 Service,建立單一高可用性多叢集 Service 端點,並在叢集之間分配流量。匯出名稱和命名空間相同的 Service 前,請確認您希望以這種方式分組。建議您不要匯出 default 和 kube-system 命名空間中的服務,因為很有可能發生非預期的名稱衝突,並導致非預期的分組。如果您匯出超過五項名稱和命名空間相同的服務,匯入服務的流量分配可能會限制為五項匯出服務。

使用跨叢集 Service

MCS 僅支援 ClusterSetIP 和無頭 Service。僅提供 DNS「A」記錄。

建立 ServiceExport 物件後,下列網域名稱會從任何機群叢集中的任何 Pod 解析為匯出的 Service:

 SERVICE_EXPORT_NAME.NAMESPACE.svc.clusterset.local

輸出內容包含下列值:

  • SERVICE_EXPORT_NAME 和 NAMESPACE:您在 ServiceExport 物件中定義的值。

如果是 ClusterSetIP Service,網域會解析為 ClusterSetIP。如要找出這個值,請在建立 ServiceExport 物件的命名空間中,找出叢集內的 ServiceImport 物件。系統會自動建立 ServiceImport 物件。

例如:

kind: ServiceImport
apiVersion: net.gke.io/v1
metadata:
 namespace: EXPORTED-SERVICE-NAMESPACE
 name: SERVICE-EXPORT-TARGET
status:
 ports:
 - name: https
   port: 443
   protocol: TCP
   targetPort: 443
 ips: CLUSTER_SET_IP

MCS 會在將 Service 匯入叢集時,建立 EndpointSlice 物件。您可以調查這個物件,監控 Service 匯入作業的進度。

如要找出 EndpointSlice 物件的名稱,請在對應至匯入 Service 的 ServiceImport 物件上,查詢 net.gke.io/derived-service 註解的值。例如:

kind: ServiceImport
apiVersion: net.gke.io/v1
annotations: net.gke.io/derived-service: DERIVED_SERVICE_NAME
metadata:
 namespace: EXPORTED-SERVICE-NAMESPACE
 name: SERVICE-EXPORT-TARGET

接著,請查詢 EndpointSlice 物件,確認 MCS 是否已將端點傳播至匯入叢集。EndpointSlice 物件會建立在與 ServiceImport 物件相同的命名空間中,名稱則儲存在 net.gke.io/derived-service 註解中。例如:

kubectl get endpointslice -l kubernetes.io/service-name=DERIVED_SERVICE_NAME -n NAMESPACE

更改下列內容:

  • DERIVED_SERVICE_NAME:ServiceImport 物件上 net.gke.io/derived-service 註解的值。
  • NAMESPACE:ServiceExport 物件的命名空間。

如要進一步瞭解端點的健康狀態,請前往 Google Cloud 控制台,使用 Cloud Service Mesh 資訊主頁。

如果是無頭 Service,網域會解析為匯出叢集中端點的 IP 位址清單。每個具有主機名稱的後端 Pod 也可以透過下列格式的網域名稱獨立定址:

 HOSTNAME.MEMBERSHIP_NAME.LOCATION.SERVICE_EXPORT_NAME.NAMESPACE.svc.clusterset.local

輸出內容包含下列值:

  • SERVICE_EXPORT_NAME 和 NAMESPACE:您在 ServiceExport 物件中定義的值。
  • MEMBERSHIP_NAME:Pod 所在叢集的機群專屬 ID。
  • LOCATION:成員資格的位置。成員資格為 global,或其位置是 Pod 所在的區域或可用區之一,例如 us-central1。
  • HOSTNAME:Pod 的主機名稱。

您也可以使用下列格式的網域名稱,透過從註冊全域成員資格的叢集匯出的主機名稱,定址後端 Pod:

HOSTNAME.MEMBERSHIP_NAME.SERVICE_EXPORT_NAME.NAMESPACE.svc.clusterset.local

停用 MCS

如要停用 MCS,請完成下列步驟:

  1. 針對機群中的每個叢集,刪除您建立的各個 ServiceExport 物件:

    kubectl delete serviceexport SERVICE_EXPORT_NAME \
        -n NAMESPACE
    

    更改下列內容:

    • SERVICE_EXPORT_NAME:ServiceExport 物件的名稱。
    • NAMESPACE:ServiceExport 物件的命名空間。

    最多需要一小時,才能完全刪除所有ServiceExports。

  2. 如果叢集不需要基於其他目的註冊,請取消註冊叢集。

  3. 停用 multiclusterservicediscovery 功能:

    gcloud container fleet multi-cluster-services disable \
        --project PROJECT_ID
    

    將 PROJECT_ID 替換為註冊叢集的專案 ID。

    確認是否成功刪除

    停用這項功能後,系統會顯示成功訊息,確認已刪除。

    如果看到以下訊息,表示功能已停用:

    Waiting for Feature Multi-cluster Services to be deleted...done.
    

    排解刪除錯誤

    如果未在停用 MCS 前刪除所有 ServiceExport 資源,或 ServiceExports 或代管資源尚未刪除完畢,系統可能會顯示錯誤訊息。

    如果出現下列訊息,表示相關聯的資源仍存在:

    Feature has associated resources that should be cleaned up before
    deletion. Check the Feature state details for more information. This check
    can be overridden by setting force=true.
    

    如要解決這項錯誤,請檢查功能狀態:

    gcloud container fleet multi-cluster-services describe \
        --project PROJECT_ID
    

    在輸出內容中,檢查 description 欄位。可能會有兩種情況:

    1. ServiceExports不會遭到移除。

      訊息指出機群中有 ServiceExport 項資源:

      There are N ServiceExport in the Fleet.
      

      請務必刪除所有 ServiceExport 資源。在所有 ServiceExports 完全刪除前,停用 MCS 的操作會持續失敗。

      請等待一小時,然後再次執行指令:

      gcloud container fleet multi-cluster-services disable \
      --project PROJECT_ID
      
    2. 代管資源不會遭到移除。

      訊息指出系統正在移除資源:

      There are no ServiceExports in the Fleet. Managed resources are in the
      process of being removed. See
      https://docs.cloud.google.com/kubernetes-engine/docs/how-to/multi-cluster-services#troubleshoot
      for more information.
      

      MCS 後端必須完成清理程序。有時這項程序需要重新啟動,最多會延遲三小時。在所有代管資源完全刪除前,停用 MCS 的操作會持續失敗。

      請等待三小時,然後再次執行指令:

      gcloud container fleet multi-cluster-services disable \
      --project PROJECT_ID
      

    強制停用功能

    您可以強制停用 multiclusterservicediscovery 功能。

    如要強制停用這項功能,請執行下列指令:

    gcloud container fleet multi-cluster-services disable --force \
        --project PROJECT_ID
    
  4. 停用 MCS 的 API:

    gcloud services disable multiclusterservicediscovery.googleapis.com \
        --project PROJECT_ID
    

    將 PROJECT_ID 替換為註冊叢集的專案 ID。

限制

叢集、Pod 和 Service 通訊埠數量

下列限制不具強制性,在某些情況下,您可以根據叢集或專案中的負載,以及端點流失率,超過這些限制。如果超過這些限制,可能會有效能問題。

在 Kubernetes 中,Service 是由名稱和所屬命名空間唯一識別。這個名稱和命名空間組合稱為命名空間名稱。

  • 匯出叢集:單一 Service (由命名空間名稱識別) 最多可同時從 5 個叢集安全匯出。超過這個限制時,可能只有部分端點能匯入至使用叢集。您可以從不同的叢集子集匯出不同的 Service。

  • 單一 Service 後方的 Pod 數量:如果單一 Service 後方的 Pod 數量低於 250 個,就不會有問題。如果工作負載相對靜態,且多叢集 Service 數量較少,則每項 Service 的端點數量可能會大幅超過這個數字,達到數千個。與單一叢集 Service 一樣,每個節點上的 kube-proxy 都會監控所有端點。如果超過這個限制,尤其是同時從多個叢集匯出時,可能需要較大的節點。

  • 同時匯出的多叢集 Service 數量:建議您同時匯出的不重複 Service 通訊埠不超過 250 個。

    不重複的 Service 通訊埠會以命名空間名稱和通訊埠編號 (即 (名稱、命名空間、通訊埠編號) 元組) 識別。也就是說:

    • 從多個叢集匯出、具有相同命名空間名稱和通訊埠的 Service,會視為單一不重複的 Service 通訊埠。

    • 兩個 Service 的名稱和通訊埠相同,但命名空間不同,例如 (name, ns1, port-80) 和 (name, ns2, port-80) 是兩個不同的 Service 通訊埠,會計入 250 個不重複 Service 通訊埠限制中的兩個。

    • 無論機群中同時匯出這項 Service 的叢集數量為何,匯出公開兩個通訊埠 80 和 443 的 Service,會計入 250 個不重複 Service 通訊埠限制中的兩個。

    每項多叢集 Service 都會計入後端服務配額,且每個匯出叢集的各個可用區都會建立網路端點群組 (NEG)。提高這些配額不會改變不重複 Service 通訊埠總數的既定限制。

服務類型

MCS 僅支援 ClusterSetIP 和無頭服務。不支援 NodePort 和 LoadBalancer Service,可能會導致非預期的行為。

搭配 MCS 使用 IPmasq 代理

使用預設或其他非偽裝 Pod IP 範圍時,MCS 會正常運作。

如果您使用自訂 Pod IP 範圍或自訂 IPmasq 代理程式 ConfigMap,MCS 流量可能會遭到偽裝。由於防火牆規則只允許來自 Pod IP 的流量,因此 MCS 無法運作。

為避免這個問題,請使用預設 Pod IP 範圍,或在 IPmasq 代理程式 ConfigMap 的 nonMasqueradeCIDRs 欄位中指定所有 Pod IP 範圍。如果您使用 Autopilot,或必須使用非預設 Pod IP 範圍,且無法在 ConfigMap 中指定所有 Pod IP 範圍,則應使用輸出 NAT 政策設定 IP 偽裝。

在 MCS 服務中重複使用通訊埠編號

即使通訊協定不同,您也無法在同一個 MCS 服務中重複使用相同的通訊埠編號。

這項限制適用於單一 Kubernetes Service 內,以及單一 MCS Service 的所有 Kubernetes Service。

叢集位於多項專案的 MCS

如果機群中其他專案的叢集已匯出某項服務,且該服務具有相同的名稱和命名空間,則無法匯出該服務。您可以在其他專案中,存取機群內其他叢集的服務,但這些叢集無法在相同命名空間匯出相同服務。

疑難排解

以下各節提供 MCS 的疑難排解提示。

查看 MCS 功能狀態

查看功能資源的狀態,有助於確認 MCS 是否設定成功。您可以使用下列指令查看狀態:

gcloud container fleet multi-cluster-services describe

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

createTime: '2021-08-10T13:05:23.512044937Z'
membershipStates:
 projects/PROJECT_ID/locations/global/memberships/MCS_NAME:
   state:
     code: OK
     description: Firewall successfully updated
     updateTime: '2021-08-10T13:14:45.173444870Z'
name: projects/PROJECT_NAME/locations/global/features/multiclusterservicediscovery
resourceState:
 state: ACTIVE
spec: {}

其中包含 resourceState 下的整體功能狀態,以及 membershipStates 下的個別成員資格狀態等資訊。

如果您已按照「在 GKE 叢集上啟用 MCS」操作說明啟用 MCS 功能,但 resourceState.state 的值不是 ACTIVE,請與支援團隊聯絡。

每個成員資格的狀態都包含其路徑和 state 欄位。後者包含 code 和 description,有助於疑難排解。

會員狀態代碼

state.code 欄位中的代碼代表成員與 MCS 相關的一般狀態。可能的值有四種:

  • OK:會員資格已成功新增至 MCS,可供使用。

  • WARNING:MCS 正在協調成員資格設定。說明欄位可提供更多資訊,說明造成這個代碼的原因。

  • FAILED:這項會員資格未新增至 MCS。機群中其他具有 OK 程式碼的成員資格,不會受到這個 FAILED 成員資格影響。說明欄位可提供更多資訊,說明造成這個代碼的原因。

  • ERROR:這個成員資格缺少資源。機群中其他具有 OK 程式碼的成員資格不受這項 ERROR 成員資格影響。說明欄位可提供更多資訊,說明造成這個代碼的原因。

成員資格狀態說明

如要查看 MCS 中成員資格狀態的相關資訊,請檢查 state.description 欄位。這個欄位提供專案和中樞設定,以及機群和成員資格健康狀態的相關資訊。如要查看個別服務及其設定的相關資訊,請參閱 ServiceExport 物件中的 Status.Conditions 欄位,詳情請參閱「檢查 ServiceExport」一節。

state.description 欄位包含下列資訊:

  • Firewall successfully created:這則訊息表示成員的防火牆規則已成功建立和/或更新。會員代碼為 OK。

  • Firewall creation pending:這則訊息表示成員的防火牆規則待建立或更新。會員代碼為 WARNING。在防火牆規則待處理期間,這個成員資格可能會發生問題,無法更新及連線至新增的多叢集服務和成員資格。

  • GKE Cluster missing:這則訊息表示已註冊的 GKE 叢集無法使用或已刪除。會員代碼為 ERROR。刪除 GKE 叢集後,必須手動從機群取消註冊這個成員資格。

  • Project that member lives in is missing required permissions and/or has not enabled all required APIs - additional setup steps are required:這則訊息表示發生內部 StatusForbidden (403) 錯誤,且成員資格代碼為 FAILED。這項錯誤會在下列情況發生:

    • 您尚未在成員的專案中啟用必要的 API。

      如果成員叢集與機群位於不同專案,請參閱跨專案設定,確保已完成所有必要步驟。完成所有步驟後,請使用下列指令,確保註冊專案已啟用下列 API:

      gcloud services enable multiclusterservicediscovery.googleapis.com --project PROJECT_ID
      gcloud services enable dns.googleapis.com --project PROJECT_ID
      gcloud services enable trafficdirector.googleapis.com --project PROJECT_ID
      gcloud services enable cloudresourcemanager.googleapis.com --project PROJECT_ID
      

      將 PROJECT_ID 替換為註冊叢集的專案 ID。

    • mcsd 或 gkehub 服務帳戶需要成員專案中的更多權限。

      mcsd 和 gkehub 服務帳戶應已在機群主專案中自動建立,並具備所有必要權限。如要確認服務帳戶是否存在,請執行下列指令:

      gcloud projects get-iam-policy PROJECT_ID | grep gcp-sa-mcsd
      gcloud projects get-iam-policy PROJECT_ID | grep gcp-sa-gkehub
      

      將 PROJECT_ID 替換為機群主專案的專案 ID。

    這些指令會顯示 mcsd 和 gkehub 服務帳戶的全名。

  • Multiple VPCs detected in the hub - VPC must be peered with other VPCs for successful connectivity:如果託管於不同虛擬私有雲的叢集註冊至同一個機群,就會顯示這則訊息。會員狀態為OK。叢集的虛擬私有雲網路是由其 NetworkConfig 的網路定義。多叢集服務需要平面網路,且這些虛擬私有雲必須主動對等互連,多叢集服務才能正確相互連線。詳情請參閱「對接兩個網路」。

  • Member does not exist in the same project as hub - additional setup steps are required, errors may occur if not completed.:這則訊息提醒您,跨專案叢集需要額外的設定步驟。會員狀態為「OK」。跨專案成員資格是指成員叢集與機群不在同一個專案中。詳情請參閱「跨專案設定」。

  • Non-GKE clusters are currently not supported:這則訊息提醒您,MCS 僅支援 GKE 叢集。非 GKE 叢集無法新增至 MCS。會員狀態為FAILED。

檢查 ServiceExport

如要查看個別服務的狀態和潛在錯誤,請檢查該服務 ServiceExport 資源中的 Status.Conditions 欄位:

kubectl describe serviceexports PROJECT_ID -n NAMESPACE

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

Name:         SERVICE_NAME
Namespace:    NAMESPACE
Labels:       <none>
Annotations:  <none>
API Version:  net.gke.io/v1
Kind:         ServiceExport
Metadata:
  Creation Timestamp:  2024-09-06T15:57:40Z
  Finalizers:
    serviceexport.net.gke.io
  Generation:        2
  Resource Version:  856599
  UID:               8ac44d88-4c08-4b3d-8524-976efc455e4e
Status:
  Conditions:
    Last Transition Time:  2024-09-06T16:01:53Z
    Status:                True
    Type:                  Initialized
    Last Transition Time:  2024-09-06T16:02:48Z
    Status:                True
    Type:                  Exported
Events:                    <none>

當 MCS 控制器偵測到 ServiceExport 資源時,會將下列條件新增至 Status.Conditions 欄位:

  • Initialized:如果 MCS 控制器已擷取並嘗試協調 ServiceExport 代表的 Service,則為 True。

  • Exported:如果 ServiceExport 代表的服務已成功驗證,則為 True。

每個條件都包含必要的 Type、Status 和 LastTransitionTime 欄位。當 MCS 控制器協調並驗證 Service 時,對應條件的 Status 欄位會從 False 變更為 True。

錯誤

如果驗證發生錯誤,控制器會將 Exported 條件的 Status 欄位設為 False,並新增 Reason 欄位和 Message 欄位,提供更多錯誤相關資訊。Reason 欄位可包含下列其中一個值:

  • NoMatchingService:在指定叢集中,找不到與 ServiceExport 名稱和命名空間相符的 Service。
    請檢查您要匯出的 Kubernetes Service 是否位於同一個叢集。檢查兩項資源 (Service 和 ServiceExport) 的名稱和命名空間是否完全相符。

  • Conflict:已有名稱和命名空間相同的匯出 Service,但與這個 ServiceExport 匯出的 Service 不符,或是從不允許的不同網路或專案匯出,請參閱「限制」。
    請檢查 Message 欄位瞭解詳情,並視需要參閱「限制」一節。請確認 Service 和 ServiceExport 的名稱和命名空間相符,且所有資源都是在相同的網路和/或專案中建立。

  • ReadinessProbeError:在支援 Service 的 Pod 中,容器上已設定 readinessProbe。Kubernetes ReadinessProbes 會轉譯為 Google cloud HealthChecks,且必須符合相同的限制。

    注意:MCS 會使用容器 readinessProbe 設定中定義的通訊埠,做為健康狀態檢查的授權通訊埠,並傳播至 Traffic Director 控制層。MCS 會選取公開 Service targetPort 的最舊匯總 Pod 中的第一個容器,即使該容器的 readinessProbe 是在不同的通訊埠上提供服務也一樣。如果 Service targetPort 與 readinessProbe 通訊埠不同,請確認 readinessProbe 通訊埠可存取且設定正確,因為這個通訊埠會決定 Cloud Service Mesh 中 Service 的健康狀態。

    以下說明就緒檢查欄位與健康狀態檢查參數的對應關係:

    • PeriodSeconds 對應 CheckInterval
    • TimeoutSeconds 對應 Timeout
    • SuccessThreshold 對應 HealthyThreshold
    • FailureThreshold 對應 UnhealthyThreshold

    為使 ReadinessProbes 符合 HealthCheck 限制,MCS 實施下列措施:

    • PeriodSeconds 和 TimeoutSeconds 的上限為 300 秒,超過這個限制的值會觸發錯誤。
    • SuccessThreshold 和 FailureThreshold 的上限為 10 秒,超過這個限制會觸發錯誤。
    • 如果 TimeoutSeconds 大於 PeriodSeconds,系統會回報錯誤,且資源建立作業 (可能包括所有資源) 會失敗。

    這些限制是為了避免擴充性問題、後續探測重疊、健康狀態檢查/readiness 速度緩慢等。請根據上述驗證調整 readinessProbe 的參數。請務必修正機群中所有服務的這類錯誤,詳情請參閱「已知問題」。

  • ServiceError:擷取對應的服務時發生錯誤。
    這個錯誤通常與 Google Cloud 雲端基礎架構問題有關。如果問題仍未解決,請與 Google Cloud 支援團隊聯絡。

  • PodsError:擷取後端 Pod 時發生錯誤
    這個錯誤通常與 Google Cloud 雲端基礎架構問題有關。如果問題仍未解決,請與 Google Cloud 支援團隊聯絡。

  • EndpointsError:匯總無頭 Service
    的端點時發生錯誤。這類錯誤通常與 Google Cloud 雲端基礎架構問題有關。如果問題仍未解決,請與 Google Cloud 支援團隊聯絡。

Message 欄位會提供錯誤的其他背景資訊。

常見權限問題

  • 專案未啟用必要的 API。

    請務必按照「事前準備」一節的指示,啟用必要的 API。

    如果是跨專案機群,請按照「使用 Shared VPC 設定多叢集服務」中的「啟用必要 API」一節操作。

  • mcsd 或 gkehub 服務帳戶權限不足

    如果是單一專案設定,GKE Hub 和 MCS 自動建立的服務帳戶會自動取得所有必要權限。

    如果是跨專案機群,則必須建立額外的 IAM 繫結。請按照「使用 Shared VPC 設定多叢集服務」中的適當「建立 IAM 繫結」一節操作。

已知問題

在一個 MCS 服務中重複使用通訊埠編號

即使通訊協定不同,您也無法在 MCS 服務中重複使用相同的通訊埠編號。

這項限制適用於單一 Kubernetes Service,以及單一 MCS Service 的所有 Kubernetes Service。

健康狀態檢查使用預設通訊埠,而非 containerPort

部署 Service 時,如果 targetPort 欄位參照 Deployment 中的已命名通訊埠,MCS 會為健康狀態檢查設定預設通訊埠,而非指定的 containerPort。

為避免這個問題,請在「Service」欄位 ports.targetPort 和「Deployment」欄位 readinessProbe.httpGet.port 中使用數值,而非具名值。

注意:目前 MCS 只會從 Pod 的 readinessProbe 衍生匯出服務的健康狀態檢查通訊埠。

單一服務的就緒探測無效,導致其他服務中斷

檢查 ServiceExports 中說明瞭已知的潛在 readinessProbe 設定錯誤。以目前的 MCS 實作方式來說,如果單一匯出的 Service 發生這項錯誤,可能會導致機群中的部分或所有其他 Service 無法同步。

請務必確保每項 Service 的設定都正常運作。如果 MCS 服務未更新,請確認任何命名空間中任何叢集的 ServiceExport 皆未回報 ReadinessProbeError,做為狀態條件 Exported 為 False 的原因。請參閱「檢查 ServiceExports」,瞭解如何檢查條件。

後續步驟