快速入門:使用 Terraform 部署 Azure Kubernetes Service (AKS) 叢集

Azure Kubernetes Service (AKS) 是受控 Kubernetes 服務,可讓您快速部署及管理叢集。 在本快速入門中,您將:

  • 使用 Terraform 部署 AKS 叢集。
  • 使用一組微服務和 Web 前端模擬零售情節,執行範例多容器應用程式。

注意

若要開始快速佈建 AKS 叢集,本文包含僅針對評估目的部署具有預設設定值之叢集的步驟。 在部署生產就緒叢集之前,建議您先熟悉我們的基準參考架構,考慮其如何符合您的業務需求。

開始之前

注意

Azure Linux節點集區現已正式運作(GA)。 若要了解優點和部署步驟,請參閱適用於 AKS 的 Azure Linux 容器主機簡介 (部分機器翻譯)。

登入您的 Azure 帳戶

首先,登入您的 Azure 帳戶,並使用下一節所述的其中一種方法進行驗證。

Terraform 和 Azure 驗證情節

Terraform 只能支援透過 Azure CLI 向 Azure 進行驗證。 不支援使用 Azure PowerShell 進行驗證。 因此,雖然您可以在執行 Terraform 工作時使用 Azure PowerShell 模組,但您必須先使用 Azure CLI 向 Azure 進行驗證。

本文說明如何針對下列情節向 Azure 驗證 Terraform。 如需向 Azure 驗證 Terraform 的選項詳細資訊,請參閱使用 Azure CLI 進行驗證

透過 Microsoft 帳戶向 Azure 進行驗證

Microsoft 帳戶是用來登入 Microsoft 服務的使用者名稱 (與電子郵件及其認證相關聯),例如 Azure。 Microsoft 帳戶可以與一或多個 Azure 訂用帳戶相關聯,其中一個訂用帳戶是預設值。

下列步驟將示範如何:

  • 使用 Microsoft 帳戶以互動方式登入 Azure
  • 列出帳戶的相關聯 Azure 訂用帳戶 (包括預設值)
  • 設定目前的訂用帳戶
  1. 開啟可存取 Azure CLI 的命令行。

  2. 執行 az login 時不需任何參數,請依照指示登入 Azure。

    az login
    

    重點︰

    • 成功登入時,az login 顯示已登入 Microsoft 帳戶相關聯的 Azure 訂用帳戶清單,包括預設訂用帳戶。
  3. 若要確認目前的 Azure 訂用帳戶,請執行 az account show

    az account show
    
  4. 若要檢視特定 Microsoft 帳戶的所有 Azure 訂用帳戶名稱和識別碼,請執行 az account list

    az account list --query "[?user.name=='<microsoft_account_email>'].{Name:name, ID:id, Default:isDefault}" --output Table
    

    重點︰

    • <microsoft_account_email> 預留位置取代為您想要列出其 Azure 訂用帳戶的 Microsoft 帳戶電子郵件地址。
    • 使用 Live 帳戶,例如 Hotmail 或 Outlook,您可能需要指定完整的電子郵件地址。 例如,如果您的電子郵件地址是 admin@hotmail.com,您可能需要將預留位置取代為 live.com#admin@hotmail.com
  5. 若要使用特定的 Azure 訂用帳戶,請執行 az account set

    az account set --subscription "<subscription_id_or_subscription_name>"
    

    重點︰

    • 以您想要使用訂用帳戶的識別碼或名稱取代 <subscription_id_or_subscription_name> 預留位置。
    • 呼叫 az account set 不會顯示切換至指定 Azure 訂用帳戶的結果。 不過,您可以使用 az account show 來確認目前的 Azure 訂用帳戶是否已變更。
    • 如果您從上一個步驟執行 az account list 命令,您會看到預設 Azure 訂用帳戶已變更為您使用 az account set 指定的訂用帳戶。

建立服務主體

部署或使用 Azure 服務的自動化工具 (例如 Terraform),應一律具有受限制的權限。 有別於以完整權限使用者身分登入應用程式的作法,Azure 提供服務主體。

