使用Terraform创建GKE集群时默认节点池权限错误求助
问题
使用Terraform在GCP创建Kubernetes集群时遇到默认节点池权限错误:
- 操作使用的是拥有Owner权限的服务账号,Terraform代码会创建集群、自定义节点池,以及绑定Editor角色的k8s_service_account服务账号
- 集群配置已设置
remove_default_node_pool = true,但默认节点池仍会先尝试创建,集群创建约7分钟后报错:
Error: Error waiting for creating GKE cluster: Google Compute Engine: Not all instances running in IGM after 13.089515691s. Expected 1, running 0, transitioning 1. Current errors:
[PERMISSIONS_ERROR]: Instance 'gke-prod-app-cluster-default-pool*' creation failed: Required 'compute.instances.create' permission for '*gke-prod-app-cluster-default-pool-5ae5b52e-zhnf' (when acting as '477921717275@cloudservices.gserviceaccount.com');
Required 'compute.disks.create'
Required 'compute.disks.setLabels'
Required 'compute.subnetworks.use'
Required 'compute.subnetworks.useExternalIp'
- 经确认
477921717275@cloudservices.gserviceaccount.com是Google托管服务账号,但在项目中无法找到,尝试以下操作未解决:- 搜索相关方案无有效结果
- 为
477921717275-compute@developer.gserviceaccount.com授予全权限 - 尝试为
477921717275@cloudservices.gserviceaccount.com绑定Editor角色,但Terraform apply时该绑定被删除
解决方案
1. 阻止默认节点池初始创建
GKE即使配置了remove_default_node_pool = true,仍会先创建默认节点池再删除。添加initial_node_count = 0可以直接跳过默认节点池的初始化,从根源避免权限校验问题:
resource "google_container_cluster" "prod_app_cluster" { name = "prod-app-cluster" location = "us-central1" remove_default_node_pool = true initial_node_count = 0 # 关键配置,阻止默认节点池创建 # 其他集群配置(如网络、认证等)... }
2. 为Google托管服务账号绑定必要权限
如果上述方法不生效,可通过gcloud命令或Terraform为477921717275@cloudservices.gserviceaccount.com绑定所需角色(该账号是GKE后台使用的托管账号,无法在IAM控制台直接显示):
- 使用gcloud命令授权:
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \ --member="serviceAccount:477921717275@cloudservices.gserviceaccount.com" \ --role="roles/compute.instanceAdmin.v1"
- 通过Terraform管理权限绑定(需避免被其他IAM策略资源覆盖):
resource "google_project_iam_binding" "gcs_service_account_perms" { project = var.project_id role = "roles/compute.instanceAdmin.v1" members = [ "serviceAccount:477921717275@cloudservices.gserviceaccount.com", ] }
注意:不要使用google_project_iam_policy资源(会完全替换项目IAM策略),否则会丢失该绑定权限。
3. 明确资源依赖关系
确保自定义节点池在集群创建完成后再启动创建,避免时序问题:
resource "google_container_node_pool" "custom_pool" { name = "custom-pool" cluster = google_container_cluster.prod_app_cluster.name location = google_container_cluster.prod_app_cluster.location node_count = 3 # 其他节点池配置... depends_on = [google_container_cluster.prod_app_cluster] }
内容的提问来源于stack exchange,提问作者Harout

