首页 文章

GKE - 来自Google Container Registry的ErrImagePull

提问于
浏览
1

我有一个Google Kubernetes Engine集群,直到最近才开始从Google Container Registry桶中提取私有容器图像 . 我没有改变任何东西,但现在当我更新我的Kubernetes Deployments时,它无法启动新的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

我检查过以下的事情,这些事情似乎都是应该的:

  • 容器及其标签实际上是存在的,并且是正确的 .

  • GKE集群的节点池/ VM实例具有 storage-ro 权限

  • Google Container Registry存储桶和GKE集群位于同一个项目中

我也尝试过禁用和重新启用container.googleapis.com和containerregistry.googleapis.com服务,但这没有帮助 .

Container Registry的Google文档说明:

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

但事实似乎并非如此 .

任何人都可以了解可能发生的事情吗?或者尝试其他步骤?

1 回答

  • 2

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

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

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

    使用正确指定的服务帐户重新创建节点池可解决此问题 .

相关问题