最常見的模式是以互動方式登入 Azure、建立服務主體、測試服務主體,然後使用該服務主體進行未來的驗證 (以互動方式或從您的指令碼)。

  1. 若要建立服務主體,請登入 Azure。 透過 Microsoft 帳戶向 Azure 進行驗證之後,請返回這裡。

  2. 如果您要從 Git Bash 建立服務主體,請設定 MSYS_NO_PATHCONV 環境變數。 (如果您使用 Cloud Shell,則不需要此步驟)。

    export MSYS_NO_PATHCONV=1    
    

    重點︰

    • 您可以全域方式設定 MSYS_NO_PATHCONV 環境變數 (針對所有終端工作階段) 或本機 (僅適用於目前的工作階段)。 由於建立服務主體並非您經常執行的動作,此範例會設定目前工作階段的值。 若要全域設定此環境變數,請將設定新增至 ~/.bashrc 檔案。
  3. 若要建立服務主體,請執行 az ad sp create-for-rbac

    az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
    

    重點︰

    • 您可以將 <service-principal-name> 取代為環境的自訂名稱,或完全省略 參數。 如果您省略參數,則會根據目前的日期和時間產生服務主體名稱。
    • 成功完成時,az ad sp create-for-rbac 會顯示數個值。 下一個步驟會使用 appIdpasswordtenant 值。
    • 如果遺失,就無法擷取密碼。 因此,您應該將密碼儲存在安全的地方。 如果您忘記密碼,您可以重設服務主體認證
    • 本文中正在使用具有參與者角色的服務主體。 如需角色型存取控制 (RBAC) 角色的詳細資訊,請參閱 RBAC:內建角色
    • 建立服務主體的輸出包含敏感性認證。 請務必不要在程式碼中包含這些認證,或是將認證簽入原始檔控制中。
    • 如需使用 Azure CLI 建立服務主體時選項的詳細資訊,請參閱使用 Azure CLI 建立 Azure 服務主體一文。

在環境變數中指定服務主體認證

建立服務主體之後,您可以透過環境變數將其認證指定給 Terraform。

  1. 新增下列環境變數,以編輯 ~/.bashrc 檔案。

    export ARM_SUBSCRIPTION_ID="<azure_subscription_id>"
    export ARM_TENANT_ID="<azure_subscription_tenant_id>"
    export ARM_CLIENT_ID="<service_principal_appid>"
    export ARM_CLIENT_SECRET="<service_principal_password>"
    
  2. 若要執行 ~/.bashrc 腳本,請執行 source ~/.bashrc (或其縮寫的對等用法 . ~/.bashrc)。 您也可以結束並重新開啟 Cloud Shell,讓指令碼自動執行。

    . ~/.bashrc
    
  3. 設定環境變數之後,您可以確認其值,如下所示:

    printenv | grep ^ARM*
    

重點︰

  • 如同任何環境變數,若要從 Terraform 指令碼中存取 Azure 訂用帳戶值,請使用下列語法:${env.<environment_variable>}。 例如,若要存取 ARM_SUBSCRIPTION_ID 值,請指定 ${env.ARM_SUBSCRIPTION_ID}
  • 建立及套用 Terraform 執行計畫,會在服務主體相關聯的 Azure 訂用帳戶上進行變更。 如果您已登入一個 Azure 訂用帳戶,而環境變數指向第二個 Azure 訂用帳戶,實際上有時可能會造成混淆。 讓我們看下列範例以利說明。 假設您有兩個 Azure 訂用帳戶:SubA 和 SubB。 如果目前的 Azure 訂用帳戶是 SubA (透過 az account show 決定),而環境變數指向 SubB,則 Terraform 所做的任何變更都在 SubB 上。 因此,您必須登入您的 SubB 訂用帳戶,以執行 Azure CLI 命令或 Azure PowerShell 命令來檢視您的變更。

在 Terraform 提供者區塊中指定服務主體認證

