【GKE】Terraformでクラスタを生成するときの注意点

2022/02/23に公開

発端

Terraformでクラスタを立ち上げて、PodやService、IngressといったKubernetesリソースをデプロイを完了し、GCPのコンソール上で、ヘルスチェックをしていたときに、以下の問題に気が付きました。

発生した問題

「Ingressの詳細」に表示されているログを確認すると、以下のようなエラーが発生していました。

Error 400: Invalid value for field 'resource.IPAddress': 'xxx.xxx.xxx.xxx'. Specified IP address 10.0.2.3 doesn't belong to the (sub)network default or to the instance gke-xxx-xxx-...

解決策

やはりドキュメントをよく読んでおくべきでした。
https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/using_gke_with_terraform#vpc-native-clusters
gcloudやGoogle Console上でクラスタを生成する場合は、デフォルトでVPC-nativeになっていますが、Terraformでクラスタを構築する場合は、デフォルトではroutes-basedなクラスタとして生成されます。

VPC-nativeなクラスタを生成するため、以下のように修正。

network.tf
resource "google_compute_subnetwork" "custom" {
  name          = "run-subnetwork"
  ip_cidr_range = "10.2.0.0/16"
  region        = var.region
  network       = google_compute_network.custom.id
  secondary_ip_range {
    range_name    = "services-range"
    ip_cidr_range = "192.168.1.0/24"
  }

  secondary_ip_range {
    range_name    = "pod-ranges"
    ip_cidr_range = "192.168.64.0/22"
  }
}

resource "google_compute_network" "custom" {
  name                    = "run-network"
  auto_create_subnetworks = false
}
cluster.tf
resource "google_container_cluster" "primary" {
  name     = "my-gke-cluster"
  location = var.location

  remove_default_node_pool = true
  initial_node_count       = 1

  network    = google_compute_network.custom.id
  subnetwork = google_compute_subnetwork.custom.id

  ip_allocation_policy {
    cluster_secondary_range_name  = "pod-ranges"
    services_secondary_range_name = "services-range"
  }
}

resource "google_container_node_pool" "primary_nodes" {
  name       = "my-gke-node-pool"
  location   = var.location
  cluster    = google_container_cluster.primary.name
  node_count = 1

  node_config {
    machine_type = "e2-medium"
    service_account = google_service_account.default.email
    oauth_scopes = [
      "https://www.googleapis.com/auth/cloud-platform"
    ]
  }
}

resource "google_container_node_pool" "primary_preemptible_nodes" {
  name       = "my-gke-preemptible-node-pool"
  location   = var.location
  cluster    = google_container_cluster.primary.name
  node_count = 1

  node_config {
    preemptible  = true
    machine_type = "e2-medium"
    service_account = google_service_account.default.email
    oauth_scopes = [
      "https://www.googleapis.com/auth/cloud-platform"
    ]
  }
}

Discussion