共用方式為


快速入門:使用 Terraform 部署適用於 AKS 的 Azure Linux 容器主機叢集

使用 Terraform 開始使用 Azure Linux 容器主機以部署 Azure Linux 容器主機叢集。 安裝必要條件後,您可以實作 Terraform 程式碼、初始化 Terraform,以及建立和套用 Terraform 執行計畫。

Terraform 可讓您定義、預覽和部署雲端基礎結構。 使用 Terraform 時,您可以使用 HCL 語法來建立設定檔。 HCL 語法可讓您指定雲端提供者和構成雲端基礎結構的元素。 建立設定檔之後,您可以建立執行計畫,讓您先預覽基礎結構變更,之後再部署。 驗證變更之後,您可以套用執行計畫來部署基礎結構。

注意

本文中的範例程式碼位於 Microsoft Terraform GitHub 存放庫

必要條件

建立 SSH 金鑰組

若要存取 AKS 節點,您可以使用 SSH 金鑰組 (公用和私人) 進行連線,您可以使用 ssh-keygen 命令產生該金鑰組。 根據預設,這些檔案會建立在 ~/.ssh 目錄中。 執行 ssh-keygen 命令會覆寫任何指定位置中已經存在相同名稱的 SSH 金鑰組。

  1. 移至 https://shell.azure.com,並在瀏覽器中開啟 Cloud Shell。

  2. 執行 ssh-keygen 命令。 下列命令會使用 RSA 加密建立 SSH 金鑰組,位元長度為 4096:

    ssh-keygen -t rsa -b 4096
    

如需建立 SSH 金鑰的詳細資訊,請參閱在 Azure 中建立及管理驗證的 SSH 金鑰

實作 Terraform 程式碼

  1. 建立目錄,然後在目錄中測試範例 Terraform 程式碼,並將其設為目前的目錄。

  2. 建立名為 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 {}
        }
    
  3. 建立名為 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

  4. 建立名為 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"
        }
    
  5. 建立名為 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
        }
    
  6. 建立名為 terraform.tfvars 的檔案,並插入下列程式碼:

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

初始化 Terraform 並建立執行計畫

  1. 初始化 Terraform 並使用 terraform init 命令下載管理 Azure 資源所需的 Azure 模組。

    terraform init
    
  2. 使用 terraform plan 命令建立 Terraform 執行計畫。

    terraform plan -out main.tfplan
    

    terraform plan 命令會建立執行計畫,但不會執行。 相反地,其會決定要在您指定的設定檔中建立設定所需的動作。 此模式可讓您在對實際資源進行任何變更之前,先確認執行方案是否符合您的預期。

    選用的 -out 參數可讓您指定計畫的輸出檔。 使用 -out 參數可確保您所檢閱的方案就是所套用的方案。

    若要閱讀保存執行方案和安全性的詳細資訊,請參閱安全性警告

  3. 使用 terraform apply 命令套用 Terraform 執行計畫。

    terraform apply main.tfplan
    

    上述的 terraform apply 命令會假設您先前已執行 terraform plan -out main.tfplan。 如果您為 -out 參數指定不同的檔案名稱,請在呼叫 terraform apply 時使用該相同檔案名稱。 若您未使用 -out 參數,請呼叫 terraform apply,不需要使用參數。

驗證結果

  1. 使用 echo 命令取得資源資源群組名稱。

    echo "$(terraform output resource_group_name)"
    
  2. 瀏覽至 Azure 入口網站

  3. 在 [Azure 服務] 下,選取 [資源群組] 並找出新的資源群組以查看此示範中建立的下列資源:

    • 解決方案:依預設,示範會將此解決方案命名為 ContainerInsights。 入口網站會在括弧中顯示解決方案的工作區名稱。
    • Kubernetes 服務:依預設,示範會將此服務命名為 k8stest。 (受控 Kubernetes 叢集也稱為 AKS/Azure Kubernetes Service。)
    • Log Analytics 工作區:依預設,示範會將此工作區命名為前置詞為 TestLogAnalyticsWorkspaceName- 後面接著隨機號碼的名稱。
  4. 從 Terraform 狀態取得 Kubernetes 設定,並將其儲存在 kubectl 可以使用下列 echo 命令讀取的檔案中。

    echo "$(terraform output kube_config)" > ./azurek8s
    
  5. 確認先前的命令未使用下列 cat 命令新增 ASCII EOT 字元。

    cat ./azurek8s
    

    如果是以 << EOT 為開頭並以 EOT 為結尾,請從檔案中移除這些字元。 否則,您可能會收到下列錯誤訊息:error: error loading config file "./azurek8s": yaml: line 2: mapping values are not allowed in this context

  6. 設定環境變數,讓 kubectl 可以使用下列 export 命令來挑選正確的設定。

    export KUBECONFIG=./azurek8s
    
  7. 使用 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 建立的資源時,您可以使用下列步驟將其移除。

  1. 執行 terraform plan 命令並指定 destroy 旗標。

    terraform plan -destroy -out main.destroy.tfplan
    
  2. 使用 terraform apply 命令移除執行計畫。

    terraform apply main.destroy.tfplan
    

刪除服務主體

警告

僅當您未將此示範中所使用的服務主體作為其他用途使用,才可將其刪除。

  1. 使用 az ad sp list 命令取得服務主體的物件識別碼

    az ad sp list --display-name "<display_name>" --query "[].{\"Object ID\":id}" --output table
    
  2. 使用 az ad sp delete 命令刪除服務主體。

    az ad sp delete --id <service_principal_object_id>
    

對 Azure 上的 Terraform 進行疑難排解

針對在 Azure 上使用 Terraform 時的常見問題進行疑難排解。

下一步

在本快速入門中,您已部署 Azure Linux 容器主機叢集。 若要深入了解 Azure Linux 容器主機,並逐步了解完整的叢集部署和管理範例,請繼續進行 Azure Linux 容器主機教學課程。