Azure 提供者區塊會定義可讓您指定 Azure 訂用帳戶驗證資訊的語法。

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>2.0"
    }
  }
}

provider "azurerm" {
  features {}

  subscription_id   = "<azure_subscription_id>"
  tenant_id         = "<azure_subscription_tenant_id>"
  client_id         = "<service_principal_appid>"
  client_secret     = "<service_principal_password>"
}

# Your code goes here

警告

在 Terraform 設定檔中指定 Azure 訂用帳戶認證的能力可能很方便,尤其是在測試時。 不過,不建議將認證儲存在可由非信任人員檢視的純文字檔中。

實作 Terraform 程式碼

注意

本文中的範例程式碼位於 Azure Terraform GitHub 存放庫 (英文)。 您可以檢視記錄檔,內含目前和舊版 Terraform 的測試結果 (英文)。

請參閱更多文章和範例程式碼,其中顯示如何使用 Terraform 來管理 Azure 資源

  1. 建立可用來測試範例 Terraform 程式碼的目錄,並將其設為您目前的目錄。

  2. 建立名為 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 {}
    }
    
  3. 建立名為 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
    }
    
  4. 建立名為 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"
      }
    }
    
  5. 建立名為 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"
    }
    
  6. 建立名為 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,不需要使用參數。

驗證結果

  1. 使用下列命令取得 Azure 資源資源群組名稱。

    resource_group_name=$(terraform output -raw resource_group_name)
    
  2. 使用 az aks list 命令顯示新 Kubernetes 叢集的名稱。

    az aks list \
      --resource-group $resource_group_name \
      --query "[].{\"K8s cluster name\":name}" \
      --output table
    
  3. 從 Terraform 狀態取得 Kubernetes 設定,並將其儲存在 kubectl 可以使用下列命令讀取的檔案中。

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

    cat ./azurek8s
    

    重點︰

    • 如果您在開頭看到 << EOT ,並在結尾看到 EOT,請從檔案中移除這些字元。 否則,您可能會收到下列錯誤訊息︰error: error loading config file "./azurek8s": yaml: line 2: mapping values are not allowed in this context
  5. 設定環境變數,讓 kubectl 可以使用下列命令來挑選正確的設定。

    export KUBECONFIG=./azurek8s
    
  6. 使用 kubectl get nodes 命令驗證叢集的健康情況。

    kubectl get nodes
    

重點︰

  • 建立 AKS 叢集時,已啟用監視來擷取叢集節點和 Pod 的健康情況計量。 這些健康情況計量可在 Azure 入口網站中取得。 如需容器健康情況監視的詳細資訊,請參閱監視 Azure Kubernetes Service 健康情況
  • 套用 Terraform 執行計畫時,有數個金鑰值分類為輸出。 例如,輸出主機位址、AKS 叢集使用者名稱及 AKS 叢集密碼。

部署應用程式

若要部署應用程式,您可以使用資訊清單檔來建立執行 AKS 市集應用程式所需的所有物件。 Kubernetes 資訊清單檔會定義叢集所需的狀態,例如要執行哪些容器映像。 資訊清單包含下列 Kubernetes 部署和服務:

Azure 市集範例架構的螢幕快照。

  • 市集前端:供客戶檢視產品和下單的 Web 應用程式。
  • 產品服務:顯示產品資訊。
  • 訂單服務:下單。
  • Rabbit MQ:訂單佇列的訊息佇列。

注意

