設定多叢集服務


本頁面說明如何啟用及使用多叢集服務 (MCS)。如要進一步瞭解 MCS 的運作方式和優點,請參閱「多叢集服務」。

Google Kubernetes Engine (GKE) MCS 功能可將 Kubernetes Service 的觸及範圍擴展至叢集邊界之外,讓您在多個 GKE 叢集中探索及叫用 Service。您可以匯出部分現有服務或新服務。

使用 MCS 匯出 Service 後,該 Service 就能在機群中的所有叢集使用。

本頁說明如何使用單一專案設定 MCS。如要設定多專案共用虛擬私有雲,請按照這篇文章的說明,使用共用虛擬私有雲設定多叢集服務。

Google Cloud 由 MCS 管理的資源

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

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

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

  • Cloud Service Mesh:MCS 使用 Cloud Service Mesh 做為控制層,追蹤叢集中的端點及其健康狀態。

需求條件

MCS 必須符合下列條件:

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

  • 叢集間的連線能力取決於叢集是否在相同虛擬私有雲網路、對等互連或共用虛擬私有雲網路中執行。如果叢集位於不相連的個別網路中,系統會封鎖對外部服務的呼叫。如果叢集位於相同的 VPC 網路,建議您在專案中啟用 MCS。

    如要在使用共用虛擬私有雲的跨專案車隊中設定 MCS,請按照「使用共用虛擬私有雲設定多叢集服務」一文的說明操作。

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

  • MCS 不支援網路政策

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

定價

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

事前準備

開始之前,請確認你已完成下列工作:

  1. 安裝 Google Cloud SDK

  2. 啟用 Google Kubernetes Engine API:

    啟用 Google Kubernetes Engine API

  3. 使用 VPC 網路對等互連Cloud InterconnectCloud VPN 連線至 VPC 網路。

  4. 啟用 MCS、車隊 (中樞)、Resource Manager、Cloud Service Mesh 和 Cloud DNS API:

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

    PROJECT_ID 替換為專案 ID,您打算在該專案中將叢集註冊至 Fleet。

在專案中啟用 MCS

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

MCS 雖然需要向機群註冊,但不需要啟用 GKE Enterprise 平台。

GKE Enterprise

如果機群主機專案已啟用 GKE Enterprise API,做為使用其他 GKE Enterprise 元件的先決條件,則向專案機群註冊的任何叢集,都會根據 GKE Enterprise 定價收費。採用這種計價模式後,您就能以單一 vCPU 費用,在已註冊的叢集上使用所有 GKE Enterprise 功能。您可以使用下列指令,確認是否已啟用 GKE Enterprise API:

gcloud services list --project=PROJECT_ID | grep anthos.googleapis.com

如果輸出內容類似於下列內容,表示已啟用完整 GKE Enterprise 平台,且註冊至機群的任何叢集都會產生 GKE Enterprise 費用:

anthos.googleapis.com                        Anthos API

如果這不是您希望的結果,請與專案管理員聯絡。

如果輸出內容為空白,表示 GKE Enterprise 未啟用。

在 GKE 叢集上啟用 MCS

  1. 為專案的車隊啟用 MCS 功能:

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

    PROJECT_ID 替換為專案 ID,您打算將叢集從該專案註冊至 Fleet。這是您的機群主專案

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

  2. 將 GKE 叢集註冊至機群。 強烈建議您註冊叢集時啟用 Workload Identity Federation for GKE。如果未啟用 GKE 的 Workload Identity Federation,您需要使用 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. 確認機群中的每個叢集都有命名空間,可共用服務。如有需要,請使用下列指令建立命名空間:

    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 的元件。這個元件會接收 Cloud Service Mesh 的端點更新,因此啟用 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,以便匯出至機群中的其他叢集,請完成下列步驟:

  1. 建立名為 export.yamlServiceExport 物件:

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

    更改下列內容:

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

    kubectl apply -f export.yaml
    

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

