Search code examples
terraformgoogle-kubernetes-engineterraform-provider-gcp

How to update cluster and node version explicitly in gke using terraform


I am creating gke cluster using terraform my requirement to provide cluster and node version explicitly. I am using data source to get those version tried many option not able to provide cluster and node version

Data block

data "google_container_engine_versions" "gke_version" {
  location       = us-central1-a
  version_prefix = "1.25."
}

Cluster creation resource block

resource "google_container_cluster" "gke" {
  name     = var.cluster_name
  location = var.cluster_location
  networking_mode = var.networking_mode
  network         = var.network
  subnetwork      = var.subnetwork
  remove_default_node_pool = var.remove_default_node_pool
  initial_node_count       = var.initial_node_count 
  ip_allocation_policy {
    cluster_secondary_range_name  = var.cluster_secondary_range_name
    services_secondary_range_name = var.services_secondary_range_name
  }
}

Node creation resource block

resource "google_container_node_pool" "permanent" {
  name       = var.permanent_pool_name
  cluster    = google_container_cluster.gke.id
  node_count = var.permanent_node_count
  management {
    auto_repair  = var.auto_repair
    auto_upgrade = var.auto_upgrade
  }
  node_config {
    preemptible = var.permanent_preemptible
    machine_type = var.permanent_machine_type
    disk_size_gb = var.permanent_disk_size_gb
    disk_type = var.gke_disk_type
    labels = {
      type = var.permanent_labels
    }
    
    service_account = var.svc_account
    oauth_scopes = [var.oauth_scopes]
  }
}

How can I provide cluster and node version on these respective resource block ?


Solution

  • You should be able to create a cluster and nodepool with the latest 1.25.x version if you make these changes:

    Cluster creation resource block

    resource "google_container_cluster" "gke" {
      name     = var.cluster_name
      location = var.cluster_location
      networking_mode    = var.networking_mode
      network            = var.network
      subnetwork         = var.subnetwork
      initial_node_count = var.initial_node_count
    
      ip_allocation_policy {
        cluster_secondary_range_name  = var.cluster_secondary_range_name
        services_secondary_range_name = var.services_secondary_range_name
      }
    
      // changed:
      remove_default_node_pool = true
      min_master_version       = data.google_container_engine_versions.gke_version.latest_master_version
      release_channel {
        channel = "UNSPECIFIED"
      }
    }
    

    Node creation resource block

    resource "google_container_node_pool" "permanent" {
      name       = var.permanent_pool_name
      cluster    = google_container_cluster.gke.id
      node_count = var.permanent_node_count
      
      node_config {
        preemptible = var.permanent_preemptible
        machine_type = var.permanent_machine_type
        disk_size_gb = var.permanent_disk_size_gb
        disk_type = var.gke_disk_type
        labels = {
          type = var.permanent_labels
        }
        
        service_account = var.svc_account
        oauth_scopes = [var.oauth_scopes]
      }
    
    
      //changed:
      management {
        auto_repair  = var.auto_repair
        auto_upgrade = false
      }
      version = data.google_container_engine_versions.gke_version.latest_node_version
    }