多叢集 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 狀況不佳 (請參閱雲端控制台偵錯範例)。
  2. 防火牆設定錯誤,導致 Google 健康狀態檢查工具無法執行健康狀態檢查。

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

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

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

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

如果 GKE 叢集不在 VPC 原生模式中,或您新增了 Membership,但未在 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」(負載平衡) 頁面。

錯誤/警告代碼

Multi Cluster 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 端點的資源。NEG 可能不存在的主要原因是,後端叢集中的衍生服務在建立或更新時發生錯誤。如需更多資訊,請查看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"

這項錯誤會顯示在「功能狀態」下方,發生原因是成員資格資源沒有基礎 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 參照,就會看到這則錯誤訊息。