多叢集 Ingress 的疑難排解與作業

多叢集 Ingress 或其基礎 Compute Engine 資源設定錯誤,可能會導致多叢集負載平衡問題,例如流量轉送錯誤、缺少虛擬 IP 位址 (VIP),或 502 服務錯誤。

請參閱本文,瞭解如何檢查 Compute Engine 負載平衡器資源、診斷 VIP 和 502 錯誤、管理設定叢集遷移作業,以及找出常見的錯誤代碼。

如果您是平台管理員和運算子,負責管理多個 Google Kubernetes Engine (GKE) 叢集的 Multi Cluster Ingress,請務必詳閱本文資訊。如要進一步瞭解我們在Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。

瞭解多叢集 Ingress 資源對應

GKE Enterprise Ingress 控制器會管理 Compute Engine 資源。MultiClusterIngressMultiClusterService 資源會對應至不同的 Compute Engine 資源,因此瞭解這些資源之間的關係有助於排解問題。舉例來說,請檢查下列 MultiClusterIngress 資源:

apiVersion: extensions/v1beta1
kind: MultiClusterIngress
metadata:
  name: foo-ingress
spec:
  template:
    spec:
      rules:
      - host: store.foo.com
        http:
          paths:
          - backend:
              serviceName: store-foo
              servicePort: 80
      - host: search.foo.com
        http:
          paths:
          - backend:
              serviceName: search-foo
              servicePort: 80

Compute Engine 對應至多叢集 Ingress 資源

下表顯示車隊資源與 Kubernetes 叢集和 Google Cloud中建立的資源之間的對應關係:

Kubernetes 資源 Google Cloud 資源 說明
MultiClusterIngress 轉送規則 HTTP(S) 負載平衡器 VIP。
目標 Proxy 從註解和 TLS 區塊取得的 HTTP/S 終止設定。
網址對應 規則區段中的虛擬主機路徑對應。
MultiClusterService Kubernetes 服務 從範本衍生的資源。
後端服務 系統會為每對 (Service、ServicePort) 建立後端服務。
網路端點群組 參與服務的後端 Pod 組合。

檢查 Compute Engine 負載平衡器資源

建立負載平衡器後,Multi Cluster Ingress 狀態會包含為建構負載平衡器而建立的每個 Compute Engine 資源名稱。例如:

Name:         shopping-service
Namespace:    prod
Labels:       <none>
Annotations:  <none>
API Version:  networking.gke.io/v1beta1
Kind:         MultiClusterIngress
Metadata:
  Creation Timestamp:  2019-07-16T17:23:14Z
  Finalizers:
    mci.finalizer.networking.gke.io
Spec:
  Template:
    Spec:
      Backend:
        Service Name:  shopping-service
        Service Port:  80
Status:
  VIP:  34.102.212.68
  CloudResources:
    Firewalls: "mci-l7"
    ForwardingRules: "mci-abcdef-myforwardingrule"
    TargetProxies: "mci-abcdef-mytargetproxy"
    UrlMap: "mci-abcdef-myurlmap"
    HealthChecks: "mci-abcdef-80-myhealthcheck"
    BackendServices: "mci-abcdef-80-mybackendservice"
    NetworkEndpointGroups: "k8s1-neg1", "k8s1-neg2", "k8s1-neg3"

無法建立 VIP

如果沒有看到 VIP,表示建立時可能發生錯誤。 如要查看是否發生錯誤,請執行下列指令:

kubectl describe mci shopping-service

輸出內容可能如下所示:

Name:         shopping-service
Namespace:    prod
Labels:       <none>
Annotations:  <none>
API Version:  networking.gke.io/v1beta1
Kind:         MultiClusterIngress
Metadata:
  Creation Timestamp:  2019-07-16T17:23:14Z
  Finalizers:
    mci.finalizer.networking.gke.io
Spec:
  Template:
    Spec:
      Backend:
        Service Name:  shopping-service
        Service Port:  80
Status:
  VIP:  34.102.212.68
Events:
  Type     Reason  Age   From                              Message
  ----     ------  ----  ----                              -------
  Warning  SYNC    29s   multi-cluster-ingress-controller  error translating MCI prod/shopping-service: exceeded 4 retries with final error: error translating MCI prod/shopping-service: multiclusterservice prod/shopping-service does not exist