除非是針對生產環境的永續性儲存,否則不建議執行具狀態容器,例如 Rabbit MQ。 這裡使用具狀態容器是為了簡單起見,但我們建議使用受管理的服務,例如 Azure CosmosDB 或 Azure 服務匯流排。

  1. 建立名為 aks-store-quickstart.yaml 的檔案,然後將下列資訊清單複製進來:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: rabbitmq
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: rabbitmq
      template:
        metadata:
          labels:
            app: rabbitmq
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: rabbitmq
            image: mcr.microsoft.com/mirror/docker/library/rabbitmq:3.10-management-alpine
            ports:
            - containerPort: 5672
              name: rabbitmq-amqp
            - containerPort: 15672
              name: rabbitmq-http
            env:
            - name: RABBITMQ_DEFAULT_USER
              value: "username"
            - name: RABBITMQ_DEFAULT_PASS
              value: "password"
            resources:
              requests:
                cpu: 10m
                memory: 128Mi
              limits:
                cpu: 250m
                memory: 256Mi
            volumeMounts:
            - name: rabbitmq-enabled-plugins
              mountPath: /etc/rabbitmq/enabled_plugins
              subPath: enabled_plugins
          volumes:
          - name: rabbitmq-enabled-plugins
            configMap:
              name: rabbitmq-enabled-plugins
              items:
              - key: rabbitmq_enabled_plugins
                path: enabled_plugins
    ---
    apiVersion: v1
    data:
      rabbitmq_enabled_plugins: |
        [rabbitmq_management,rabbitmq_prometheus,rabbitmq_amqp1_0].
    kind: ConfigMap
    metadata:
      name: rabbitmq-enabled-plugins            
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: rabbitmq
    spec:
      selector:
        app: rabbitmq
      ports:
        - name: rabbitmq-amqp
          port: 5672
          targetPort: 5672
        - name: rabbitmq-http
          port: 15672
          targetPort: 15672
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: order-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: order-service
      template:
        metadata:
          labels:
            app: order-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: order-service
            image: ghcr.io/azure-samples/aks-store-demo/order-service:latest
            ports:
            - containerPort: 3000
            env:
            - name: ORDER_QUEUE_HOSTNAME
              value: "rabbitmq"
            - name: ORDER_QUEUE_PORT
              value: "5672"
            - name: ORDER_QUEUE_USERNAME
              value: "username"
            - name: ORDER_QUEUE_PASSWORD
              value: "password"
            - name: ORDER_QUEUE_NAME
              value: "orders"
            - name: FASTIFY_ADDRESS
              value: "0.0.0.0"
            resources:
              requests:
                cpu: 1m
                memory: 50Mi
              limits:
                cpu: 75m
                memory: 128Mi
          initContainers:
          - name: wait-for-rabbitmq
            image: busybox
            command: ['sh', '-c', 'until nc -zv rabbitmq 5672; do echo waiting for rabbitmq; sleep 2; done;']
            resources:
              requests:
                cpu: 1m
                memory: 50Mi
              limits:
                cpu: 75m
                memory: 128Mi    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: order-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3000
        targetPort: 3000
      selector:
        app: order-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: product-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: product-service
      template:
        metadata:
          labels:
            app: product-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: product-service
            image: ghcr.io/azure-samples/aks-store-demo/product-service:latest
            ports:
            - containerPort: 3002
            resources:
              requests:
                cpu: 1m
                memory: 1Mi
              limits:
                cpu: 1m
                memory: 7Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: product-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3002
        targetPort: 3002
      selector:
        app: product-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: store-front
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: store-front
      template:
        metadata:
          labels:
            app: store-front
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: store-front
            image: ghcr.io/azure-samples/aks-store-demo/store-front:latest
            ports:
            - containerPort: 8080
              name: store-front
            env: 
            - name: VUE_APP_ORDER_SERVICE_URL
              value: "http://order-service:3000/"
            - name: VUE_APP_PRODUCT_SERVICE_URL
              value: "http://product-service:3002/"
            resources:
              requests:
                cpu: 1m
                memory: 200Mi
              limits:
                cpu: 1000m
                memory: 512Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: store-front
    spec:
      ports:
      - port: 80
        targetPort: 8080
      selector:
        app: store-front
      type: LoadBalancer
    

    如需 YAML 資訊清單檔案的詳細資訊,請參閱部署和 YAML 資訊清單

    如果您在本地建立並儲存 YAML 檔案,則可以選取 [上傳/下載檔案] 按鈕,然後從本地文件系統選取檔案,將資訊清單檔上傳至 CloudShell 裡的預設目錄。

  2. 使用 kubectl apply 命令來部署應用程式,並指定 YAML 資訊清單的名稱。

    kubectl apply -f aks-store-quickstart.yaml
    

    下列範例輸出會顯示部署和服務:

    deployment.apps/rabbitmq created
    service/rabbitmq created
    deployment.apps/order-service created
    service/order-service created
    deployment.apps/product-service created
    service/product-service created
    deployment.apps/store-front created
    service/store-front created
    

