我一直在用头撞墙来解决这个问题,只是不确定我错过了什么。我正在尝试完成 gitlab 管道上的配置,以推送到我使用 helm 管理的 GKE 集群。然而,当我尝试提取存储在 Google 工件注册表中的图表时,我不断收到 403 权限被拒绝的消息,即使我已经为我正在使用的服务帐户添加了足够的权限。
我按照文档中的指示设置了服务帐户此处,这是在 gcloud 控制台中具有权限的现有服务帐户:
在 .gitlab-ci.yml 的最后阶段,我连接到 gcloud 服务帐户,获取显示连接和工件注册表中现有图像的响应,从那里 helm 更新图表,但是一旦我尝试使用 helm拉出图表,我得到了 403。我的方法基于谷歌的说明here。
gitlab-ci.yml 最后阶段:
Deploy-Helm:
stage: deploy
image: kiwigrid/gcloud-kubectl-helm
only: [dev-test]
script:
- echo "connecting to gcloud"
- gcloud auth activate-service-account ${GCLOUD_SERVACCT} --key-file ${GCLOUD_SERVACCT_KEY}
- gcloud config set project ${GCLOUD_PROJECT}
- gcloud artifacts docker images list ${GCLOUD_REPO}
- echo "pull chart from artifact reg"
- helm pull oci://${GCLOUD_REPO}:0.1.0 \
--version 1.0.0 \
--untar
- helm chart export helm-repo/project \
--destination ./install
- echo "Deploying Helm..."
- helm upgrade demotest ./install -n demotest -f ./install/values-test.yaml
在管道中,流程显示服务帐户已连接,图表图像已正确列出,但随后 helm 调用失败。
$ echo "connecting to gcloud"
connecting to gcloud
$ gcloud auth activate-service-account ${GCLOUD_SERVACCT} --key-file ${GCLOUD_SERVACCT_KEY}
Activated service account credentials for: [gitlab-c292ecdff7c3bcd6dd4f68@octodemo-2802.iam.gserviceaccount.com]
$ gcloud config set project octodemo-2802
Updated property [core/project].
$ gcloud artifacts docker images list us-west2-docker.pkg.dev/octodemo-2802/octodemo-helm-repo
Listing items under project octodemo-2802, location us-west2, repository octodemo-helm-repo.
IMAGE DIGEST CREATE_TIME UPDATE_TIME
us-west2-docker.pkg.dev/octodemo-2802/octodemo-helm-repo/octodemo sha256:ff4a6206e799a3a74a2f58d0c9dcb32219a12afac492967977063a91bc602045 2023-08-24T19:45:20 2023-08-24T19:45:20
$ echo "pull chart from artifact reg"
pull chart from artifact reg
$ helm pull oci://us-west2-docker.pkg.dev/octodemo-2802/octodemo-helm-repo/octodemo@sha256:ff4a6206e799a3a74a2f58d0c9dcb32219a12afac492967977063a91bc602045 \ --version 1.0.0 \ --untar
Error: GET "https://us-west2-docker.pkg.dev/v2/octodemo-2802/octodemo-helm-repo/octodemo/tags/list": GET "https://us-west2-docker.pkg.dev/v2/token?scope=repository%3Aoctodemo-2802%2Foctodemo-helm-repo%2Foctodemo%3Apull&service=us-west2-docker.pkg.dev": unexpected status code 403: denied: Permission "artifactregistry.repositories.downloadArtifacts" denied on resource "projects/octodemo-2802/locations/us-west2/repositories/octodemo-helm-repo" (or it may not exist)
我对我在这里错过的东西感到迷失。非常感谢任何指导。
因此,如果其他人遇到此问题并陷入困境,问题是 helm 依赖 docker 进行身份验证,即使服务帐户拥有所需的所有访问权限并且已连接。另外,ci 进程不喜欢 helm pull 命令中的 \ ,我不知道为什么,但我不断收到“错误:非绝对 URL 应该采用 repo_name/path_to_chart 的形式,得到:”错误。一旦我删除了 \ 并将其放入行中,一切就清楚了。另外几点,如果使用 --untar 和 helm pull 则不需要导出,我建议使用 --untardir 来指定它导出到的位置,即使如此,它仍然将图像名称作为您列出的任何内容的子文件夹,这对于 helm 安装/升级很重要。最后,这是基于我的无知,只需确保所有集群连接、身份验证和 helm 部署命令都处于同一阶段,因为它们在不同的容器中运行,并且不会识别另一个阶段完成的内容,这也意味着您要么使用所需服务的基本负载构建一个映像,使用 docker hub 中的映像(默认情况下 gitlab 从其中提取)或采用另一种方式。 (也许还有另一种方法将结果从一个阶段连接到另一个阶段,但这是我的解决方案)。以下是更新阶段:
Deploy-Helm:
stage: deploy
image: kiwigrid/gcloud-kubectl-helm
only: [dev-test]
script:
- echo "connecting to gcloud"
- gcloud auth activate-service-account ${GCLOUD_SERVACCT} --key-file ${GCLOUD_SERVACCT_KEY}
- gcloud config set project ${GCLOUD_PROJECT}
- gcloud artifacts docker images list ${GCLOUD_REPO}
- gcloud auth configure-docker us-west2-docker.pkg.dev
- echo "pull chart from artifact reg"
- helm pull oci://${GCLOUD_REPO} --version 0.1.0 --untar --untardir ./install
- echo "Deploying Helm..."
- helm upgrade demotest ./install/octodemo -n demotest -f ./install/octodemo/values-test.yaml