GKE 元数据服务器错误

问题描述 投票:0回答:1

我有一个启用了工作负载身份的 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 容器添加到我们所有的工作负载中,以及这是否真的是我们的用例,因为错误代码有点误导。另外,不太清楚为什么它只在添加秘密管理器时才开始。

metadata google-kubernetes-engine
1个回答
0
投票

有时会由于元数据服务器上的 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 问题。

您可以尝试的一些缓解措施:

  1. 检查集群中是否有未使用的 ServiceAccounts 以及是否可以删除它们。
  2. 检查您是否创建了太多客户端(每个 API 都创建一个新客户端) 要求)。如果可能,共享客户端将减少对元数据服务器的令牌刷新调用,从而节省内存。
© www.soinside.com 2019 - 2024. All rights reserved.