排解 Google Distributed Cloud 觀測能力問題

如要還原 Google Distributed Cloud 叢集中遺失的稽核記錄、指標或中繼資料標籤,請使用下列常見觀測能力問題的修正方法。這些問題大多是由權限錯誤,或大型叢集中 kube-state-metrics 等元件的記憶體不足當機所造成。部分問題也會影響水平 Pod 自動配置器和kubectl top。

如需其他協助,請與 Cloud Customer Care 團隊聯絡。您也可以參閱「取得支援」,進一步瞭解支援資源,包括:

  • 建立客服案件的需求條件。
  • 工具:協助您疑難排解,例如您的環境設定、記錄和指標。
  • 支援的元件。

未收集 Cloud 稽核記錄

Cloud 稽核記錄預設為啟用,除非叢集設定的 clusterOperations 區段下方設有 disableCloudAuditLogging 旗標。

如果已啟用 Cloud 稽核記錄,但未收集記錄,最常見的原因是權限不足。在這種情況下,Cloud 稽核記錄 Proxy 容器會顯示權限遭拒的錯誤訊息。

Cloud 稽核記錄 Proxy 容器會在所有 Google Distributed Cloud 叢集中,以 DaemonSet 的形式執行。

如果看到權限錯誤,請按照步驟排解並解決權限問題。

另一個可能的原因是專案已達到支援的服務帳戶相關限制,請參閱「Cloud 稽核記錄服務帳戶外洩」。

系統不會收集 kube-state-metrics 指標

kube-state-metrics (KSM) 會在叢集中以單一副本 Deployment 的形式執行,並產生叢集中幾乎所有資源的指標。如果 KSM 和 gke-metrics-agent 在同一個節點上執行,所有節點上的指標代理程式發生中斷的風險會更高。

KSM 指標的名稱會遵循 kube_<ResourceKind> 模式,例如 kube_pod_container_info。以 kube_onpremusercluster_ 開頭的指標來自地端部署叢集控制器,而非 KSM。

如果缺少 KSM 指標,請按照下列疑難排解步驟操作:

  • 在 Cloud Monitoring 中,使用 kubernetes.io/anthos/container/... 等摘要 API 指標,檢查 KSM 的 CPU、記憶體和重新啟動次數。這是與 KSM 不同的管道。確認 KSM Pod 未因資源不足而受限。
    • 如果 KSM 無法使用這些摘要 API 指標,同一節點上的 gke-metrics-agent 可能也有相同問題。
  • 在叢集中,檢查 KSM Pod 的狀態和記錄,以及與 KSM 位於同一節點上的 gke-metrics-agent Pod。

kube-state-metrics 陷入當機迴圈

症狀

Cloud Monitoring 未提供 kube-state-metrics (KSM) 的指標。

原因

這種情況較常發生在大型叢集,或資源量龐大的叢集。KSM 會以單一副本 Deployment 的形式運作,並列出叢集中的幾乎所有資源,例如 Pod、Deployment、DaemonSet、ConfigMap、Secret 和 PersistentVolume。系統會為每個資源物件產生指標。如果任何資源含有大量物件 (例如叢集有超過 10,000 個 Pod),KSM 可能會發生記憶體不足。

受影響的版本

任何版本的 Google Distributed Cloud 都可能發生這個問題。

在最近幾個 Google Distributed Cloud 版本中,預設 CPU 和記憶體限制已提高,因此這類資源問題應該較少發生。

修正和解決方法

如要確認問題是否因記憶體不足而引起,請按照下列步驟操作:

  • 請使用 kubectl describe pod 或 kubectl get pod -o yaml,並查看錯誤狀態訊息。
  • 檢查 KSM 的記憶體消耗量和使用率指標,確認是否在重新啟動前達到上限。

如果確認問題是記憶體不足,請使用下列任一解決方案:

  • 提高 KSM 的記憶體要求和限制。

  • 減少 KSM 的指標數量。

    在 Google Distributed Cloud 1.13 中,KSM 預設只會公開少數指標,稱為核心指標。這項行為表示資源用量比先前版本少,但您仍可按照相同程序進一步減少 KSM 指標數量。

    如果是 1.13 以下版本的 Google Distributed Cloud,KSM 會使用預設旗標。這項設定會公開大量指標。

gke-metrics-agent 陷入當機迴圈

如果 gke-metrics-agent 只有在 kube-state-metrics 所在的節點上發生記憶體不足問題,原因就是 kube-state-metrics 指標數量過多。如要解決這個問題,請縮減 stackdriver-operator 並修改 KSM,只公開一小組必要指標,詳情請參閱上一節。叢集升級至 Google Distributed Cloud 1.13 後,請記得將 stackdriver-operator 擴充至原本的大小,因為 KSM 預設會公開較少的核心指標。

如果問題與記憶體不足事件無關,請查看 gke-metric-agent 的 Pod 記錄。只要在 Stackdriver 自訂資源中加入 resourceAttrOverride 欄位,即可調整所有 gke-metrics-agent Pod 的 CPU 和記憶體。

stackdriver-metadata-agent 陷入當機迴圈

症狀

在 Cloud Monitoring 篩選指標時,沒有可用的系統中繼資料標籤。

原因

