是否可以从由 GCB 步骤构建和启动的容器访问服务帐户凭据?

Is it possible to access a service account credentials from a container built and started by a GCB step?

为了 运行 集成测试,我们在一个 GCB 的步骤中构建并启动一个新容器:

- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: 'gcloud'
  args: ['container', 'clusters', 'get-credentials', '$_GC_CLUSTER', '--zone', '$_GC_ZONE']
- name: 'nixery.dev/bash/...'
  entrypoint: 'make' # test creates and runs a new container
  args: ['test', '-C', '$_SERVICE']

当然,这个新容器无法访问GCB的默认账户服务,因此它无法访问其他资源,如Google Cloud Storage。

我们可以在基本映像中包含另一个服务帐户凭据,但如果我们可以依赖 GCB 提供的凭据会更好。我尝试从父容器复制 Kubernetes 配置和 Google Cloud SDK 配置,但它不起作用,所以我想我走错了路。

This answer 提到使用 --impersonate-service-accountgcloud auth configure-docker,但没有给出更多细节。我正在 运行 在我想授予访问权限的容器中执行上一个命令,就在 运行 执行测试之前:

gcloud auth configure-docker --impersonate-service-account project-number-compute@developer.gserviceaccount.com

python3 -m pytest tests

但我仍然收到身份验证错误。如果可能的话,我错过了什么?

容器需要在cloudbuild网络中。构建它时,指定 --network=cloudbuild

Google Cloud Build network

我有办法。不确定那是最优雅的,但它有效

  1. 从集群获取身份验证
  2. 将身份验证保存到唯一一个从一步到另一步的文件夹中/workspace(或我示例中的当前文件夹)
  3. 将保存的认证复制到下一步的home目录
        - name: gcr.io/cloud-builders/gcloud
          entrypoint: "bash"
          args:
            - "-c"
            - |
                    gcloud container clusters get-credentials cluster-1 --zone us-central1-c 
                    cp -r ~/.kube ./.kube
                    ls -la .kube/
        - name: gcr.io/cloud-builders/gcloud
          entrypoint: "bash"
          args:
            - "-c"
            - |
                    cp -r ./.kube ~/.kube
                    kubectl get all

这里是gcloud builder的2倍,不过没关系