使用GitHub Actions通过Helm部署到GKE时报container.secrets.list权限错误
GKE Helm部署权限错误解决方案
报错特征
执行helm upgrade命令时返回如下错误:
history.go:56: [debug] getting history for release blog Error: query: failed to query with labels: secrets is forbidden: User "***" cannot list resource "secrets" in API group "" in the namespace "default": requires one of ["container.secrets.list"] permission(s). helm.go:88: [debug] secrets is forbidden: User "***" cannot list resource "secrets" in API group "" in the namespace "default": requires one of ["container.secrets.list"] permission(s).
根因说明
Helm默认会将Release的版本历史存储在对应命名空间的Secret资源中,部署操作需要对目标命名空间下的Secret有查询、创建、更新权限。你使用的Google Cloud服务账号缺少对应权限,GKE的权限校验需要同时满足GCP IAM权限和Kubernetes RBAC权限两层规则。
修复步骤
- 第一步:给Google Cloud服务账号绑定GKE操作基础角色
运行如下命令为你的服务账号授予roles/container.developerIAM角色,该角色包含集群内资源操作的基础权限:
如果你需要最小权限配置,可以自定义IAM角色,仅添加gcloud projects add-iam-policy-binding ${GCLOUD_PROJECT_ID} \ --member=serviceAccount:${GCLOUD_SA_EMAIL} \ --role=roles/container.developercontainer.secrets.list、container.secrets.create、container.secrets.update、container.secrets.delete所需权限即可。 - 第二步:绑定Kubernetes RBAC权限
如果配置完IAM权限后仍报错,需要为服务账号映射的Kubernetes用户绑定命名空间级别的操作权限,执行如下命令创建RoleBinding:kubectl create rolebinding helm-deploy-sa-binding \ --namespace default \ --clusterrole=edit \ --user=${GCLOUD_SA_EMAIL}edit内置ClusterRole已经包含Helm部署所需的所有命名空间内资源操作权限。 - 第三步:验证权限配置
你可以在GitHub Actions的Deploy步骤前添加权限校验步骤,确认权限配置生效:
以上两个命令返回- name: Check K8s permissions run: | kubectl auth can-i list secrets --namespace default kubectl auth can-i create secrets --namespace defaultyes即代表权限配置正常。
内容的提问来源于stack exchange,提问作者Casey Flynn
相关产品推荐
相关产品推荐

