簡體   English   中英

GKE 元數據服務器錯誤

[英]GKE Metadata server errors

我有一個啟用了工作負載身份的 GKE。 我們的大多數工作負載都使用 Cloud Storage 或 Cloud logging GCP 包,這意味着實際上使用 Workload 身份進行 GCP 訪問。

最近,我們開始將 Secret Manager 添加到堆棧中,並開始在工作負載啟動時遇到元數據服務器的隨機錯誤。 它發生在不同的框架上。

Python:

File "/venv/lib/python3.8/site-packages/google/auth/compute_engine/credentials.py", line 117, in refresh six.raise_from(new_exc, caught_exc) File "<string>", line 3, in raise_from google.auth.exceptions.RefreshError: ("Failed to retrieve http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/?recursive=true from the Google Compute Enginemetadata service. Status: 404 Response:\nb'Not Found\\n'", <google.auth.transport.requests._Response object at 0x7f3a3084dd60>)

節點JS:

failed to initialize. exiting. Error: 16 UNAUTHENTICATED: Failed to retrieve auth metadata with error: Could not refresh access token: network timeout at: http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token?scopes=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform at Object

我試圖理解為什么會這樣。

首先, 404 Not Found 意味着我們正在嘗試獲取不存在/已刪除的元數據。 問題是它會在幾秒鍾后恢復,所以我不確定到底如何。

根據文檔,有時元數據服務器需要一些時間才能可用,因此之后會出現“恢復”的錯誤。 所以建議在應用程序代碼上添加延遲或使用 init Containers 直到元數據服務器運行。

我想知道這是否真的是最好的方法,向我們所有的工作負載添加一個 init 容器,以及它是否真的是我們的用例,因為錯誤代碼有點誤導。 另外,不太清楚為什么它只在添加秘密管理器時才開始。

這有時是由於元數據服務器上的 OOM 問題而發生的。 您可以使用以下命令檢查運行元數據服務器的 pod 的狀態:

kubectl -n kube-system describe pods <pod_name>

您可以使用以下方法獲取pod_name

kubectl get pods --namespace kube-system pod 名稱將以前綴gke-metadata-server-

如果您在描述 pod 時在 output 中看到類似以下內容:

Last State: Terminated

Reason: OOMKilled

那么這將表明OOM問題。

您可以嘗試一些緩解措施:

  1. 檢查您的集群中是否有未使用的 ServiceAccounts 以及是否可以刪除它們。
  2. 檢查您是否創建了太多客戶端(為每個 API 請求創建一個新客戶端)。 如果可能,共享客戶端將減少對元數據服務器的令牌刷新調用,從而節省 memory。
  3. 檢查是否可以在/etc/kubernetes/addons/下找到元數據服務器的定義。 如果可以,請更新 memory 以增加它並應用更新的配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM