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

Push a Docker image to Google Container Registry from a container running in the GKE

我有一个 GCP 项目。在那里,我将 GKE 与 Teamcity 容器 运行ning 一起使用。这个 Teamcity 容器是我的构建服务器,也是我 运行 我的构建 steps/scripts.

的位置

其中一个构建步骤想要将 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

我阅读了上述说明链接,但无法找到解决我的问题的方法。

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

步骤 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

步骤 2:

gcloud --quiet auth configure-docker

步骤 3: `docker 构建 myimage:1

步骤 4docker 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

我读到过有关授予 GKE read-write Google 存储权限的信息,但我找不到指导我 "how" 这样做的指南。

有不错的 documentation about how to both push and pull images with GCR and GKE. Also, this answer 是对常规 GCE 实例的类似答案。

假设您的节点池配置了使用默认 GCE 帐户的实例,这很简单,在创建池时使用 read-write 访问范围配置池。

实现此目的的几种方法:

  • 当您使用 gcloud 创建节点池时,(另外)指定 --scopes https://www.googleapis.com/auth/devstorage.read_write(或者,您可以使用此值启用 'all scopes':https://www.googleapis.com/auth/cloud-platform,但这是非常宽松的)
  • 在配置节点池时,在控制台中,select具体范围(默认仅读取)或select "all scopes",例如:

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

如果出于某种原因,您不能直接拆除节点池,有关如何将作业迁移到 new machine type 的说明应该适合您(在这种情况下,"new machine type" 仅具有新的访问权限)。基本步骤是:

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

也就是说,如果您不想要任何 pod,可能 更进一步并使用专用服务帐户(和密钥)来推送图像是有意义的在您的集群上拥有这种访问权限。同样,这不需要销毁和重新创建节点池。

这要复杂得多,但步骤大致是:

  • 创建一个具有必要角色的 IAM 帐户(可能 'Storage Object Admin' -- 但您需要能够在 first 推送时创建存储桶)。
  • 为此 IAM 帐户生成密钥。
  • 使用您的作业部署密钥文件(可能通过 GKE 密钥)
  • Authenticate to docker with the key file:

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

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