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.
Mengonfigurasi Terraform: Jika Anda belum melakukannya, konfigurasikan Terraform menggunakan salah satu opsi berikut:
Perwakilan layanan Azure: Jika Anda tidak memiliki perwakilan layanan, buat perwakilan layanan. Catat
appId
,display_name
,password
, dantenant
.Pasangan kunci SSH: Gunakan salah satu artikel berikut ini:
Alat baris perintah Kube (kubectl):Unduh kubectl.
Menerapkan kode Terraform
Buat direktori untuk menguji dan menjalankan kode Terraform sampel dan menjadikannya direktori saat ini.
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 {} }
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 } }
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" }
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 }
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 menjalankanterraform plan -out main.tfplan
sebelumnya. - Jika Anda menentukan nama file yang berbeda untuk parameter
-out
, gunakan nama file yang sama dalam panggilan keterraform apply
. - Jika Anda tidak menggunakan parameter
-out
, panggilterraform apply
tanpa parameter apa pun.
Memverifikasi hasil
Dapatkan nama grup sumber daya.
echo "$(terraform output resource_group_name)"
Telusuri ke portal Microsoft Azure.
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.
Dapatkan konfigurasi Kubernetes dari status Terraform dan simpan dalam file yang dapat dibaca kubectl.
echo "$(terraform output kube_config)" > ./azurek8s
Verifikasi bahwa perintah sebelumnya tidak menambahkan karakter ASCII EOT.
cat ./azurek8s
Poin-poin penting:
- Jika Anda melihat
<< EOT
di awal danEOT
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
- Jika Anda melihat
Atur variabel lingkungan sehingga kubectl memilih konfigurasi yang benar.
export KUBECONFIG=./azurek8s
Verifikasi kesehatan kluster.
kubectl get nodes
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:
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.
- Perintah
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.
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
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