我有一个启用了工作负载身份的 GKE。 我们的大多数工作负载都使用云存储或云日志 GCP 包,这意味着实际上使用工作负载身份进行 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>)
NodeJS:
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 容器,直到元数据服务器运行为止。
我想知道这是否真的是最好的方法,将 init 容器添加到我们所有的工作负载中,以及这是否真的是我们的用例,因为错误代码有点误导。另外,不太清楚为什么它只在添加秘密管理器时才开始。
有时会由于元数据服务器上的 OOM 问题而发生这种情况。您可以使用以下命令检查运行元数据服务器的 Pod 的状态:
kubectl -n kube-system describe pods <pod_name>
您可以使用以下方式获得
pod_name
:
kubectl get pods --namespace kube-system
。
Pod 名称将以前缀 gke-metadata-server-
开头
如果您在描述 pod 时在输出中看到类似以下内容:
Last State: Terminated
Reason: OOMKilled
那么这将表明 OOM 问题。
您可以尝试的一些缓解措施: