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

时间:2019-11-22 07:49:49

标签: kubernetes google-cloud-platform google-compute-engine google-kubernetes-engine google-iam

我正在作为kubernetes helm钩挂在GKE上的一项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自定义角色,其中包含两个权限:

  • gcloud.compute.disks.create
  • gcloud.compute.disks.list

我已将其附加到服务帐户

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

  

Kubernetes引擎服务代理

但结果仍然相同。

1 个答案:

答案 0 :(得分:1)

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

默认情况下,除非在群集/节点池创建时设置了另一个帐户,否则默认情况下,将为GKE节点分配Compute Engine默认服务帐户,该帐户看起来像PROJECT_NUMBER-compute@developer.gserviceaccount.com

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

因此,您应该在开发者控制台的IAM page中向节点的服务帐户(可能为gcloud.compute.disks.create)添加PROJECT_NUMBER-compute@developer.gserviceaccount.com权限。

编辑:在进行任何身份验证之前,节点访问其给定Google服务的能力仅由其access scope定义。这是在节点池的创建时定义的,无法进行编辑。您需要创建一个新的节点池,并确保向其授予Compute Engine方法的https://www.googleapis.com/auth/compute访问范围。然后,您可以指示您的特定广告连播到run on those specific nodes