我有一个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 回答
好吧,这结果很棘手,但原因是:
我使用Terraform为GKE集群中的节点设置服务帐户,但是我没有使用
google_service_account
资源的email
输出来指定服务帐户,而是使用了unique_id
输出 . Terraform和Google Cloud API都接受了这一点 .当Kubernetes(和其他东西)试图访问每个节点上的内部元数据API以获得它可以使用的令牌时,它正在接收
Service account is invalid/disabled
的响应和403状态 .使用正确指定的服务帐户重新创建节点池可解决此问题 .