您可以從多個叢集匯出相同的 Service,建立單一高可用性多叢集服務端點,並在叢集之間分配流量。匯出名稱和命名空間相同的服務前,請確認您要以這種方式分組。我們不建議您匯出 defaultkube-system 命名空間中的服務,因為這樣很可能導致名稱衝突,進而造成非預期的分組。如果匯出超過五個同名和同命名空間的服務,匯入服務的流量分配可能僅限於五個匯出服務。

使用跨叢集服務

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

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

 SERVICE_EXPORT_NAME.NAMESPACE.svc.clusterset.local

輸出內容包含下列值:

  • SERVICE_EXPORT_NAMENAMESPACE:您在 ServiceExport 物件中定義的值。

如果是 ClusterSetIP 服務,網域會解析為 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 匯入叢集時建立 Endpoints 物件。您可以透過調查這個物件,監控服務匯入進度。如要找出 Endpoints 物件的名稱,請在與匯入的服務對應的 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

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

kubectl get endpoints DERIVED_SERVICE_NAME -n NAMESPACE

更改下列內容:

  • DERIVED_SERVICE_NAMEServiceImport 物件上註解 net.gke.io/derived-service 的值。
  • NAMESPACEServiceExport 物件的命名空間。

您可以在 Google Cloud 控制台使用 Cloud Service Mesh 資訊主頁,進一步瞭解端點的健康狀態。

對於無標頭服務,網域會解析為匯出叢集中端點的 IP 位址清單。每個具有主機名稱的後端 Pod 也可獨立定址,網域名稱格式如下:

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

輸出內容包含下列值:

  • SERVICE_EXPORT_NAMENAMESPACE:您在 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 物件的名稱。
    • NAMESPACEServiceExport 物件的命名空間。
  2. 確認 ServiceExport 在 30 分鐘後從清單中消失。

  3. 如果叢集不需要註冊以用於其他用途,請取消註冊機群叢集

  4. 停用 multiclusterservicediscovery 功能:

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

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

  5. 停用 MCS 的 API:

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

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

限制

叢集、Pod 和 Service 連接埠數量

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

在 Kubernetes 中,服務會依據名稱和所屬命名空間進行唯一識別。這個名稱和命名空間配對稱為命名空間名稱。

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

  • 單一 Service 背後的 Pod 數:如果單一 Service 背後的 Pod 數保持在 250 個以下,那就是安全的。如果工作負載相對靜態,且多叢集服務數量不多,每個服務的端點數量可能大幅超過這個數字,達到數千個。與單一叢集服務相同,每個節點上的 kube-proxy 都會監控所有端點。如果超過這個限制,尤其是同時從多個叢集匯出時,可能需要較大的節點。

  • 同時匯出的多叢集服務數量:建議您同時匯出不超過 250 個不重複的服務連接埠

    專屬 Service 通訊埠是由命名空間名稱和通訊埠號碼所識別,也就是 (名稱、命名空間、通訊埠號碼) 元組。也就是說:

    • 從多個叢集匯出的服務,如果具有相同的命名空間名稱和通訊埠,則會計為單一不重複的服務通訊埠。

    • 舉例來說,如果兩個 Service 的名稱和通訊埠相同,但命名空間不同,例如 (name、ns1、port-80) 和 (name、ns2、port-80),則這兩個 Service 通訊埠會視為不同,並計入 250 個不重複 Service 通訊埠的限制。

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

    每個多叢集服務都會計入後端服務配額,且每個匯出叢集的可用區都會建立網路端點群組 (NEG)。提高這些配額不會改變唯一服務連接埠總數的上限。

服務類型

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

搭配 MCS 使用 IPmasq 代理程式

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

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

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

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

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

這適用於單一 Kubernetes 服務內,以及單一 MCS 服務的所有 Kubernetes 服務。

MCS,叢集位於多個專案中

如果車隊中其他專案的叢集已匯出名稱和命名空間相同的服務,您就無法匯出該服務。您可以在其他專案的機群中存取其他叢集中的服務,但這些叢集無法在同一個命名空間中匯出相同服務。

