快速入門:使用 Terraform 部署適用於 AKS 的 Azure Linux 容器主機叢集
使用 Terraform 開始使用 Azure Linux 容器主機以部署 Azure Linux 容器主機叢集。 安裝必要條件後,您可以實作 Terraform 程式碼、初始化 Terraform,以及建立和套用 Terraform 執行計畫。
Terraform 可讓您定義、預覽和部署雲端基礎結構。 使用 Terraform 時,您可以使用 HCL 語法來建立設定檔。 HCL 語法可讓您指定雲端提供者和構成雲端基礎結構的元素。 建立設定檔之後,您可以建立執行計畫,讓您先預覽基礎結構變更,之後再部署。 驗證變更之後,您可以套用執行計畫來部署基礎結構。
注意
本文中的範例程式碼位於 Microsoft Terraform GitHub 存放庫。
必要條件
-
如果您沒有 Azure 訂用帳戶,請在開始之前先建立 Azure 免費帳戶。
如果您仍未設定 Terraform,則可使用下列其中一個選項設定:
如果您沒有 Azure 服務主體,則建立服務主體。 記下
appId
、display_name
、password
和tenant
。您將需要 Kubernetes 命令列工具
kubectl
。 如果您沒有,請下載 kubectl。
建立 SSH 金鑰組
若要存取 AKS 節點,您可以使用 SSH 金鑰組 (公用和私人) 進行連線,您可以使用 ssh-keygen
命令產生該金鑰組。 根據預設,這些檔案會建立在 ~/.ssh 目錄中。 執行 ssh-keygen
命令會覆寫任何指定位置中已經存在相同名稱的 SSH 金鑰組。
移至 https://shell.azure.com,並在瀏覽器中開啟 Cloud Shell。
執行
ssh-keygen
命令。 下列命令會使用 RSA 加密建立 SSH 金鑰組,位元長度為 4096:ssh-keygen -t rsa -b 4096
如需建立 SSH 金鑰的詳細資訊,請參閱在 Azure 中建立及管理驗證的 SSH 金鑰。
實作 Terraform 程式碼
建立目錄,然後在目錄中測試範例 Terraform 程式碼,並將其設為目前的目錄。
建立名為
providers.tf
的檔案,並插入下列程式碼:terraform { required_version = ">=1.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>3.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features {} }
建立名為
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_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 = "azurelinuxpool" vm_size = "Standard_D2_v2" node_count = var.agent_count os_sku = "AzureLinux" } linux_profile { admin_username = "azurelinux" 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 } }
同樣地,您可以在 azurerm_kubernetes_cluster_node_pool 中指定 Azure Linux
os_sku
。建立名為
variables.tf
的檔案,並插入下列程式碼: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" }
建立名為
outputs.tf
的檔案,並插入下列程式碼: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 }
建立名為
terraform.tfvars
的檔案,並插入下列程式碼:aks_service_principal_app_id = "<service_principal_app_id>" aks_service_principal_client_secret = "<service_principal_password>"
初始化 Terraform 並建立執行計畫
初始化 Terraform 並使用
terraform init
命令下載管理 Azure 資源所需的 Azure 模組。terraform init
使用
terraform plan
命令建立 Terraform 執行計畫。terraform plan -out main.tfplan
terraform plan
命令會建立執行計畫,但不會執行。 相反地,其會決定要在您指定的設定檔中建立設定所需的動作。 此模式可讓您在對實際資源進行任何變更之前,先確認執行方案是否符合您的預期。選用的
-out
參數可讓您指定計畫的輸出檔。 使用-out
參數可確保您所檢閱的方案就是所套用的方案。若要閱讀保存執行方案和安全性的詳細資訊,請參閱安全性警告。
使用
terraform apply
命令套用 Terraform 執行計畫。terraform apply main.tfplan
上述的
terraform apply
命令會假設您先前已執行terraform plan -out main.tfplan
。 如果您為-out
參數指定不同的檔案名稱,請在呼叫terraform apply
時使用該相同檔案名稱。 若您未使用-out
參數,請呼叫terraform apply
,不需要使用參數。
驗證結果
使用
echo
命令取得資源資源群組名稱。echo "$(terraform output resource_group_name)"
瀏覽至 Azure 入口網站。
在 [Azure 服務] 下,選取 [資源群組] 並找出新的資源群組以查看此示範中建立的下列資源:
- 解決方案:依預設,示範會將此解決方案命名為 ContainerInsights。 入口網站會在括弧中顯示解決方案的工作區名稱。
- Kubernetes 服務:依預設,示範會將此服務命名為 k8stest。 (受控 Kubernetes 叢集也稱為 AKS/Azure Kubernetes Service。)
- Log Analytics 工作區:依預設,示範會將此工作區命名為前置詞為 TestLogAnalyticsWorkspaceName- 後面接著隨機號碼的名稱。
從 Terraform 狀態取得 Kubernetes 設定,並將其儲存在 kubectl 可以使用下列
echo
命令讀取的檔案中。echo "$(terraform output kube_config)" > ./azurek8s
確認先前的命令未使用下列
cat
命令新增 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
命令來挑選正確的設定。export KUBECONFIG=./azurek8s
使用
kubectl get nodes
命令驗證叢集的健康情況。kubectl get nodes
建立 Azure Linux 容器主機叢集後,系統會啟用監視功能來擷取叢集節點和 pod 的健康狀態計量。 這些健康情況計量可在 Azure 入口網站中取得。 如需容器健康情況監視的詳細資訊,請參閱監視 Azure Kubernetes Service 健康情況。
套用 Terraform 執行計畫時,便會輸出數個金鑰值。 例如,輸出主機位址、Azure Linux 容器主機叢集使用者名稱和 Azure Linux 容器主機叢集密碼。
若要檢視所有輸出值,請執行
terraform output
。 若要檢視特定輸出值,請執行echo "$(terraform output <output_value_name>)"
。
清除資源
刪除 AKS 資源
不再需要使用 Terraform 建立的資源時,您可以使用下列步驟將其移除。
執行
terraform plan
命令並指定destroy
旗標。terraform plan -destroy -out main.destroy.tfplan
使用
terraform apply
命令移除執行計畫。terraform apply main.destroy.tfplan
刪除服務主體
警告
僅當您未將此示範中所使用的服務主體作為其他用途使用,才可將其刪除。
使用
az ad sp list
命令取得服務主體的物件識別碼az ad sp list --display-name "<display_name>" --query "[].{\"Object ID\":id}" --output table
使用
az ad sp delete
命令刪除服務主體。az ad sp delete --id <service_principal_object_id>
對 Azure 上的 Terraform 進行疑難排解
針對在 Azure 上使用 Terraform 時的常見問題進行疑難排解。
下一步
在本快速入門中,您已部署 Azure Linux 容器主機叢集。 若要深入了解 Azure Linux 容器主機,並逐步了解完整的叢集部署和管理範例,請繼續進行 Azure Linux 容器主機教學課程。