You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform创建GKE节点池时错误使用已删除的默认服务账号

问题原因与解决方案

核心问题

你遇到的问题源于两个关键因素:

  1. Terraform配置冲突:当设置remove_default_node_pool = true时,你同时指定了initial_node_count = 1,这会强制GKE先创建默认节点池(即使后续会删除它),而这个默认节点池会尝试使用已被删除的默认服务账号1234@cloudservices.gserviceaccount.com,触发权限校验失败。
  2. 默认服务账号不可用: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控制台创建集群时:

  1. 进入“节点池”配置步骤,取消勾选“创建默认节点池”选项
  2. 手动添加自定义节点池,在“服务账号”下拉菜单中选择你的自定义SA
  3. 确认自定义SA已配置好上述必要权限

内容的提问来源于stack exchange,提问作者user38643

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:45:07