排解 GKE 中的負載平衡問題

Google Kubernetes Engine (GKE) 的負載平衡問題可能會導致服務中斷,例如發生 HTTP 502 錯誤,或無法存取應用程式。

請參閱本文,瞭解如何排解外部 Ingress 的 502 錯誤,以及如何使用負載平衡器記錄和診斷工具 (例如 check-gke-ingress) 找出問題。

對於在 GKE 中設定及維護負載平衡服務的平台管理員、操作員和應用程式開發人員來說,這項資訊非常重要。如要進一步瞭解我們在 Cloud de Confiance by S3NS 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。

外部 Ingress 產生 HTTP 502 錯誤

請按照下列指引,排解外部 Ingress 資源的 HTTP 502 錯誤:

  1. 針對與 Ingress 參照的各項 GKE 服務相關聯的每個後端服務,啟用記錄。
  2. 使用狀態詳細資料,找出 HTTP 502 回應的原因。如果狀態詳細資料指出 HTTP 502 回應來自後端,則需要對放送 Pod 進行疑難排解,而非負載平衡器。

非代管執行個體群組

如果外部 Ingress 使用非代管執行個體群組後端,您可能會遇到外部 Ingress 資源的 HTTP 502 錯誤。如果符合下列所有條件,就會發生這個問題:

  • 叢集內所有節點集區的節點總數過多。
  • Ingress 參照的一或多個服務的服務 Pod 僅位於少數節點上。
  • Ingress 參照的 Service 會使用 externalTrafficPolicy: Local。

如要判斷外部 Ingress 是否使用非代管執行個體群組後端,請執行下列步驟:

  1. 前往 Cloud de Confiance 控制台的「Ingress」(輸入) 頁面。

    前往 Ingress

  2. 按一下外部 Ingress 的名稱。

  3. 按一下負載平衡器名稱。系統會顯示「Load balancing details」(負載平衡詳細資料) 頁面。

  4. 查看「Backend services」(後端服務) 區段中的表格,判斷外部 Ingress 是否使用 NEG 或執行個體群組。

如要解決這個問題,請採用下列任一解決方法:

  • 使用 VPC 原生叢集。
  • 針對外部 Ingress 參照的每個服務使用 externalTrafficPolicy: Cluster。這個解決方案會導致您遺失封包來源中的原始用戶端 IP 位址。
  • 使用 node.kubernetes.io/exclude-from-external-load-balancers=true 註解。將註解新增至節點或節點集區,這些節點或節點集區不會為叢集中任何外部 Ingress 或 LoadBalancer Service 參照的任何 Service 執行任何服務 Pod。

L4 負載平衡器記錄設定

如果您已為外部直通式網路負載平衡器或內部直通式網路負載平衡器啟用記錄功能,本節將提供疑難排解資訊。

監控記錄設定狀態

GKE L4LB 控制器會透過 Service 的 status.conditions 類型,提供記錄檔的協調狀態回饋。您可以執行下列指令來檢查這項狀態:

kubectl get svc SERVICE_NAME -o yaml

更改下列內容:

  • SERVICE_NAME:叢集名稱。

在輸出內容中,尋找 LoggingConfigManaged 條件類型。下表說明可能造成這種情況的原因:

條件狀態 原因 說明
是 已協調 控制器會主動強制執行 L4LBConfig CRD 中定義的記錄設定。
否 非代管 L4LBConfig CRD 缺少 logging 區段,或註解已移除。控制器已停止管理,並將後端服務保留在最後已知狀態。
否 找不到 找不到 Service 註解中參照的 L4LBConfig 資源。
否 無效 L4LBConfig 資源未通過 optionalFields 參數的交叉驗證。
否 錯誤 後端服務對帳時發生錯誤。

瞭解滑行行為

如果從 Service 資訊清單中移除 networking.gke.io/l4lb-config 註解,或刪除參照的 L4LBConfig 資源,設定就會進入 Coast 狀態。

在這種狀態下,GKE 控制器會停止管理記錄設定,但不會將 Cloud de Confiance by S3NS 後端服務重設為預設設定。後端服務會維持最後已知的良好狀態。系統通常會發出警告事件,通知您 Kubernetes 不再控管設定。

使用負載平衡器記錄檔排解問題

您可以透過內部直通式網路負載平衡器記錄和外部直通式網路負載平衡器記錄,排解負載平衡器相關問題,並將負載平衡器的流量與 GKE 資源建立關聯。

系統會匯總每個連線的記錄,並以近乎即時的方式匯出。系統會為 LoadBalancer 服務資料路徑中涉及的每個 GKE 節點產生記錄,包括輸入和輸出流量。記錄項目包含 GKE 資源的其他欄位,例如:

  • 叢集名稱
  • 叢集位置
  • 服務名稱
  • 服務命名空間
  • Pod 名稱
  • Pod 命名空間

使用診斷工具排解問題

check-gke-ingress 診斷工具會檢查 Ingress 資源,找出常見的設定錯誤。你可以透過下列方式使用「check-gke-ingress」工具:

  • 在叢集上執行 gcpdiag 指令列工具。輸入結果會顯示在檢查規則 gke/ERR/2023_004 部分。
  • 請按照 check-gke-ingress 中的操作說明,單獨使用 check-gke-ingress 工具,或將其做為 kubectl 外掛程式使用。