GKE-ErrImagePull从Google Container Registry中提取

Jas*_*uer 3 google-kubernetes-engine google-container-registry

我有一个Google Kubernetes Engine集群,该集群直到最近一直很高兴地从Google Container Registry存储桶中提取私有容器映像。我没有做任何更改,但是现在当我更新Kubernetes部署时,它无法启动新的Pod,并且发生以下事件:

Normal   Pulling  14s                kubelet, <node-id>  pulling image "gcr.io/cloudsql-docker/gce-proxy:latest"
Normal   Pulling  14s                kubelet, <node-id>  pulling image "gcr.io/<project-id>/backend:62d634e"
Warning  Failed   14s                kubelet, <node-id>  Failed to pull image "gcr.io/<project-id>/backend:62d634e": rpc error: code = Unknown desc = unauthorized: authentication required
Warning  Failed   14s                kubelet, <node-id>  Error: ErrImagePull
Normal   Pulled   13s                kubelet, <node-id>  Successfully pulled image "gcr.io/cloudsql-docker/gce-proxy:latest"
Normal   Created  13s                kubelet, <node-id>  Created container
Normal   Started  13s                kubelet, <node-id>  Started container
Normal   BackOff  11s (x2 over 12s)  kubelet, <node-id>  Back-off pulling image "gcr.io/<project-id>/backend:62d634e"
Warning  Failed   11s (x2 over 12s)  kubelet, <node-id>  Error: ImagePullBackOff
Run Code Online (Sandbox Code Playgroud)

我检查了以下内容,这些内容似乎都应该正确:

  • 容器及其标签实际存在,并且是正确的。
  • GKE群集的节点池/ VM实例具有storage-ro权限
  • Google Container Registry存储桶和GKE群集位于同一项目中

我也尝试过禁用和重新启用container.googleapis.com和containerregistry.googleapis.com服务,但这无济于事。

容器注册表的Google文档指出:

Kubernetes Engine集群被自动配置为具有访问权限,以从同一项目中的Container Registry中提取私有映像。如果注册表和群集位于同一Cloud项目中,则无需执行其他步骤即可配置身份验证。

但这似乎并非如此。

任何人都可以进一步了解发生了什么吗?或尝试其他步骤?

Jas*_*uer 5

好吧,结果证明这很棘手,但原因是:

我使用 Terraform 为 GKE 集群中的节点设置服务帐户,但我没有使用资源的email输出google_service_account来指定服务帐户,而是使用unique_id输出。Terraform 和 Google Cloud API 都很好地接受了这一点。

当 Kubernetes(和其他东西)试图访问每个节点上的内部元数据 API 以获取它可以使用的令牌时,它收到Service account is invalid/disabled了 403 状态的响应。

使用正确指定的服务帐户重新创建节点池解决了该问题。


And*_*nes 5

以我为例,问题出在最小规范文件生成的节点池中缺少用于访问注册表的oauth2范围。新增中

nodePools:
  config:
    oauthScopes:
    - https://www.googleapis.com/auth/devstorage.read_only
    - https://www.googleapis.com/auth/servicecontrol
    - https://www.googleapis.com/auth/service.management.readonly
    - https://www.googleapis.com/auth/trace.append

Run Code Online (Sandbox Code Playgroud)

根据我的规范固定的东西。我认为重要的是devstorage作用域,但是我不确定,因为我只是从Web控制台生成的规范中复制并粘贴了整个作用域列表。

  • 我认为它也只是需要`https://www.googleapis.com/auth/devstorage.read_only`。至少这是我添加到我使用的服务帐户的全部内容。 (2认同)