如何使用 Terraform 创建一个健康的 VPC-Native GKE 集群?

Posted

技术标签:

【中文标题】如何使用 Terraform 创建一个健康的 VPC-Native GKE 集群?【英文标题】:How to create a healthy VPC-Native GKE cluster with Terraform? 【发布时间】:2021-09-20 16:54:39 【问题描述】:

通过 Terraform,我正在尝试在单个区域 (europe-north1-b) 中创建一个 VPC-Native GKE 集群,该集群具有一个单独的节点池,GKE 集群和节点池位于它们自己的 VPC 网络中。

我的代码如下所示:

resource "google_container_cluster" "gke_cluster" 
  description              = "GKE Cluster for personal projects"
  initial_node_count       = 1
  location                 = "europe-north1-b"
  name                     = "prod"
  network                  = google_compute_network.gke.self_link
  remove_default_node_pool = true
  subnetwork               = google_compute_subnetwork.gke.self_link

  ip_allocation_policy 
    cluster_secondary_range_name  = local.cluster_secondary_range_name
    services_secondary_range_name = local.services_secondary_range_name
  


resource "google_compute_network" "gke" 
  auto_create_subnetworks         = false
  delete_default_routes_on_create = false
  description                     = "Compute Network for GKE nodes"
  name                            = "$terraform.workspace-gke"
  routing_mode                    = "GLOBAL"


resource "google_compute_subnetwork" "gke" 
  name          = "prod-gke-subnetwork"
  ip_cidr_range = "10.255.0.0/16"
  region        = "europe-north1"
  network       = google_compute_network.gke.id

  secondary_ip_range 
    range_name    = local.cluster_secondary_range_name
    ip_cidr_range = "10.0.0.0/10"
  

  secondary_ip_range 
    range_name    = local.services_secondary_range_name
    ip_cidr_range = "10.64.0.0/10"
  


locals 
  cluster_secondary_range_name  = "cluster-secondary-range"
  services_secondary_range_name = "services-secondary-range"


resource "google_container_node_pool" "gke_node_pool" 
  cluster    = google_container_cluster.gke_cluster.name
  location   = "europe-north1-b"
  name       = terraform.workspace
  node_count = 1
  
  node_locations = [
    "europe-north1-b"
  ]

  node_config 
    disk_size_gb    = 100
    disk_type       = "pd-standard"
    image_type      = "cos_containerd"
    local_ssd_count = 0
    machine_type    = "g1-small"
    preemptible     = false
    service_account = google_service_account.gke_node_pool.email
  


resource "google_service_account" "gke_node_pool" 
  account_id   = "$terraform.workspace-node-pool"
  description  = "The default service account for pods to use in $terraform.workspace"
  display_name = "GKE Node Pool $terraform.workspace Service Account"


resource "google_project_iam_member" "gke_node_pool" 
  member = "serviceAccount:$google_service_account.gke_node_pool.email"
  role   = "roles/viewer"

但是,每当我应用此 Terraform 代码时,都会收到以下错误:

google_container_cluster.gke_cluster: Still creating... [24m30s elapsed]
google_container_cluster.gke_cluster: Still creating... [24m40s elapsed]
╷
│ Error: Error waiting for creating GKE cluster: All cluster resources were brought up, but: component "kube-apiserver" from endpoint "gke-xxxxxxxxxxxxxxxxxxxx-yyyy" is unhealthy.
│ 
│   with google_container_cluster.gke_cluster,
│   on gke.tf line 1, in resource "google_container_cluster" "gke_cluster":
│    1: resource "google_container_cluster" "gke_cluster" 
│ 
╵

然后我的集群会被自动删除。

我发现我的 Terraform 代码/语法没有问题,并通过 Google Cloud Logging 进行搜索以找到更详细的错误消息,但没有运气。

那么,如何使用 Terraform 创建 HEALTHY VPC-Native GKE 集群?

【问题讨论】:

【参考方案1】:

事实证明,问题似乎在于具有较大的子网二级范围。

如问题所示,我有范围:

10.0.0.0/10cluster_secondary_range10.64.0.0/10services_secondary_range

这些/10 CIDR 每个都包含4194304 IP 地址,我认为这些地址对于 Google/GKE 来说可能太大了(?) - 特别是因为所有 GKE 文档都使用 CIDR 覆盖了更小的集群范围和服务。

我决定缩小这些 CIDR 范围,看看是否有帮助:

10.0.0.0/12cluster_secondary_range10.16.0.0/12services_secondary_range

这些/12 CIDR 分别覆盖1048576 IP 地址。 更改后我的集群创建成功:

google_container_cluster.gke_cluster: Creation complete after 5m40s

不确定为什么 Google / GKE 无法为集群和服务处理更大的 CIDR 范围,但 /12 对我来说已经足够了,并且可以成功创建集群。

【讨论】:

以上是关于如何使用 Terraform 创建一个健康的 VPC-Native GKE 集群?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 terraform 将负载均衡器添加到 ec2 实例

如何使用 if、else、elsif 语句创建 Terraform?

terraform如何创建数据盘

Terraform-如何避免使用单一状态文件进行破坏和创建

使用 terraform 如何创建一个跨多个项目使用的服务帐户?

如何使用 Terraform 在 OVH 上创建私有子网?