測試應用程式

當應用程式執行時,Kubernetes 服務會將應用程式前端公開至網際網路。 此程序可能需要幾分鐘才能完成。

  1. 使用 kubectl get pods 命令檢視已部署 Pod 的狀態。 讓全部 Pod 都是 Running,再繼續。

    kubectl get pods
    
  2. 檢查市集前端應用程式的公用 IP 位址。 使用 kubectl get service 命令搭配 --watch 引數來監視進度。

    kubectl get service store-front --watch
    

    store-front 服務的 EXTERNAL-IP 輸出一開始會顯示為擱置

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   <pending>     80:30025/TCP   4h4m
    
  3. 當 EXTERNAL-IP 位址從暫止變成實際的公用 IP 位址時,請使用 CTRL-C 停止 kubectl 監看式流程。

    下列範例輸出顯示指派給服務的有效公用 IP 位址:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   20.62.159.19   80:30025/TCP   4h5m
    
  4. 若要查看 Azure 市集應用程式的實際運作情況,請開啟網頁瀏覽器並瀏覽至服務的外部 IP 位址。

    AKS 市集範例應用程式的螢幕快照。

清除資源

刪除 AKS 資源

當您不再需要透過 Terraform 建立的資源時,請執行下列步驟:

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

    terraform plan -destroy -out main.destroy.tfplan
    

    重點︰

    • terraform plan 命令會建立執行計畫,但不會執行。 相反地,其會決定要在您指定的設定檔中建立設定所需的動作。 此模式可讓您在對實際資源進行任何變更之前,先確認執行方案是否符合您的預期。
    • 選用的 -out 參數可讓您指定計畫的輸出檔。 使用 -out 參數可確保您所檢閱的方案就是所套用的方案。
  2. 執行 terraform apply 以套用執行方案。

    terraform apply main.destroy.tfplan
    

刪除服務主體

  1. 使用下列命令取得服務主體識別碼。

    sp=$(terraform output -raw sp)
    
  2. 使用 az ad sp delete 命令刪除服務主體。

    az ad sp delete --id $sp
    

複製 Azure 開發人員 CLI 範本

Azure 開發人員 CLI 可讓您從 Azure 範例 存放庫快速下載範例。 在我們的快速入門中,您會下載 aks-store-demo 應用程式。 如需一般使用案例的詳細資訊,請參閱概 azd

  1. 使用 azd init 命令搭配 --template 參數,從 Azure-Samples 存放庫複製 AKS 存放區示範範本。

    azd init --template Azure-Samples/aks-store-demo
    
  2. 輸入只使用英數位元和連字元的項目環境名稱,例如 aks-terraform-1

    Enter a new environment name: aks-terraform-1
    

登入您的 Azure 雲端帳戶

azd 範本包含建立服務所需的所有程序代碼,但您必須登入您的 Azure 帳戶,才能在 AKS 上裝載應用程式。

  1. 使用 azd auth login 命令登入您的帳戶。

    azd auth login
    
  2. 複製輸出中顯示的裝置程式代碼,然後按 Enter 以登入。

    Start by copying the next code: XXXXXXXXX
    Then press enter and continue to log in from your browser...
    

    重要

    如果您使用網路外虛擬機或 GitHub Codespace,某些 Azure 安全策略會在 azd auth login使用 登入時造成衝突。 如果您遇到此處的問題,您可以遵循提供的 azd auth 因應措施,這牽涉到使用 curl 對執行 之後 azd auth login重新導向至 localhost URL 的要求。

  3. 在組織的登入頁面上,使用您的認證進行驗證。

  4. 確認您嘗試從 Azure CLI 連線。

  5. 確認「裝置程式碼驗證已完成。 登入 Azure」訊息出現在您的原始終端中。

    Waiting for you to complete authentication in the browser...
    Device code authentication completed.
    Logged in to Azure.
    