疑難排解

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

查看 MCS 功能狀態

查看 Feature 資源的狀態,有助於確認 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 欄位。後者包含 codedescription,有助於排解問題。

會員狀態代碼

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。

      如果成員叢集與 Fleet 位於不同專案,請參閱跨專案設定,確保已完成所有必要步驟。完成所有步驟後,請使用下列指令,確保註冊專案已啟用下列 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。

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

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

      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。

    這些指令應會顯示 mcsdgkehub 服務帳戶的全名。

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

  • 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 代表的服務,則為 True。

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

每個條件都包含必要欄位 TypeStatusLastTransitionTime。MCS 控制器會協調及驗證服務,因此對應條件的 Status 欄位會從 False 變更為 True

錯誤

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

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

  • Conflict:已存在名稱和命名空間相同的匯出服務,但與這個 ServiceExport 匯出的服務不符,或是從其他網路或專案匯出 (不允許這麼做,請參閱「限制」)。
    檢查 Message 欄位中的詳細資料,並視需要參閱「限制」一節。請確認 ServiceServiceExport 的名稱和命名空間彼此相符,且所有資源都是在相同網路和/或專案中建立。

  • ReadinessProbeError: 在支援服務的 Pod 中,容器上已設定 readinessProbeKubernetes ReadinessProbes 會轉換為 Google cloud HealthChecks,且必須 遵守相同的限制。

    完備性檢查欄位與健康狀態檢查參數的對應方式如下:

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

    為配合 HealthCheck 限制,MCS 實作了下列項目:ReadinessProbes

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

    這些限制是為了避免發生延展性問題、後續探測重疊、健康狀態檢查/就緒緩慢等情況。請根據上述驗證調整 readinessProbe 的參數。請務必修正車隊中每個服務的這類錯誤,詳情請參閱「已知問題」。

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

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

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

Message 欄位提供錯誤的額外背景資訊。

常見權限問題

  • 專案中未啟用必要的 API。

    請按照「開始前」一節的說明,確認已啟用必要的 API。

    如果是跨專案的車隊,請按照「使用共用虛擬私有雲設定多叢集服務」一文中的「啟用必要 API」一節操作。

  • mcsdgkehub 服務帳戶的權限不足

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

    如果是跨專案的車隊,您必須建立額外的 IAM 繫結。請按照「使用共用虛擬私有雲設定多叢集服務」中的「建立 IAM 繫結」一節操作。

已知問題

使用多個通訊埠的 MCS 服務

在 GKE Dataplane V2 上,如果多叢集服務有多個 (TCP/UDP) 連接埠,就會發生已知問題,導致部分端點未在資料平面中進行程式設計。這個問題會影響 1.26.3-gke.400 之前的 GKE 版本。

如要解決這個問題,使用 GKE Dataplane V2 時,請使用多個 MCS,並搭配單一連接埠,而非使用一個 MCS 並搭配多個連接埠。

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

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

這適用於單一 Kubernetes 服務內,以及單一 MCS 服務的所有 Kubernetes 服務。

使用共用虛擬私有雲的 MCS

在目前的 MCS 實作項目中,如果您在同一個共用 VPC 中部署多個車隊,中繼資料會在車隊之間共用。在一個車隊中建立服務時,系統會匯出或匯入所有其他車隊的服務中繼資料,這些車隊屬於同一個共用虛擬私有雲,且使用者可見。

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

在 Deployment 中部署參照具名通訊埠的 Service 時,MCS 會為健康狀態檢查設定預設通訊埠,而非指定的 containerPorttargetPort

為避免發生這個問題,請在「服務」欄位 ports.targetPort 和「部署」欄位 readinessProbe.httpGet.port 中使用數值,而非具名值。

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

如「檢查 ServiceExports」一節所述,目前已知可能發生readinessProbe設定錯誤。在目前的 MCS 實作中,如果單一匯出的服務發生這個錯誤,可能會導致機群中部分或所有其他服務無法同步。

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

後續步驟