我正在作为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引擎服务代理
但结果仍然相同。
答案 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。