在本例中,錯誤是使用者未建立 MultiClusterIngress 參照的 MultiClusterService 資源。

502 回應

如果負載平衡器已取得 VIP,但持續提供 502 回應,可能是負載平衡器健康狀態檢查失敗。健康狀態檢查失敗的原因有兩種:

  1. 應用程式 Pod 狀況不佳 (請參閱Cloud 控制台偵錯範例)。
  2. 防火牆設定錯誤,導致 Google 健康狀態檢查程式無法執行健康狀態檢查。

如果是第 1 種情況,請確認應用程式確實在「/」路徑上提供 200 回應。

如果是第 2 種情況,請確認虛擬私有雲中有名為「mci-default-l7」的防火牆。Ingress 控制器會在虛擬私有雲中建立防火牆,確保 Google 健康狀態檢查程式可以連上後端。如果防火牆不存在,請確認沒有外部自動化程序會在防火牆建立後刪除。

流量未新增至叢集或從叢集移除

新增成員時,流量應會抵達基礎叢集中的後端 (如適用)。同樣地,如果移除成員資格,任何流量都不應抵達基礎叢集中的後端。如果沒有觀察到這種行為,請檢查 MultiClusterIngressMultiClusterService 資源是否有錯誤。

如果 GKE 叢集不在 VPC 原生模式中新增成員資格,或是新增成員資格但未在 GKE 叢集中部署應用程式,就可能發生這項錯誤。

  1. 說明MultiClusterService

    kubectl describe mcs zone-svc
    
  2. 說明MultiClusterIngress

    kubectl describe mci zone-mci
    

設定叢集遷移作業

如要進一步瞭解遷移作業的用途,請參閱「設定叢集設計概念」。

如果處理不當,設定叢集遷移作業可能會造成中斷。執行設定叢集遷移作業時,請遵循下列準則:

  1. 請務必在 MultiClusterIngress 資源上使用靜態 IP 註解。否則在遷移期間,流量會中斷。遷移設定叢集時,系統會重新建立臨時 IP。
  2. MultiClusterIngressMultiClusterService 資源的部署方式必須與現有和新的設定叢集完全相同。兩者之間的差異會導致新設定叢集中不同的 MultiClusterServiceMultiClusterIngress 資源進行協調。
  3. 任何時間都只能啟用單一設定叢集。在變更設定叢集之前,新設定叢集中的 MultiClusterIngressMultiClusterService 資源不會影響負載平衡器資源。

如要遷移設定叢集,請執行下列指令:

  gcloud container fleet ingress update \
    --config-membership=projects/project_id/locations/global/memberships/new_config_cluster

確認指令是否正常運作,方法是檢查「Feature state:」中是否沒有明顯錯誤:

  gcloud container fleet ingress describe

控制台偵錯

在大多數情況下,檢查負載平衡器的確切狀態有助於偵錯。如要尋找負載平衡器,請前往 Google Cloud 控制台的「Load balancing」(負載平衡)

錯誤/警告代碼

多叢集 Ingress 會在 MultiClusterIngressMultiClusterService 資源以及 gcloud multiclusteringress「Description」欄位中,針對已知問題發出錯誤和警告代碼。這些訊息會記錄錯誤和警告代碼,方便您瞭解某個項目未如預期運作時的意義。每個代碼都包含採用 AVMBR123 格式的錯誤 ID,其中 123 是對應錯誤或警告的專屬編號,以及解決方法建議。

AVMBR101:Annotation [NAME] not recognized

如果 MultiClusterIngressMultiClusterService 資訊清單中指定的註解無法辨識,就會顯示這項錯誤。註解無法辨識的原因有以下幾種:

  1. 多叢集 Ingress 不支援註解。如果註解的資源不應由 GKE Enterprise Ingress 控制器使用,這可能是預期行為。

  2. 系統支援註解,但註解拼字錯誤,因此無法辨識。

在上述兩種情況下,請參閱說明文件,瞭解支援的註解和指定方式。

AVMBR102:[RESOURCE_NAME] not found