stackdriver-metadata-agent 停止運作迴圈最常見的原因是記憶體不足事件。這個事件與 kube-state-metrics 類似,雖然 stackdriver-metadata-agent 不會列出所有資源,但仍會列出相關資源類型的所有物件,例如 Pod、Deployment 和 NetworkPolicy。代理程式會以單一副本 Deployment 的形式執行,如果物件數量過多,記憶體不足事件的風險就會增加。

受影響的版本

任何版本的 Google Distributed Cloud 都可能發生這個問題。

在最近幾個 Google Distributed Cloud 版本中,預設 CPU 和記憶體限制已提高,因此這些資源問題應該較少發生。

修正和解決方法

如要確認問題是否因記憶體不足而引起,請按照下列步驟操作:

  • 請使用 kubectl describe pod 或 kubectl get pod -o yaml,並查看錯誤狀態訊息。
  • 檢查 stackdriver-metadata-agent 的記憶體消耗量和使用率指標,確認是否在重新啟動前達到上限。
如果確認問題是由記憶體不足造成,請在 Stackdriver 自訂資源的 resourceAttrOverride 欄位中提高記憶體限制。

metrics-server 陷入當機迴圈

症狀

水平 Pod 自動配置器和 kubectl top 無法在叢集中運作。

原因和受影響的版本

這個問題並不常見,但會因大型叢集或 Pod 密度高的叢集發生記憶體不足錯誤而造成。

任何版本的 Google Distributed Cloud 都可能發生這個問題。

修正和解決方法

提高指標伺服器資源限制。在 Google Distributed Cloud 1.13 以上版本中,metrics-server 及其設定的命名空間已從 kube-system 移至 gke-managed-metrics-server。

如果是 Google Distributed Cloud,更新或升級叢集時,系統會還原對 Nanny 設定所做的編輯。您必須重新套用設定變更。如要避開這項限制,請縮減 metrics-server-operator 並手動變更 metrics-server Pod。

刪除 Cloud 稽核記錄服務帳戶時,並未移除所有資源

刪除用於 Cloud 稽核記錄的服務帳戶時,並非所有 Google Cloud資源都會刪除。如果您經常刪除並重新建立用於 Cloud 稽核記錄的服務帳戶,稽核記錄最終會開始失敗。

症狀

Cloud 稽核記錄 Proxy 容器中會顯示權限遭拒錯誤訊息。

如要確認稽核記錄失敗是由這個問題造成,請執行下列指令:

curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://gkehub.googleapis.com/v1alpha/projects/PROJECT_NUMBER/locations/global/features/cloudauditlogging

將 PROJECT_NUMBER 替換為專案編號。

回應會傳回專案中與 Cloud 稽核記錄搭配使用的所有服務帳戶,包括已刪除的服務帳戶。

原因和受影響的版本

刪除用於 Cloud 稽核記錄的服務帳戶時,並非所有 Google Cloud 資源都會移除,最終會達到專案的 1, 000 個服務帳戶相關限制。

任何版本的 Google Distributed Cloud 都可能發生這個問題。

修正和解決方法

  1. 建立環境變數,其中包含要保留的所有服務帳戶清單,並以半形逗號分隔。請在每個服務帳戶電子郵件地址前後加上單引號,並在整個清單前後加上雙引號。您可以從以下幾點著手:

    SERVICE_ACCOUNT_EMAILS="'SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com'"
    

    更改下列內容:

    • PROJECT_ID:您的專案 ID。
    • SERVICE_ACCOUNT_NAME:服務帳戶名稱。

    完成的清單應類似下列範例:

    "'sa_name1@example-project-12345.iam.gserviceaccount.com','sa_name2@example-project-12345.iam.gserviceaccount.com','sa_name3@example-project-12345.iam.gserviceaccount.com'"
    
  2. 執行下列指令,從專案中移除 Cloud 稽核記錄功能:

    curl -X DELETE -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    https://gkehub.googleapis.com/v1alpha/projects/PROJECT_NUMBER/locations/FLEET_REGION /features/cloudauditlogging
    

    更改下列內容:

    • PROJECT_NUMBER:專案編號。
    • FLEET_REGION:叢集的機群成員資格位置。這可以是特定區域,例如 us-central1 或 global。您可以執行 gcloud container fleet memberships list 指令,取得成員資格位置。

    這個指令會完全刪除所有服務帳戶。

  3. 重新建立 Cloud 稽核記錄功能,僅保留要使用的服務帳戶:

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -H "Content-Type: application/json" \
        https://gkehub.googleapis.com/v1alpha/projects/PROJECT_NUMBER/locations/FLEET_REGION/features?feature_id=cloudauditlogging \
        -d '{"spec":{"cloudauditlogging":{"allowlistedServiceAccounts":[$SERVICE_ACCOUNT_EMAILS]}}}'
    

中繼資料標籤從指標中消失

症狀

Cloud Monitoring 不會填入中繼資料標籤,例如 node_name。

原因和受影響的版本

任何版本的 Google Distributed Cloud 都可能發生這個問題。

修正和解決方法

對 Pod 進行任何變更,都會還原中繼資料標籤。例如執行 kubectl rollout restart deployment <workload_name> 等指令。

後續步驟

如需其他協助,請與 Cloud Customer Care 團隊聯絡。您也可以參閱「取得支援」,進一步瞭解支援資源,包括:

  • 建立客服案件的需求條件。
  • 工具:協助您疑難排解,例如您的環境設定、記錄和指標。
  • 支援的元件。