Terraform创建GKE节点池时错误使用已删除的默认服务账号
问题原因与解决方案
核心问题
你遇到的问题源于两个关键因素:
- Terraform配置冲突:当设置
remove_default_node_pool = true时,你同时指定了initial_node_count = 1,这会强制GKE先创建默认节点池(即使后续会删除它),而这个默认节点池会尝试使用已被删除的默认服务账号1234@cloudservices.gserviceaccount.com,触发权限校验失败。 - 默认服务账号不可用:GKE默认节点池依赖的
PROJECT_NUMBER@cloudservices.gserviceaccount.com已被删除,且该账号无法恢复,必须使用自定义服务账号替代。
修正Terraform配置
步骤1:调整集群资源配置
修改google_container_cluster资源中的关键参数:
- 将
initial_node_count设为0(remove_default_node_pool = true时,不允许创建默认节点池) - 移除集群层级的
node_config(默认节点池会被删除,该配置无意义,应在自定义节点池中指定) - 移除
lifecycle.ignore_changes = [node_config](该配置会忽略节点配置修改,现已无需保留)
修正后的集群资源示例:
resource "google_container_cluster" "k8s-failover-cluster" { name = "k8s-failover-cluster" project = var.project location = var.region remove_default_node_pool = true initial_node_count = 0 # 必须设为0,避免创建默认节点池 network = var.cluster_network subnetwork = var.private_subnet_name deletion_protection = false networking_mode = "VPC_NATIVE" addons_config { http_load_balancing { disabled = true } horizontal_pod_autoscaling { disabled = false } } release_channel { channel = "REGULAR" } workload_identity_config { workload_pool = "${var.project}.svc.id.goog" } ip_allocation_policy { cluster_secondary_range_name = "k8s-pod-range" services_secondary_range_name = "k8s-service-range" } private_cluster_config { enable_private_nodes = true enable_private_endpoint = false master_ipv4_cidr_block = "172.16.0.0/28" } }
步骤2:确保自定义节点池配置正确
在node-pools.tf中,明确指定自定义服务账号:
resource "google_container_node_pool" "default_pool" { name = "default-pool" cluster = google_container_cluster.k8s-failover-cluster.name location = google_container_cluster.k8s-failover-cluster.location node_count = 1 node_config { service_account = data.google_service_account.gke_svc_acct.email oauth_scopes = [ "https://www.googleapis.com/auth/cloud-platform" ] # 可添加其他节点配置(如机器类型、磁盘大小等) } }
步骤3:验证自定义服务账号权限
确保你的自定义服务账号拥有GKE节点运行所需的权限,最便捷的方式是为其绑定roles/container.nodeServiceAgent角色,该角色包含compute.disks.create、compute.instances.create等所有必要权限。
控制台操作修正
在GCP控制台创建集群时:
- 进入“节点池”配置步骤,取消勾选“创建默认节点池”选项
- 手动添加自定义节点池,在“服务账号”下拉菜单中选择你的自定义SA
- 确认自定义SA已配置好上述必要权限
内容的提问来源于stack exchange,提问作者user38643
相关产品推荐
相关产品推荐

