GKE中为Terraform服务账号配置ClusterRoleBinding的权限报错问题
1. 核心问题:Kubernetes Provider 身份认证配置错误
报错中执行操作的用户显示为client而非你预期的Terraform服务账号,说明你配置中的kubernetes Provider没有正确绑定该服务账号的身份,默认调用了本地kubeconfig中无权限的默认身份,才触发了集群范围的鉴权失败。
你需要补充Kubernetes Provider的GKE身份绑定配置,示例如下:
data "google_client_config" "current" {} provider "kubernetes" { host = google_container_cluster.你的集群资源名.endpoint token = data.google_client_config.current.access_token cluster_ca_certificate = base64decode(google_container_cluster.你的集群资源名.master_auth[0].cluster_ca_certificate) }
确保Provider直接通过GCP的访问令牌认证,而不是读取本地kubeconfig的默认身份。
2. 时序依赖问题
GCP IAM权限到GKE RBAC的映射不是实时生效的,你当前仅配置了依赖google_project_iam_member资源创建完成,没有等待权限实际同步到GKE集群,就算Provider配置正确也可能偶发鉴权失败。可以在IAM授权和ClusterRoleBinding资源之间加一个1~2分钟的sleep资源,规避时序差问题。
3. 数据源配置错误问题
你当前使用的data.google_service_account.terraform配置中,account_id参数仅支持传入服务账号邮箱@前缀部分,如果你传入的var.terraform_sa_email是完整服务账号邮箱,会导致数据源查询失败,取到的email和unique_id都是无效值,后续RBAC配置自然不生效。如果要直接传入完整邮箱查询,修改数据源配置即可:
data "google_service_account" "terraform" { project = var.project_id email = var.terraform_sa_email }
4. Google Groups RBAC 影响判断
你开启的authenticator_groups_config不会直接导致该报错,只有当你的Terraform服务账号不在gke-security-groups@从属的安全组范围内时,GKE才会直接拒绝该身份的认证请求。可以确认两点:
- 把Terraform服务账号加入
gke-security-groups@所在域的安全组 - 刚加入组的身份需要等待15分钟左右的组同步时间再重试操作
验证步骤
你可以先用Terraform服务账号的密钥在本地验证权限是否正常:
- 激活服务账号:
gcloud auth activate-service-account --key-file=你的服务账号密钥文件路径 - 获取集群凭证:
gcloud container clusters get-credentials 集群名 --region 集群区域 - 测试权限:
kubectl auth can-i create clusterrolebindings --cluster-scope
如果返回yes说明身份和权限配置无问题,只需排查Terraform Provider配置即可。
内容的提问来源于stack exchange,提问作者Niels Hofmans

