问题描述
我有一个简单的应用程序(基于python和flask的REST api),可以在Google kubernetes引擎(GKE)上很好地工作。我的CI / CD设置创建了一个docker映像,将其推送到Google云注册表(GCR),然后将其部署到GKE。一切正常。 现在,我添加了一个数据库。它将托管在Google Cloud sql上。为了从kubernetes访问数据库,我使用了Google推荐的Google Cloud 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 权限并解决了问题。