快速入門:使用 Terraform 建立 Azure Kubernetes Service (AKS) 叢集
Azure Kubernetes Service (AKS) 是受控 Kubernetes 服務,可讓您快速部署及管理叢集。 在本快速入門中,您已:
- 使用 Terraform 部署 AKS 叢集。 範例程式碼會完整封裝,以便使用 AzAPI 提供者) 自動建立服務主體和 SSH 金鑰組 (。
- 在叢集上執行具備 Web 前端和 Redis 執行個體的範例多容器應用程式。
Terraform 可讓您定義、預覽和部署雲端基礎結構。 使用 Terraform 時,您可以使用 HCL 語法來建立設定檔。 HCL 語法可讓您指定雲端提供者 (例如 Azure) 和構成雲端基礎結構的元素。 建立設定檔之後,您可以建立執行計畫,讓您先預覽基礎結構變更,之後再部署。 驗證變更之後,您可以套用執行計畫來部署基礎結構。
在本文中,您將學會如何:
- 使用 random_pet為 Azure 資源組名建立隨機值。
- 使用 azurerm_resource_group建立 Azure 資源群組。
- 存取 AzureRM 提供者的組態,以使用 azurerm_client_config取得 Azure 物件識別碼。
- 使用 azurerm_kubernetes_cluster建立 Kubernetes 叢集。
- 建立 AzAPI 資源 azapi_resource。
- 使用 azapi_resource_action建立 AzAPI 資源來產生 SSH 金鑰組。
必要條件
Kubernetes 命令列工具 (kubectl) :Download kubectl。
實作 Terraform 程式碼
注意
本文的範例程式碼位於 Azure Terraform GitHub 存放庫中。 您可以檢視包含 目前和舊版 Terraform 測試結果的記錄檔。
建立目錄,然後在目錄中測試範例 Terraform 程式碼,並將其設為目前的目錄。
建立名為
providers.tf
的檔案,並插入下列程式碼:terraform { required_version = ">=1.0" required_providers { azapi = { source = "azure/azapi" version = "~>1.5" } azurerm = { source = "hashicorp/azurerm" version = "~>3.0" } random = { source = "hashicorp/random" version = "~>3.0" } time = { source = "hashicorp/time" version = "0.9.1" } } } provider "azurerm" { features {} }
建立名為
ssh.tf
的檔案,並插入下列程式碼:resource "random_pet" "ssh_key_name" { prefix = "ssh" separator = "" } resource "azapi_resource_action" "ssh_public_key_gen" { type = "Microsoft.Compute/sshPublicKeys@2022-11-01" resource_id = azapi_resource.ssh_public_key.id action = "generateKeyPair" method = "POST" response_export_values = ["publicKey", "privateKey"] } resource "azapi_resource" "ssh_public_key" { type = "Microsoft.Compute/sshPublicKeys@2022-11-01" name = random_pet.ssh_key_name.id location = azurerm_resource_group.rg.location parent_id = azurerm_resource_group.rg.id } output "key_data" { value = jsondecode(azapi_resource_action.ssh_public_key_gen.output).publicKey }
建立名為
main.tf
的檔案,並插入下列程式碼:# 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_pet" "azurerm_kubernetes_cluster_name" { prefix = "cluster" } resource "random_pet" "azurerm_kubernetes_cluster_dns_prefix" { prefix = "dns" } resource "azurerm_kubernetes_cluster" "k8s" { location = azurerm_resource_group.rg.location name = random_pet.azurerm_kubernetes_cluster_name.id resource_group_name = azurerm_resource_group.rg.name dns_prefix = random_pet.azurerm_kubernetes_cluster_dns_prefix.id identity { type = "SystemAssigned" } default_node_pool { name = "agentpool" vm_size = "Standard_D2_v2" node_count = var.node_count } linux_profile { admin_username = var.username ssh_key { key_data = jsondecode(azapi_resource_action.ssh_public_key_gen.output).publicKey } } network_profile { network_plugin = "kubenet" load_balancer_sku = "standard" } }
建立名為
variables.tf
的檔案,並插入下列程式碼:variable "resource_group_location" { type = string default = "eastus" description = "Location of the resource group." } variable "resource_group_name_prefix" { type = string 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 "node_count" { type = number description = "The initial quantity of nodes for the node pool." default = 3 } variable "msi_id" { type = string description = "The Managed Service Identity ID. Set this value if you're running this example using Managed Identity as the authentication method." default = null } variable "username" { type = string description = "The admin username for the new cluster." default = "azureadmin" }
建立名為
outputs.tf
的檔案,並插入下列程式碼:output "resource_group_name" { value = azurerm_resource_group.rg.name } output "kubernetes_cluster_name" { value = azurerm_kubernetes_cluster.k8s.name } 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 }
初始化 Terraform
執行 terraform init 來初始化 Terraform 部署。 此命令會下載管理 Azure 資源所需的 Azure 提供者。
terraform init -upgrade
重點︰
-upgrade
參數會將必要的提供者外掛程式升級至符合設定版本條件約束的最新版本。
建立 Terraform 執行計畫
執行 terraform plan 以建立執行計畫。
terraform plan -out main.tfplan
重點︰
terraform plan
命令會建立執行計畫,但不會執行。 相反地,其會決定要在您指定的設定檔中建立設定所需的動作。 此模式可讓您在對實際資源進行任何變更之前,先確認執行方案是否符合您的預期。- 選用的
-out
參數可讓您指定計畫的輸出檔。 使用-out
參數可確保您所檢閱的方案就是所套用的方案。 - 若要閱讀保存執行方案和安全性的詳細資訊,請參閱安全性警告一節。
套用 Terraform 執行計畫
執行 terraform apply 將執行計畫套用至您的雲端基礎結構。
terraform apply main.tfplan
重點︰
- 範例
terraform apply
命令假設您先前已執行terraform plan -out main.tfplan
。 - 如果您為
-out
參數指定了不同的檔案名稱,請在呼叫terraform apply
時使用該檔案名稱。 - 若您未使用
-out
參數,請呼叫terraform apply
,不需要使用參數。
驗證結果
取得 Azure 資源組名。
resource_group_name=$(terraform output -raw resource_group_name)
執行 az aks list 以顯示新 Kubernetes 叢集的名稱。
az aks list \ --resource-group $resource_group_name \ --query "[].{\"K8s cluster name\":name}" \ --output table
從 Terraform 狀態取得 Kubernetes 組態,並將其儲存在 kubectl 可讀取的檔案中。
echo "$(terraform output kube_config)" > ./azurek8s
確認先前的命令未新增 ASCII EOT 字元。
cat ./azurek8s
重點︰
- 如果您在開頭和
EOT
結尾看到<< EOT
,請從檔案中移除這些字元。 否則,您可能會收到下列錯誤訊息:error: error loading config file "./azurek8s": yaml: line 2: mapping values are not allowed in this context
- 如果您在開頭和
設定環境變數,以便 kubectl 挑選正確的組態。
export KUBECONFIG=./azurek8s
驗證叢集的健康情況。
kubectl get nodes
重點︰
- 建立 AKS 叢集時,啟用了監視功能來擷取叢集節點和 pod 的健康狀態計量。 在 Azure 入口網站中可取得這些健康狀態度量。 如需容器健康情況監視的詳細資訊,請參閱監視 Azure Kubernetes Service 健康情況。
- 當您套用 Terraform 執行計畫時,會輸出數個索引鍵值。 例如,輸出主機位址、AKS 叢集使用者名稱和 AKS 叢集密碼。
部署應用程式
Kubernetes 資訊清單檔會定義叢集所需的狀態,例如要執行哪些容器映像。
在本快速入門中,您會使用資訊清單來建立執行 Azure 投票應用程式所需的所有物件。 此資訊清單包含兩個 Kubernetes 部署:
- 範例 Azure Vote Python 應用程式。
- Redis 執行個體。
系統會建立兩個 Kubernetes Services :
- Redis 執行個體的內部服務。
- 從網際網路存取 Azure Vote 應用程式的外部服務。
建立名為
azure-vote.yaml
的檔案,並插入下列程式碼:apiVersion: apps/v1 kind: Deployment metadata: name: azure-vote-back spec: replicas: 1 selector: matchLabels: app: azure-vote-back template: metadata: labels: app: azure-vote-back spec: nodeSelector: "kubernetes.io/os": linux containers: - name: azure-vote-back image: mcr.microsoft.com/oss/bitnami/redis:6.0.8 env: - name: ALLOW_EMPTY_PASSWORD value: "yes" resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 6379 name: redis --- apiVersion: v1 kind: Service metadata: name: azure-vote-back spec: ports: - port: 6379 selector: app: azure-vote-back --- apiVersion: apps/v1 kind: Deployment metadata: name: azure-vote-front spec: replicas: 1 selector: matchLabels: app: azure-vote-front template: metadata: labels: app: azure-vote-front spec: nodeSelector: "kubernetes.io/os": linux containers: - name: azure-vote-front image: mcr.microsoft.com/azuredocs/azure-vote-front:v1 resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 80 env: - name: REDIS value: "azure-vote-back" --- apiVersion: v1 kind: Service metadata: name: azure-vote-front spec: type: LoadBalancer ports: - port: 80 selector: app: azure-vote-front
重點︰
- 如需 YAML 資訊清單檔的詳細資訊,請參閱 部署和 YAML 資訊清單。
執行 kubectl apply 以部署應用程式。
kubectl apply -f azure-vote.yaml
測試應用程式
執行應用程式時,Kubernetes 服務會向網際網路公開前端應用程式。 此程序需要數分鐘的時間完成。 使用 引數執行
--watch
kubectl get service以監視進度。kubectl get service azure-vote-front --watch
服務 的外部 IP 輸出
azure-vote-front
一開始會顯示為 擱置中。 當 EXTERNAL-IP位址顯示 IP 位址之後,請使用CTRL-C
來停止kubectl
watch進程。若要查看作用中的 Azure 投票 應用程式,請開啟網頁瀏覽器至服務的外部 IP 位址。
清除資源
刪除 AKS 資源
當您不再需要透過 Terraform 建立的資源時,請執行下列步驟:
執行 terraform plan 並指定
destroy
旗標。terraform plan -destroy -out main.destroy.tfplan
重點︰
terraform plan
命令會建立執行計畫,但不會執行。 相反地,其會決定要在您指定的設定檔中建立設定所需的動作。 此模式可讓您在對實際資源進行任何變更之前,先確認執行方案是否符合您的預期。- 選用的
-out
參數可讓您指定計畫的輸出檔。 使用-out
參數可確保您所檢閱的方案就是所套用的方案。 - 若要閱讀保存執行方案和安全性的詳細資訊,請參閱安全性警告一節。
執行 terraform apply 以套用執行方案。
terraform apply main.destroy.tfplan
刪除服務主體
取得服務主體識別碼。
sp=$(terraform output -raw sp)
執行 az ad sp delete 來刪除服務主體。
az ad sp delete --id $sp
對 Azure 上的 Terraform 進行疑難排解
針對在 Azure 上使用 Terraform 時的常見問題進行疑難排解