配置Google Cloud SQL代理后,Pod无法从GCR中提取图像

问题描述

我有一个简单的应用程序(基于python和flask的REST api),可以在Google kubernetes引擎(GKE)上很好地工作。我的CI / CD设置创建了一个docker映像,将其推送到Google云注册表(GCR),然后将其部署到GKE。一切正常。 现在,我添加一个数据库。它将托管在Google Cloud sql上。为了从kubernetes访问数据库,我使用了Google推荐的Google Cloud sql代理(作为辅助工具)和工作负载标识。

我的问题是,在配置了云sql代理后,出现此错误

ImagePullBackOff:无法从注册表中提取图像'gcr.io/xxx-project/xxx-image:xxx-tag'。

cloud sql代理映像已正确加载(我认为是因为它托管在公共注册表中),但不是我的映像,因此pod一直崩溃。

我错过了什么?我应该添加Docker凭证吗?很奇怪,因为它在设置云代理之前就可以正常工作了!

非常感谢您的帮助,

最诚挚的问候

解决方法

我认为这里需要了解一些重要的信息,即 Autopilot 不使用 Workload Identity 或与 pod 拉取图像的权限有关的任何事情。它为您的项目使用默认的计算服务帐户。

需要拉取镜像权限的是节点,而不是 Pod。请参阅来自 the GCP documentation on Workload Identity 的此注释。

注意:即使启用了 Workload Identity,GKE 仍然使用为节点池配置的 Google 服务帐户从映像注册表中提取容器映像。如果您遇到 ImagePullBackOff 或 ErrImagePull 错误,请查看故障排除文档。

我遇到了同样的事情,结果是默认的计算服务帐户已被删除。它恢复了它(使用这些说明 Deleted Compute Engine default service account)并授予它 storage.admin 权限并解决了问题。