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

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

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

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

luckyxiaoli 回答:从GKE中运行的容器将Docker映像推送至Google Container Registry

关于如何使用GCR和GKE推拉图像的documentation不错。另外,this answer对于常规GCE实例也有类似的答案。

假设使用默认GCE帐户为节点池配置了实例,那么在创建池时,只需使用read-write访问范围配置池即可。

执行此操作的几种方法:

  • 使用gcloud创建节点池时,(另外)指定--scopes https://www.googleapis.com/auth/devstorage.read_write(或者,您可以使用以下值启用{all作用域: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存储库主机名)

本文链接:https://www.f2er.com/3132436.html

大家都在问