azd auth 因應措施

此因應措施會要求您 安裝 Azure CLI

  1. 開啟終端機視窗,並使用 az login 將 參數設定為 https://graph.microsoft.com/.default的 命令--scope,使用 Azure CLI 登入。

    az login --scope https://graph.microsoft.com/.default
    

    您應該重新導向至新索引標籤中的驗證頁面,以建立瀏覽器存取權杖,如下列範例所示:

    https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize?clientid=<your_client_id>.
    
  2. 嘗試使用 azd auth login登入之後,複製您收到的網頁 localhost URL。

  3. 在新終端機視窗中,使用下列 curl 要求來登入。 請務必將 <localhost> 佔位元取代為您在上一個步驟中複製的localhostURL。

    curl <localhost>
    

    成功的登入會輸出 HTML 網頁,如下列範例所示:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="refresh" content="60;url=https://docs.microsoft.com/cli/azure/">
        <title>Login successfully</title>
        <style>
            body {
                font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            }
    
            code {
                font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
                display: inline-block;
                background-color: rgb(242, 242, 242);
                padding: 12px 16px;
                margin: 8px 0px;
            }
        </style>
    </head>
    <body>
        <h3>You have logged into Microsoft Azure!</h3>
        <p>You can close this window, or we will redirect you to the <a href="https://docs.microsoft.com/cli/azure/">Azure CLI documentation</a> in 1 minute.</p>
        <h3>Announcements</h3>
        <p>[Windows only] Azure CLI is collecting feedback on using the <a href="https://learn.microsoft.com/windows/uwp/security/web-account-manager">Web Account Manager</a> (WAM) broker for the login experience.</p>
        <p>You may opt-in to use WAM by running the following commands:</p>
        <code>
            az config set core.allow_broker=true<br>
            az account clear<br>
            az login
        </code>
    </body>
    </html>
    
  4. 關閉目前的終端機,並開啟原始終端機。 您應該會看到訂用帳戶的 JSON 清單。

  5. id複製您想要使用的訂用帳戶欄位。

  6. 使用 az account set (部分機器翻譯) 命令來設定您的訂用帳戶。

    az account set --subscription <subscription_id>
    

建立和部署叢集的資源

若要部署應用程式,您可以使用 azd up 命令來建立執行 AKS 市集應用程式所需的所有物件。

  • 檔案 azure.yaml 會定義叢集所需的狀態,例如要擷取的容器映射,並包含下列 Kubernetes 部署和服務:

顯示 Azure 市集範例架構的圖表。

  • 市集前端:供客戶檢視產品和下單的 Web 應用程式。
  • 產品服務:顯示產品資訊。
  • 訂單服務:下單。
  • Rabbit MQ:訂單佇列的訊息佇列。

注意

除非是針對生產環境的永續性儲存,否則不建議執行具狀態容器,例如 Rabbit MQ。 為了簡單起見,此處會使用這些服務,但我們建議使用受控服務,例如 Azure Cosmos DB 或 Azure 服務匯流排。

部署應用程式資源