如果在 MultiClusterIngress 中指定補充資源,但系統在 Config Membership 中找不到該資源,就會顯示這項錯誤。舉例來說,如果 MultiClusterIngress 參照的 MultiClusterService 不存在,或是 MultiClusterService 參照的 BackendConfig 不存在,就會擲回這個錯誤。找不到資源的原因有以下幾種:

  1. 不在適當的命名空間中。請確保相互參照的資源都位於相同命名空間。
  2. 資源名稱拼寫錯誤。
  3. 資源確實不存在,且命名空間 + 名稱正確無誤。如果是這種情況,請建立該項目。

AVMBR103:[CLUSTER_SELECTOR] is invalid

如果 MultiClusterService 中指定的叢集選取器無效,就會顯示這項錯誤。這個選取器可能無效的原因有以下幾種:

  1. 提供的字串含有錯字。
  2. 提供的字串參照的叢集成員資格已不存在於機群中。

AVMBR104:Cannot find NEGs for Service Port [SERVICE_PORT]

如果找不到特定 MultiClusterService 和服務通訊埠配對的 NetworkEndpointGroup (NEG),就會擲回這個錯誤。NEG 是包含每個後端叢集 Pod 端點的資源。NEGs 可能不存在的主要原因是,後端叢集中的衍生服務在建立或更新時發生錯誤。如需更多資訊,請查看MultiClusterService資源中的「活動」。

AVMBR105:Missing GKE Enterprise license.

這項錯誤會顯示在「功能狀態」下方,表示 GKE Enterprise API (anthos.googleapis.com) 未啟用。

AVMBR106:Derived service is invalid: [REASON].

這項錯誤會顯示在 MultiClusterService 資源的事件下方。造成這項錯誤的常見原因之一,是從 MultiClusterService 衍生而來的 Service 資源規格無效。

舉例來說,這個 MultiClusterService 的規格中未定義任何 ServicePort

apiVersion: networking.gke.io/v1
kind: MultiClusterService
metadata:
  name: zone-mcs
  namespace: whereami
spec:
  clusters:
  - link: "us-central1-a/gke-us"
  - link: "europe-west1-c/gke-eu"

這項錯誤會顯示在「功能狀態」下方,發生原因是因為 Membership 資源沒有基礎 GKE 叢集。您可以執行下列指令來驗證這項設定:

gcloud container fleet memberships describe membership-name

並確保端點欄位下方沒有 GKE 叢集資源連結。

AVMBR108:GKE cluster [NAME] not found.

如果成員資格的基礎 GKE 叢集不存在,系統就會在「功能狀態」下方顯示這項錯誤。

AVMBR109:[NAME] is not a VPC-native GKE cluster.

這項錯誤會顯示在「功能狀態」下方。如果指定的 GKE 叢集是使用路由的叢集,系統就會擲回這個錯誤。多叢集 Ingress 控制器會使用 NEG 建立容器原生負載平衡器。叢集必須是虛擬私有雲原生,才能使用容器原生負載平衡器。

詳情請參閱「建立虛擬私有雲原生叢集」。

AVMBR110:[IAM_PERMISSION] permission missing for GKE cluster [NAME].

這項錯誤會顯示在「功能狀態」下方。這項錯誤有幾種可能原因:

  1. 會員方案的基礎 GKE 叢集位於與會員方案本身不同的專案中。
  2. 已從 MultiClusterIngress 服務代理移除指定的 IAM 權限。

AVMBR111:Failed to get Config Membership: [REASON].

這項錯誤會顯示在「功能狀態」下方。發生這個錯誤的主要原因是,啟用功能時刪除了設定成員資格。

您絕不需要刪除設定成員資格。如要變更,請按照設定叢集遷移步驟操作。

AVMBR112:HTTPLoadBalancing Addon is disabled in GKE Cluster [NAME].

如果 GKE 叢集停用 HTTPLoadBalancing外掛程式,系統就會在「功能狀態」下方顯示這項錯誤。您可以更新 GKE 叢集,啟用 HTTPLoadBalancing 外掛程式:

gcloud container clusters update name --update-addons=HttpLoadBalancing=ENABLED

AVMBR113:This resource is orphaned.

在某些情況下,資源的實用性取決於是否由其他資源參照。建立 Kubernetes 資源但未由其他資源參照時,系統會擲回這項錯誤。舉例來說,如果您建立的 BackendConfig 資源未由 MultiClusterService 參照,就會看到這則錯誤訊息。