将 Docker 映像从在 GKE 中运行的容器推送到 Google Container Registry

xet*_*a11 2 service-accounts docker google-cloud-platform google-kubernetes-engine

我有一个 GCP 项目。在那里,我使用运行 Teamcity 容器的 GKE。这个 Teamcity 容器是我的构建服务器,也是我运行构建步骤/脚本的位置。

构建步骤之一是要将 docker 映像推送到 Google Container Registry。这样做时它会失败,导致此错误:

denied: Token exchange failed for project 'coopr-mod'. Caller does not have permission 'storage.buckets.create'. To configure permissions, follow instructions at: https://cloud.google.com/container-registry/docs/access-control
Run Code Online (Sandbox Code Playgroud)

我阅读了提到的说明链接,但在我的情况下无法找到如何解决问题。

为了完成,我在此写下执行的构建步骤:

第 1 步

# Create environment variable for correct distribution
export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"

# Add the Cloud SDK distribution URI as a package source
echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list

# Import the Google Cloud Platform public key
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

# Update the package list and install the Cloud SDK
sudo apt-get -y update && sudo apt-get -y install google-cloud-sdk
Run Code Online (Sandbox Code Playgroud)

第 2 步

gcloud --quiet auth configure-docker
Run Code Online (Sandbox Code Playgroud)

第 3 步:`docker build myimage:1

第 4 步docker tag myimage:1 eu.gcr.io/my-project/myimage:1

第 5 步:(失败的一步) docker push eu.gcr.io/coopr-mod/myimage:1

结果

denied: Token exchange failed for project 'coopr-mod'. Caller does not have permission 'storage.buckets.create'. To configure permissions, follow instructions at: https://cloud.google.com/container-registry/docs/access-control
Run Code Online (Sandbox Code Playgroud)

我阅读了有关授予read-writeGoogle Storage的 GKE权限的信息,但找不到告诉我“如何”执行此操作的指南。

rob*_*emb 5

有关于如何使用 GCR 和 GKE 推送和拉取图像的不错的文档。此外,这个答案是常规 GCE 实例的类似答案。

假设您的节点池配置了使用默认 GCE 帐户的实例read-write,那么在创建池时使用访问范围配置池是一件简单的事情。

有几种方法可以做到这一点:

  • 当您使用 gcloud 创建节点池时,请指定(另外)--scopes https://www.googleapis.com/auth/devstorage.read_write (或者,您可以使用此值启用“所有范围”:https://www.googleapis.com/auth/cloud-platform,但这是非常宽松的)
  • 在配置节点池时,在控制台中,专门选择范围(默认为只读)或选择“所有范围”,例如:

编辑节点池页面中的设置

...省略了许多范围选择...

正确设置存储范围

如果,无论出于何种原因,您不能只是拆除节点池,有关如何将作业迁移到新机器类型的说明应该适合您(在这种情况下,“新机器类型”仅具有新的访问权限)。基本步骤是:

  • 创建新节点池
  • 封锁(标记为不可调度)现有节点池(并排空现有作业)
  • 等待作业迁移
  • 删除现有节点池

这就是说,它可能是有意义的去有点超出这一点,并使用一个专门的服务帐户(和密钥)推图片,如果你不想让你的群集上的任何荚有这种访问的。同样,这不需要销毁和重新创建节点池。

这是一个相当复杂的数量,但步骤大致是:

  • 创建一个具有必要角色的 IAM 帐户(可能是“存储对象管理员”——但您需要能够在第一次推送时创建存储桶)。
  • 为这个 IAM 账户生成一个密钥。
  • 使用您的作业部署密钥文件(大概是通过 GKE 机密)
  • 使用密钥文件对 docker 进行身份验证

cat keyfile.json | docker login -u _json_key --password-stdin https://eu.gcr.io

(或任何适合您的正确 GCR 存储库主机名)