GKE 上的 pod 在 GCE 上创建磁盘的权限

Permissions for a pod on GKE to create disk on GCE

我正在启动一个 kubernetes 作业作为 GKE 上的 helm pre-install 挂钩。 该作业使用 google/cloud-sdk 图像,我希望它创建一个计算引擎永久磁盘。

这是它的 spec:

    spec:
      restartPolicy: OnFailure
      containers:
      - name: create-db-hook-container
        image: google/cloud-sdk:latest
        command: ["gcloud"]
        args: ["compute", "disks", "create", "--size={{ .Values.volumeMounts.gceDiskSize  }}", "--zone={{ .Values.volumeMounts.gceDiskZone }}", "{{ .Values.volumeMounts.gceDiskName }}"]

但是失败并出现以下错误:

brazen-lobster-create-pd-hook-nc2v9 create-db-hook-container ERROR: 
(gcloud.compute.disks.create) Could not fetch resource: brazen-lobster-create-pd-hook-nc2v9 
create-db-hook-container  
- Insufficient Permission: Request had insufficient authentication scopes. 
brazen-lobster-create-pd-hook-nc2v9 create-db-hook-container

显然我必须授予 gcloud.compute.disks.create 权限。

我的问题是我必须向谁授予此权限

这是一个 GCP IAM 权限,因此我认为它不能专门授予 k8s 资源(?)所以它不能在 k8s RBAC 的上下文中处理,对吗?

编辑:我创建了一个 ComputeDiskCreate 自定义角色,它包含两个权限:

我已将其附加到服务帐户

service-2340842080428@container-engine-robot.uam.gserviceaccount.com 我的 IAM google 云控制台已命名为

Kubernetes Engine Service Agent

结果还是一样

在GKE中,集群中的所有节点实际上都是Compute Engine VM实例。他们在创建时被分配了一个服务帐户,以向其他服务验证他们的身份。您可以通过查看对应的节点池来查看分配给节点的服务账号。

默认情况下,GKE 节点分配有 Compute Engine 默认服务帐户,看起来像 PROJECT_NUMBER-compute@developer.gserviceaccount.com,除非您在 cluster/node 池创建时设置不同的帐户。

对其他 Google 服务的调用(如本例中的 compute.disks.create 端点)将来自该节点,并使用相应的服务帐户凭据进行身份验证。

因此,您应该在开发者控制台的 IAM page.

中将 gcloud.compute.disks.create 权限添加到节点的服务帐户(可能 PROJECT_NUMBER-compute@developer.gserviceaccount.com

编辑:在任何身份验证之前,节点访问给定Google服务的能力由其access scope. This is defined at node pool's creation time and can't be edited. You'll need to create a new node pool and ensure you grant it the https://www.googleapis.com/auth/compute access scope to Compute Engine methods. You can then instruct your particular pod to run on those specific nodes定义。