azd本快速入門的範本會建立具有 AKS 叢集和 Azure 金鑰保存庫 的新資源群組。 金鑰保存庫會儲存客戶端密碼,並在命名空間中 pets 執行服務。

  1. 使用 azd up 命令建立所有應用程式資源。

    azd up
    

    azd up會執行資料夾azd-hooks的所有勾點,以預先註冊、布建及部署應用程式服務。

    自定義勾點,以將自定義程式代碼新增至 azd 工作流程階段。 如需詳細資訊,請參閱 azd 勾點 參考。

  2. 選取您計費使用量的 Azure 訂用帳戶。

    ? Select an Azure Subscription to use:  [Use arrows to move, type to filter]
    > 1. My Azure Subscription (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
    
  3. 選取要部署應用程式的區域。

    Select an Azure location to use:  [Use arrows to move, type to filter]
      1.  (South America) Brazil Southeast (brazilsoutheast)
      2.  (US) Central US (centralus)
      3.  (US) East US (eastus)
    > 43. (US) East US 2 (eastus2)
      4.  (US) East US STG (eastusstg)
      5.  (US) North Central US (northcentralus)
      6.  (US) South Central US (southcentralus)
    

    azd 會自動執行預先布建和布建后連結,以建立應用程式的資源。 此程序可能需要幾分鐘才能完成。 完成後,您應該會看到類似下列範例的輸出:

    SUCCESS: Your workflow to provision and deploy to Azure completed in 9 minutes 40 seconds.
    

產生 Terraform 方案

在您的 Azure 開發人員範本中, /infra/terraform 資料夾包含用來產生 Terraform 方案的所有程式代碼。

Terraform 會使用 terraform apply 作為布建步驟的 azd一部分來部署和執行命令。 完成後,您應該會看到類似下列範例的輸出:

Plan: 5 to add, 0 to change, 0 to destroy.
...
Saved the plan to: /workspaces/aks-store-demo/.azure/aks-terraform-azd/infra/terraform/main.tfplan

測試應用程式

當應用程式執行時,Kubernetes 服務會將應用程式前端公開至網際網路。 此程序可能需要幾分鐘才能完成。

  1. 使用 kubectl set-context 命令將您的命名空間設定為示範命名空間pets

    kubectl config set-context --current --namespace=pets
    
  2. 使用 kubectl get pods 命令檢視已部署 Pod 的狀態。 請先確認全部 Pod 都是 Running 後再繼續進行。

    kubectl get pods
    
  3. 檢查存放區前端應用程式的公用IP位址,並使用 命令搭配 --watch 自變數監視進度kubectl get service

    kubectl get service store-front --watch
    

    store-front 服務的 EXTERNAL-IP 輸出一開始會顯示為擱置

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   <pending>     80:30025/TCP   4h4m
    
  4. 當 EXTERNAL-IP 位址從暫止變成實際的公用 IP 位址時,請使用 CTRL-C 停止 kubectl 監看式流程。

    下列輸出範例會顯示已指派給服務的有效公用 IP 位址:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   20.62.159.19   80:30025/TCP   4h5m
    
  5. 若要查看 Azure 市集應用程式的實際運作情況,請開啟網頁瀏覽器並瀏覽至服務的外部 IP 位址。

    AKS 市集範例應用程式的螢幕快照。

選取叢集

完成快速入門之後,請清除不必要的資源以避免 Azure 費用。

  1. 使用 azd down 命令刪除在快速入門中建立的所有資源。

    azd down
    
  2. 輸入 y 並按 Enter,確認您決定從訂用帳戶中移除所有已使用的資源。

    ? Total resources to delete: 14, are you sure you want to continue? (y/N)
    
  3. 如果適用,請鍵入 y 並按 , Enter允許清除重複使用快速入門變數。

    [Warning]: These resources have soft delete enabled allowing them to be recovered for a period or time after deletion. During this period, their names can't be reused. In the future, you can use the argument --purge to skip this confirmation.
    

對 Azure 上的 Terraform 進行疑難排解

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

下一步

在本快速入門中,您已部署 Kubernetes 叢集,接著將簡單多容器應用程式部署到此叢集。 這個範例應用程式僅供示範之用,並不代表 Kube 應用程式的全部最佳做法。 如需針對生產使用 AKS 建立完整解決方案的指引,請參閱 AKS 解決方案指引

若要深入瞭解 AKS 並逐步完成程式碼至部署的範例,請繼續 Kubernetes 叢集教學課程。