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
自定义角色,它包含两个权限:
gcloud.compute.disks.create
gcloud.compute.disks.list
我已将其附加到服务帐户
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定义。
我正在启动一个 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
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定义。