我正在将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/