Snabbstart: Skapa ett Kubernetes-kluster med Azure Kubernetes Service med Terraform

Azure Kubernetes Service (AKS) hanterar din värdbaserade Kubernetes-miljö. Med AKS kan du distribuera och hantera containerbaserade program utan expertkunskaper om containerorkestrering. Med AKS kan du också utföra många vanliga underhållsåtgärder utan att koppla från din app. Dessa åtgärder omfattar etablering, uppgradering och skalning av resurser på begäran.

Den här artikeln visar hur du skapar ett Kubernetes-kluster med Azure Kubernetes Service (AKS) med Terraform. Exempelkoden är helt kapslad så att den automatiskt skapar ett tjänsthuvudnamn och SSH-nyckelpar (med AzAPI-providern).

I den här artikeln kan du se hur du:

Anteckning

Den här artikeln skapades delvis med hjälp av AI. Innan publiceringen granskade och ändrade en författare innehållet efter behov. Se Våra principer för att använda AI-genererat innehåll i Microsoft Learn.

Förutsättningar

Implementera Terraform-koden

  1. Skapa en katalog där du kan testa Terraform-exempelkoden och göra den till den aktuella katalogen.

  2. Skapa en fil med namnet providers.tf och infoga följande kod:

    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. Skapa en fil med namnet ssh.tf och infoga följande kod:

    resource "random_pet" "ssh_key_name" {
      prefix    = "ssh"
      separator = ""
    }
    
    resource "azapi_resource" "ssh_public_key" {
      type      = "Microsoft.Compute/sshPublicKeys@2022-11-01"
      name      = random_pet.ssh_key_name.id
      location  = "westus3"
      parent_id = azurerm_resource_group.rg.id
    }
    
    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"]
    }
    
    output "key_data" {
      value     = azapi_resource.ssh_public_key.body
      sensitive = true
    }
    
  4. Skapa en fil med namnet main.tf och infoga följande kod:

    # 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 = "ubuntu"
    
        ssh_key {
          key_data = jsondecode(azapi_resource_action.ssh_public_key_gen.output).publicKey
        }
      }
      network_profile {
        network_plugin    = "kubenet"
        load_balancer_sku = "standard"
      }
    }
    
  5. Skapa en fil med namnet variables.tf och infoga följande kod:

    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
    }
    
  6. Skapa en fil med namnet outputs.tf och infoga följande kod:

    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
    }
    

Initiera Terraform

Kör terraform init för att initiera Terraform-distributionen. Det här kommandot laddar ned den Azure-provider som krävs för att hantera dina Azure-resurser.

terraform init -upgrade

Viktiga punkter:

  • Parametern -upgrade uppgraderar nödvändiga provider-plugin-program till den senaste versionen som uppfyller konfigurationens versionsbegränsningar.

Skapa en Terraform-körningsplan

Kör terraform-planen för att skapa en körningsplan.

terraform plan -out main.tfplan

Viktiga punkter:

  • Kommandot terraform plan skapar en körningsplan, men kör den inte. I stället avgör den vilka åtgärder som krävs för att skapa konfigurationen som anges i konfigurationsfilerna. Med det här mönstret kan du kontrollera om körningsplanen matchar dina förväntningar innan du gör några ändringar i faktiska resurser.
  • Med den valfria -out parametern kan du ange en utdatafil för planen. Med hjälp av parametern -out ser du till att den plan som du har granskat är exakt det som tillämpas.
  • Mer information om beständiga körningsplaner och säkerhet finns i avsnittet säkerhetsvarning.

Tillämpa en Terraform-körningsplan

Kör terraform apply för att tillämpa körningsplanen på din molninfrastruktur.

terraform apply main.tfplan

Viktiga punkter:

  • terraform apply Exempelkommandot förutsätter att du tidigare körde terraform plan -out main.tfplan.
  • Om du har angett ett annat filnamn för parametern -out använder du samma filnamn i anropet till terraform apply.
  • Om du inte använde parametern -out anropar terraform apply du utan några parametrar.

Verifiera resultaten

  1. Hämta namnet på Azure-resursgruppen.

    resource_group_name=$(terraform output -raw resource_group_name)
    
  2. Kör az aks list för att visa namnet på det nya Kubernetes-klustret.

    az aks list \
      --resource-group $resource_group_name \
      --query "[].{\"K8s cluster name\":name}" \
      --output table
    
  3. Hämta Kubernetes-konfigurationen från Terraform-tillståndet och lagra den i en fil som kubectl kan läsa.

    echo "$(terraform output kube_config)" > ./azurek8s
    
  4. Kontrollera att föregående kommando inte lade till något ASCII EOT-tecken.

    cat ./azurek8s
    

    Viktiga punkter:

    • Om du ser << EOT i början och EOT slutet tar du bort dessa tecken från filen. Annars kan du få följande felmeddelande: error: error loading config file "./azurek8s": yaml: line 2: mapping values are not allowed in this context
  5. Ange en miljövariabel så att kubectl hämtar korrekt konfiguration.

    export KUBECONFIG=./azurek8s
    
  6. Kontrollera klustrets hälsotillstånd.

    kubectl get nodes
    

    Med verktyget kubectl kan du kontrollera ditt Kubernetes-klusters hälsotillstånd

Viktiga punkter:

  • När AKS-klustret skapades aktiverades övervakning för att registrera hälsomått för både klusternoderna och poddarna. De här hälsomåtten är tillgängliga i Azure-portalen. Mer information om övervakning av hälsotillstånd för containrar finns i Övervaka hälsotillstånd för Azure Kubernets Service.
  • Flera nyckelvärden genererades när du tillämpade Terraform-körningsplanen. Värdadressen, AKS-klustrets användarnamn och AKS-klusterlösenordet matas till exempel ut.

Rensa resurser

Ta bort AKS-resurser

Gör följande när du inte längre behöver de resurser som skapats via Terraform:

  1. Kör terraform-planen och ange destroy flaggan .

    terraform plan -destroy -out main.destroy.tfplan
    

    Viktiga punkter:

    • Kommandot terraform plan skapar en körningsplan, men kör den inte. I stället avgör den vilka åtgärder som krävs för att skapa konfigurationen som anges i konfigurationsfilerna. Med det här mönstret kan du kontrollera om körningsplanen matchar dina förväntningar innan du gör några ändringar i faktiska resurser.
    • Med den valfria -out parametern kan du ange en utdatafil för planen. Med hjälp av parametern -out ser du till att den plan som du har granskat är exakt det som tillämpas.
    • Mer information om beständiga körningsplaner och säkerhet finns i avsnittet säkerhetsvarning.
  2. Kör terraform apply för att tillämpa körningsplanen.

    terraform apply main.destroy.tfplan
    

Ta bort tjänstens huvudnamn

  1. Hämta tjänstens huvudnamns-ID.

    sp=$(terraform output -raw sp)
    
  2. Kör az ad sp delete för att ta bort tjänstens huvudnamn.

    az ad sp delete --id $sp
    

Felsöka Terraform på Azure

Felsöka vanliga problem när du använder Terraform på Azure

Nästa steg