Membuat cluster dan men-deploy workload menggunakan Terraform


Cluster Kubernetes menyediakan layanan komputasi, penyimpanan, jaringan, dan lainnya untuk aplikasi, mirip dengan pusat data virtual. Aplikasi dan layanan terkait yang berjalan di Kubernetes disebut workload.

Tutorial ini memungkinkan Anda melihat cluster Google Kubernetes Engine yang sedang berjalan dan contoh beban kerja dengan cepat, yang semuanya disiapkan menggunakan Terraform. Kemudian, Anda dapat menjelajahi beban kerja di konsol Google Cloud sebelum melanjutkan ke jalur pembelajaran yang lebih mendalam, atau untuk mulai merencanakan dan membuat cluster siap produksi Anda sendiri. Tutorial ini mengasumsikan bahwa Anda sudah memahami Terraform.

Jika Anda lebih memilih untuk menyiapkan cluster dan beban kerja contoh di konsol Google Cloud, lihat Membuat cluster di konsol Google Cloud.

Sebelum memulai

Lakukan langkah-langkah berikut untuk mengaktifkan Kubernetes Engine API:

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Aktifkan API GKE.

    Mengaktifkan API

  5. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Aktifkan API GKE.

    Mengaktifkan API

  8. Make sure that you have the following role or roles on the project: roles/container.admin, roles/compute.networkAdmin, roles/iam.serviceAccountUser

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role colunn to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      Buka IAM
    2. Pilih project.
    3. Klik Berikan akses.
    4. Di kolom New principals, masukkan ID pengguna Anda. Ini biasanya adalah alamat email untuk Akun Google.

    5. Di daftar Pilih peran, pilih peran.
    6. Untuk memberikan peran tambahan, klik Tambahkan peran lain, lalu tambahkan setiap peran tambahan.
    7. Klik Simpan.

Menyiapkan lingkungan

Dalam tutorial ini, Anda akan menggunakan Cloud Shell untuk mengelola resource yang dihosting di Google Cloud. Cloud Shell telah diinstal dengan software yang Anda perlukan untuk tutorial ini, termasuk Terraform, kubectl, dan Google Cloud CLI.

  1. Luncurkan sesi Cloud Shell dari konsol Google Cloud, dengan mengklik ikon aktivasi Cloud Shell Activate Cloud Shell Tombol Activate Shell. Tindakan ini akan meluncurkan sesi di panel bawah konsol Google Cloud.

    Kredensial layanan yang terkait dengan virtual machine ini bersifat otomatis, sehingga Anda tidak perlu menyiapkan atau mendownload kunci akun layanan.

  2. Sebelum menjalankan perintah, tetapkan project default Anda di gcloud CLI menggunakan perintah berikut:

    gcloud config set project PROJECT_ID
    

    Ganti PROJECT_ID dengan project ID Anda.

  3. Buat clone repositori GitHub:

    git clone https://github.com/terraform-google-modules/terraform-docs-samples.git --single-branch
    
  4. Ubah ke direktori kerja:

    cd terraform-docs-samples/gke/quickstart/autopilot
    

Meninjau file Terraform

Penyedia Google Cloud adalah plugin yang memungkinkan Anda mengelola dan menyediakan resource Google Cloud menggunakan Terraform. Terraform berfungsi sebagai jembatan antara konfigurasi Terraform dan Google Cloud API, sehingga Anda dapat menentukan resource infrastruktur secara deklaratif, seperti virtual machine dan jaringan.

Cluster dan aplikasi contoh untuk tutorial ini ditentukan dalam dua file Terraform yang menggunakan penyedia Google Cloud dan Kubernetes.

  1. Tinjau file cluster.tf:

    cat cluster.tf
    

    Outputnya mirip dengan yang berikut ini

    resource "google_compute_network" "default" {
      name = "example-network"
    
      auto_create_subnetworks  = false
      enable_ula_internal_ipv6 = true
    }
    
    resource "google_compute_subnetwork" "default" {
      name = "example-subnetwork"
    
      ip_cidr_range = "10.0.0.0/16"
      region        = "us-central1"
    
      stack_type       = "IPV4_IPV6"
      ipv6_access_type = "INTERNAL" # Change to "EXTERNAL" if creating an external loadbalancer
    
      network = google_compute_network.default.id
      secondary_ip_range {
        range_name    = "services-range"
        ip_cidr_range = "192.168.0.0/24"
      }
    
      secondary_ip_range {
        range_name    = "pod-ranges"
        ip_cidr_range = "192.168.1.0/24"
      }
    }
    
    resource "google_container_cluster" "default" {
      name = "example-autopilot-cluster"
    
      location                 = "us-central1"
      enable_autopilot         = true
      enable_l4_ilb_subsetting = true
    
      network    = google_compute_network.default.id
      subnetwork = google_compute_subnetwork.default.id
    
      ip_allocation_policy {
        stack_type                    = "IPV4_IPV6"
        services_secondary_range_name = google_compute_subnetwork.default.secondary_ip_range[0].range_name
        cluster_secondary_range_name  = google_compute_subnetwork.default.secondary_ip_range[1].range_name
      }
    
      # Set `deletion_protection` to `true` will ensure that one cannot
      # accidentally delete this instance by use of Terraform.
      deletion_protection = false
    }

    File ini menjelaskan resource berikut:

  2. Tinjau file app.tf:

    cat app.tf
    

    Outputnya mirip dengan hal berikut ini:

    data "google_client_config" "default" {}
    
    provider "kubernetes" {
      host                   = "https://${google_container_cluster.default.endpoint}"
      token                  = data.google_client_config.default.access_token
      cluster_ca_certificate = base64decode(google_container_cluster.default.master_auth[0].cluster_ca_certificate)
    
      ignore_annotations = [
        "^autopilot\\.gke\\.io\\/.*",
        "^cloud\\.google\\.com\\/.*"
      ]
    }
    
    resource "kubernetes_deployment_v1" "default" {
      metadata {
        name = "example-hello-app-deployment"
      }
    
      spec {
        selector {
          match_labels = {
            app = "hello-app"
          }
        }
    
        template {
          metadata {
            labels = {
              app = "hello-app"
            }
          }
    
          spec {
            container {
              image = "us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0"
              name  = "hello-app-container"
    
              port {
                container_port = 8080
                name           = "hello-app-svc"
              }
    
              security_context {
                allow_privilege_escalation = false
                privileged                 = false
                read_only_root_filesystem  = false
    
                capabilities {
                  add  = []
                  drop = ["NET_RAW"]
                }
              }
    
              liveness_probe {
                http_get {
                  path = "/"
                  port = "hello-app-svc"
    
                  http_header {
                    name  = "X-Custom-Header"
                    value = "Awesome"
                  }
                }
    
                initial_delay_seconds = 3
                period_seconds        = 3
              }
            }
    
            security_context {
              run_as_non_root = true
    
              seccomp_profile {
                type = "RuntimeDefault"
              }
            }
    
            # Toleration is currently required to prevent perpetual diff:
            # https://github.com/hashicorp/terraform-provider-kubernetes/pull/2380
            toleration {
              effect   = "NoSchedule"
              key      = "kubernetes.io/arch"
              operator = "Equal"
              value    = "amd64"
            }
          }
        }
      }
    }
    
    resource "kubernetes_service_v1" "default" {
      metadata {
        name = "example-hello-app-loadbalancer"
        annotations = {
          "networking.gke.io/load-balancer-type" = "Internal" # Remove to create an external loadbalancer
        }
      }
    
      spec {
        selector = {
          app = kubernetes_deployment_v1.default.spec[0].selector[0].match_labels.app
        }
    
        ip_family_policy = "RequireDualStack"
    
        port {
          port        = 80
          target_port = kubernetes_deployment_v1.default.spec[0].template[0].spec[0].container[0].port[0].name
        }
    
        type = "LoadBalancer"
      }
    
      depends_on = [time_sleep.wait_service_cleanup]
    }
    
    # Provide time for Service cleanup
    resource "time_sleep" "wait_service_cleanup" {
      depends_on = [google_container_cluster.default]
    
      destroy_duration = "180s"
    }

    File ini menjelaskan resource berikut:

(Opsional) Mengekspos aplikasi ke internet

File Terraform untuk contoh ini menjelaskan aplikasi dengan alamat IP internal, yang hanya dapat diakses dari Virtual Private Cloud (VPC) yang sama dengan aplikasi contoh. Jika Anda ingin mengakses antarmuka web aplikasi demo yang sedang berjalan dari internet (misalnya, dari laptop), ubah file Terraform untuk membuat alamat IP publik sebelum membuat cluster. Anda dapat melakukannya menggunakan editor teks langsung di Cloud Shell atau menggunakan Cloud Shell Editor.

Untuk mengekspos aplikasi demo ke internet:

  1. Di cluster.tf, ubah ipv6_access_type dari INTERNAL menjadi EXTERNAL.

    ipv6_access_type = "EXTERNAL"
    
  2. Di app.tf, konfigurasikan load balancer eksternal dengan menghapus anotasi networking.gke.io/load-balancer-type.

     annotations = {
       "networking.gke.io/load-balancer-type" = "Internal" # Remove this line
     }
    

Membuat cluster dan men-deploy aplikasi

  1. Di Cloud Shell, jalankan perintah ini untuk memverifikasi bahwa Terraform tersedia:

    terraform
    

    Outputnya akan mirip dengan berikut ini:

    Usage: terraform [global options] <subcommand> [args]
    
    The available commands for execution are listed below.
    The primary workflow commands are given first, followed by
    less common or more advanced commands.
    
    Main commands:
      init          Prepare your working directory for other commands
      validate      Check whether the configuration is valid
      plan          Show changes required by the current configuration
      apply         Create or update infrastructure
      destroy       Destroy previously-created infrastructure
    
  2. Lakukan inisialisasi Terraform:

    terraform init
    
  3. Rencanakan konfigurasi Terraform:

    terraform plan
    
  4. Menerapkan konfigurasi Terraform

    terraform apply
    

    Saat diminta, masukkan yes untuk mengonfirmasi tindakan. Pemrosesan perintah ini mungkin memerlukan waktu beberapa menit. Outputnya mirip dengan hal berikut ini:

    Apply complete! Resources: 6 added, 0 changed, 0 destroyed.
    

Memverifikasi bahwa cluster berfungsi

Lakukan hal berikut untuk mengonfirmasi bahwa cluster Anda berjalan dengan benar:

  1. Buka halaman Workloads di konsol Google Cloud:

    Buka Workloads

  2. Klik workload example-hello-app-deployment. Halaman detail Pod akan ditampilkan. Halaman ini menampilkan informasi tentang Pod, seperti anotasi, penampung yang berjalan di Pod, Layanan yang mengekspos Pod, dan metrik termasuk penggunaan CPU, Memori, dan Disk.

  3. Buka halaman Services & Ingress di konsol Google Cloud:

    Buka Services & Ingress

  4. Klik Layanan LoadBalancer example-hello-app-loadbalancer. Halaman detail Layanan akan ditampilkan. Halaman ini menampilkan informasi tentang Layanan, seperti Pod yang terkait dengan Layanan, dan Port yang digunakan Layanan.

  5. Di bagian Endpoint eksternal, klik link IPv4 atau link IPv6 untuk melihat Layanan Anda di browser. Outputnya mirip dengan hal berikut ini:

    Hello, world!
    Version: 2.0.0
    Hostname: example-hello-app-deployment-5df979c4fb-kdwgr
    

Pembersihan

Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang digunakan pada halaman ini, ikuti langkah-langkah berikut.

Jika Anda berencana untuk mengikuti tutorial tambahan atau menjelajahi sampel lebih lanjut, tunggu hingga Anda selesai untuk melakukan langkah pembersihan ini.

  • Di Cloud Shell, jalankan perintah berikut untuk menghapus resource Terraform:

    terraform destroy --auto-approve
    

Memecahkan masalah error pembersihan

Jika Anda melihat pesan error yang mirip dengan The network resource 'projects/PROJECT_ID/global/networks/example-network' is already being used by 'projects/PROJECT_ID/global/firewalls/example-network-yqjlfql57iydmsuzd4ot6n5v', lakukan tindakan berikut:

  1. Hapus aturan Firewall:

    gcloud compute firewall-rules list --filter="NETWORK:example-network" --format="table[no-heading](name)" | xargs gcloud --quiet compute firewall-rules delete
    
  2. Jalankan kembali perintah Terraform:

    terraform destroy --auto-approve
    

Langkah selanjutnya