我正在将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自定义角色,该角色包含两个权限:
  • gcloud.compute.disks.create
  • gcloud.compute.disks.list

  • 我已将其附加到服务帐户

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


    但结果还是一样。

    最佳答案

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

    默认情况下,向GKE节点分配Compute Engine默认服务帐户,该帐户类似于[email protected],除非您在群集/节点池创建时设置了另一个帐户。

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

    因此,您应该在开发者控制台的IAM page中将gcloud.compute.disks.create权限添加到节点的服务帐户(可能是[email protected])。

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

    关于kubernetes - GKE上的Pod在GCE上创建磁盘的权限,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58989745/

    10-12 23:46