将Docker映像从GKE中运行的容器中推送到Google容器注册表中

问题描述 投票:1回答:1

我有一个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

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

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

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

[我读过有关授予Google存储空间GKE read-write权限的信息,但找不到它告诉我“如何”执行此操作的指南。

docker google-cloud-platform google-kubernetes-engine service-accounts
1个回答
4
投票

关于如何使用GCR和GKE同时推送和拉取图像,有不错的documentation。同样,对于常规GCE实例,this answer是类似的答案。

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

几种方法:

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

setting in edit node pool page

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

correct setting for storage scope

[如果出于某种原因,您不能只是拆除节点池,那么有关如何将作业迁移到new machine type的说明应该对您有用(在这种情况下,“新计算机类型”具有新的访问权限)。基本步骤是:

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

也就是说,可能如果您不希望集群中的任何吊舱具有这种访问权限,则可以超出此范围,并使用专用的服务帐户(和密钥)来推送图像。 。同样,这不需要销毁并重新创建节点池。

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

  • 创建一个具有必要角色的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存储库主机名)

© www.soinside.com 2019 - 2024. All rights reserved.