如要還原 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 無法使用這些摘要 API 指標,同一節點上的
- 在叢集中,檢查 KSM Pod 的狀態和記錄,以及與 KSM 位於同一節點上的
gke-metrics-agentPod。
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 的記憶體要求和限制。
如果是 Google Distributed Cloud 1.16.0 以上版本,Google Cloud Observability 會管理 KSM。如要更新 KSM,請參閱「覆寫 Stackdriver 元件的預設 CPU 和記憶體要求與限制」。
如果是 1.16.0 之前的版本,如要調整 KSM 的 CPU 和記憶體,請使用 Stackdriver 自訂資源的 resourceOverride
kube-state-metrics。
減少 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的記憶體消耗量和使用率指標,確認是否在重新啟動前達到上限。
resourceAttrOverride 欄位中提高記憶體限制。
metrics-server 陷入當機迴圈
症狀
水平 Pod 自動配置器和 kubectl top 無法在叢集中運作。
原因和受影響的版本
這個問題並不常見,但會因大型叢集或 Pod 密度高的叢集發生記憶體不足錯誤而造成。
任何版本的 Google Distributed Cloud 都可能發生這個問題。
修正和解決方法
提高指標伺服器資源限制。在 Google Distributed Cloud 1.13 以上版本中,metrics-server 及其設定的命名空間已從 kube-system 移至 gke-managed-metrics-server。
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 都可能發生這個問題。
修正和解決方法
建立環境變數,其中包含要保留的所有服務帳戶清單,並以半形逗號分隔。請在每個服務帳戶電子郵件地址前後加上單引號,並在整個清單前後加上雙引號。您可以從以下幾點著手:
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'"執行下列指令,從專案中移除 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指令,取得成員資格位置。
這個指令會完全刪除所有服務帳戶。
重新建立 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 團隊聯絡。您也可以參閱「取得支援」,進一步瞭解支援資源,包括: