Mulai cepat: Membuat kluster Kubernetes dengan Azure Kubernetes Service menggunakan Terraform

Artikel diuji dengan versi penyedia Terraform dan Terraform berikut:

Terraform memungkinkan definisi, pratinjau, dan penyebaran infrastruktur cloud. Menggunakan Terraform, Anda membuat file konfigurasi menggunakan sintaksis HCL. Sintaksis HCL memungkinkan Anda untuk menentukan penyedia cloud - seperti Azure - dan elemen yang membentuk infrastruktur cloud Anda. Setelah membuat file konfigurasi, Anda membuat rencana eksekusi yang memungkinkan Anda untuk melihat pratinjau perubahan infrastruktur Anda sebelum disebarkan. Setelah memverifikasi perubahan, Anda menerapkan rencana eksekusi untuk menyebarkan infrastruktur.

Azure Kubernetes Service (AKS) mengelola lingkungan Kube yang dihosting. Dengan AKS, Anda dapat menyebarkan dan mengelola aplikasi dalam kontainer tanpa keahlian pengaturan kontainer. AKS juga memungkinkan Anda untuk melakukan banyak operasi pemeliharaan umum tanpa membuat aplikasi Anda offline. Operasi ini meliputi provisi, peningkatan, dan penskalaan sumber daya sesuai permintaan.

Dalam artikel ini, Anda akan mempelajari cara:

  • Gunakan HCL (HashiCorp Language) untuk menentukan kluster Kubernetes
  • Gunakan Terraform dan AKS untuk membuat kluster Kubernetes
  • Gunakan alat kubectl untuk menguji ketersediaan kluster Kubernetes

Catatan

Kode contoh dalam artikel ini terletak di repositori GitHub Terraform Microsoft.

Prasyarat

  • Langganan Azure: Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum memulai.

Menerapkan kode Terraform

  1. Buat direktori untuk menguji dan menjalankan kode Terraform sampel dan menjadikannya direktori saat ini.

  2. Buat file bernama providers.tf dan masukkan kode berikut:

    terraform {
      required_version = ">=1.0"
    
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>3.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~>3.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. Buat file bernama main.tf dan masukkan kode berikut:

    # Generate random resource group name
    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    resource "azurerm_resource_group" "rg" {
      location = var.resource_group_location
      name     = random_pet.rg_name.id
    }
    
    resource "random_id" "log_analytics_workspace_name_suffix" {
      byte_length = 8
    }
    
    resource "azurerm_log_analytics_workspace" "test" {
      location            = var.log_analytics_workspace_location
      # The WorkSpace name has to be unique across the whole of azure;
      # not just the current subscription/tenant.
      name                = "${var.log_analytics_workspace_name}-${random_id.log_analytics_workspace_name_suffix.dec}"
      resource_group_name = azurerm_resource_group.rg.name
      sku                 = var.log_analytics_workspace_sku
    }
    
    resource "azurerm_log_analytics_solution" "test" {
      location              = azurerm_log_analytics_workspace.test.location
      resource_group_name   = azurerm_resource_group.rg.name
      solution_name         = "ContainerInsights"
      workspace_name        = azurerm_log_analytics_workspace.test.name
      workspace_resource_id = azurerm_log_analytics_workspace.test.id
    
      plan {
        product   = "OMSGallery/ContainerInsights"
        publisher = "Microsoft"
      }
    }
    
    resource "azurerm_kubernetes_cluster" "k8s" {
      location            = azurerm_resource_group.rg.location
      name                = var.cluster_name
      resource_group_name = azurerm_resource_group.rg.name
      dns_prefix          = var.dns_prefix
      tags                = {
        Environment = "Development"
      }
    
      default_node_pool {
        name       = "agentpool"
        vm_size    = "Standard_D2_v2"
        node_count = var.agent_count
      }
      linux_profile {
        admin_username = "ubuntu"
    
        ssh_key {
          key_data = file(var.ssh_public_key)
        }
      }
      network_profile {
        network_plugin    = "kubenet"
        load_balancer_sku = "standard"
      }
      service_principal {
        client_id     = var.aks_service_principal_app_id
        client_secret = var.aks_service_principal_client_secret
      }
    }
    
  4. Buat file bernama variables.tf dan masukkan kode berikut:

    variable "agent_count" {
      default = 3
    }
    
    # The following two variable declarations are placeholder references.
    # Set the values for these variable in terraform.tfvars
    variable "aks_service_principal_app_id" {
      default = ""
    }
    
    variable "aks_service_principal_client_secret" {
      default = ""
    }
    
    variable "cluster_name" {
      default = "k8stest"
    }
    
    variable "dns_prefix" {
      default = "k8stest"
    }
    
    # Refer to https://azure.microsoft.com/global-infrastructure/services/?products=monitor for available Log Analytics regions.
    variable "log_analytics_workspace_location" {
      default = "eastus"
    }
    
    variable "log_analytics_workspace_name" {
      default = "testLogAnalyticsWorkspaceName"
    }
    
    # Refer to https://azure.microsoft.com/pricing/details/monitor/ for Log Analytics pricing
    variable "log_analytics_workspace_sku" {
      default = "PerGB2018"
    }
    
    variable "resource_group_location" {
      default     = "eastus"
      description = "Location of the resource group."
    }
    
    variable "resource_group_name_prefix" {
      default     = "rg"
      description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
    }
    
    variable "ssh_public_key" {
      default = "~/.ssh/id_rsa.pub"
    }
    
  5. Buat file bernama outputs.tf dan masukkan kode berikut:

    output "client_certificate" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].client_certificate
      sensitive = true
    }
    
    output "client_key" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].client_key
      sensitive = true
    }
    
    output "cluster_ca_certificate" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].cluster_ca_certificate
      sensitive = true
    }
    
    output "cluster_password" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].password
      sensitive = true
    }
    
    output "cluster_username" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].username
      sensitive = true
    }
    
    output "host" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config[0].host
      sensitive = true
    }
    
    output "kube_config" {
      value     = azurerm_kubernetes_cluster.k8s.kube_config_raw
      sensitive = true
    }
    
    output "resource_group_name" {
      value = azurerm_resource_group.rg.name
    }
    
  6. Buat file bernama terraform.tfvars dan masukkan kode berikut.

    aks_service_principal_app_id = "<service_principal_app_id>"
    aks_service_principal_client_secret = "<service_principal_password>"
    

Inisialisasi Terraform

Jalankan terraform init untuk menginisialisasi penyebaran Terraform. Perintah ini mengunduh penyedia Azure yang diperlukan untuk mengelola sumber daya Azure Anda.

terraform init

Buat rencana eksekusi Terraform

Jalankan terraform plan untuk membuat rencana eksekusi.

terraform plan -out main.tfplan

Poin-poin penting:

  • Perintah terraform plan membuat rencana eksekusi tetapi tidak menjalankannya. Perintah ini justru menentukan tindakan yang diperlukan untuk membuat konfigurasi yang ditentukan dalam file konfigurasi Anda. Pola ini memungkinkan Anda memastikan apakah rencana eksekusi telah sesuai dengan ekspektasi Anda sebelum membuat perubahan pada sumber daya aktual.
  • Parameter -out opsional memungkinkan Anda menentukan file output untuk rencana. Menggunakan parameter -out memastikan bahwa rencana yang Anda tinjau benar-benar sesuai dengan yang diterapkan.
  • Untuk membaca selengkapnya rencana eksekusi dan keamanan yang terus berlanjut, lihat bagian peringatan keamanan.

Terapkan rencana eksekusi Terraform

Jalankan terraform apply untuk menerapkan rencana eksekusi ke infrastruktur cloud Anda.

terraform apply main.tfplan

Poin-poin penting:

  • Perintah terraform apply di atas mengasumsikan bahwa Anda telah menjalankan terraform plan -out main.tfplan sebelumnya.
  • Jika Anda menentukan nama file yang berbeda untuk parameter -out, gunakan nama file yang sama dalam panggilan ke terraform apply.
  • Jika Anda tidak menggunakan parameter -out, panggil terraform apply tanpa parameter apa pun.

Memverifikasi hasil

  1. Dapatkan nama grup sumber daya.

    echo "$(terraform output resource_group_name)"
    
  2. Telusuri ke portal Microsoft Azure.

  3. Di bawah Layanan Azure, pilih Grup sumber daya dan temukan grup sumber daya baru Anda untuk melihat sumber daya berikut yang dibuat dalam demo ini:

    • Solusi: Secara default, demo menamai solusi ini ContainerInsights. Portal akan menampilkan nama ruang kerja solusi dalam tanda kurung.
    • Layanan Kubernetes: Secara default, demo menamai layanan ini k8stest. (Kluster Kubernetes Terkelola juga dikenal sebagai AKS / Azure Kubernetes Service.)
    • Ruang Kerja Analitik Log: Secara default, demo menamai ruang kerja ini dengan awalan TestLogAnalyticsWorkspaceName- diikuti dengan angka acak.
  4. Dapatkan konfigurasi Kubernetes dari status Terraform dan simpan dalam file yang dapat dibaca kubectl.

    echo "$(terraform output kube_config)" > ./azurek8s
    
  5. Verifikasi bahwa perintah sebelumnya tidak menambahkan karakter ASCII EOT.

    cat ./azurek8s
    

    Poin-poin penting:

    • Jika Anda melihat << EOT di awal dan EOT di akhir, hapus karakter ini dari file . Jika tidak, Anda dapat menerima pesan kesalahan berikut: error: error loading config file "./azurek8s": yaml: line 2: mapping values are not allowed in this context
  6. Atur variabel lingkungan sehingga kubectl memilih konfigurasi yang benar.

    export KUBECONFIG=./azurek8s
    
  7. Verifikasi kesehatan kluster.

    kubectl get nodes
    

    Alat kubectl memungkinkan Anda memverifikasi kesehatan kluster Kubernetes

Poin-poin penting:

  • Ketika kluster AKS dibuat, pemantauan diaktifkan untuk mengambil metrik kesehatan baik bagi node kluster maupun pod. Metrik kesehatan tersebut tersedia di portal Azure. Untuk informasi lebih lanjut tentang pemantauan kesehatan kontainer, lihat Memantau kesehatan Azure Kubernetes Service.
  • Beberapa nilai kunci adalah output saat Anda menerapkan rencana eksekusi Terraform. Misalnya, alamat host, nama pengguna kluster AKS, dan kata sandi kluster AKS adalah output.
  • Untuk melihat semua nilai output, jalankan terraform output.
  • Untuk melihat nilai output tertentu, jalankan echo "$(terraform output <output_value_name>)".

Membersihkan sumber daya

Menghapus sumber daya AKS

Ketika Anda tidak lagi membutuhkan sumber daya yang dibuat melalui Terraform, lakukan langkah-langkah berikut:

  1. Jalankan terraform plan dan tentukan bendera destroy.

    terraform plan -destroy -out main.destroy.tfplan
    

    Poin-poin penting:

    • Perintah terraform plan membuat rencana eksekusi tetapi tidak menjalankannya. Perintah ini justru menentukan tindakan yang diperlukan untuk membuat konfigurasi yang ditentukan dalam file konfigurasi Anda. Pola ini memungkinkan Anda memastikan apakah rencana eksekusi telah sesuai dengan ekspektasi Anda sebelum membuat perubahan pada sumber daya aktual.
    • Parameter -out opsional memungkinkan Anda menentukan file output untuk rencana. Menggunakan parameter -out memastikan bahwa rencana yang Anda tinjau benar-benar sesuai dengan yang diterapkan.
    • Untuk membaca selengkapnya rencana eksekusi dan keamanan yang terus berlanjut, lihat bagian peringatan keamanan.
  2. Jalankan terraform apply untuk menerapkan rencana eksekusi.

    terraform apply main.destroy.tfplan
    

Menghapus perwakilan layanan

Perhatian

Hapus perwakilan layanan yang Anda gunakan dalam demo ini hanya jika Anda tidak menggunakannya untuk hal lain.

  1. Jalankan az ad sp list untuk mendapatkan ID objek dari perwakilan layanan.

    az ad sp list --display-name "<display_name>" --query "[].{\"Object ID\":id}" --output table
    
    
  2. Jalankan az ad sp delete untuk menghapus perwakilan layanan.

    az ad sp delete --id <service_principal_object_id>
    

Memecahkan masalah Terraform pada Azure

Memecahkan masalah umum saat menggunakan Terraform di Azure

Langkah berikutnya