Rövid útmutató: Kubernetes-fürt létrehozása Azure Kubernetes Service a Terraform használatával

A cikk a következő Terraform- és Terraform-szolgáltatói verziókkal lett tesztelve:

A Terraform lehetővé teszi a felhőinfrastruktúra definícióját, előzetes verzióját és üzembe helyezését. A Terraform használatával konfigurációs fájlokat hozhat létre a HCL szintaxisával. A HCL szintaxisa lehetővé teszi a felhőszolgáltató – például az Azure – és a felhőinfrastruktúrát alkotó elemek megadását. A konfigurációs fájlok létrehozása után létrehoz egy végrehajtási tervet , amely lehetővé teszi az infrastruktúra módosításainak előzetes megtekintését az üzembe helyezés előtt. A módosítások ellenőrzése után alkalmazza a végrehajtási tervet az infrastruktúra üzembe helyezésére.

Azure Kubernetes Service (AKS) kezeli a üzemeltetett Kubernetes-környezetet. Az AKS lehetővé teszi tárolóalapú alkalmazások üzembe helyezését és kezelését tárolóvezénylési szakértelem nélkül. Az AKS számos gyakori karbantartási műveletet is lehetővé tesz anélkül, hogy az alkalmazást offline állapotba tenné. Ezek a műveletek magukban foglalják az erőforrások igény szerinti kiépítését, frissítését és skálázását.

Ebben a cikkben az alábbiakkal ismerkedhet meg:

  • Kubernetes-fürt meghatározása HCL (HashiCorp Language) használatával
  • Kubernetes-fürt létrehozása Terraformmal és AKS-sel
  • Kubernetes-fürt rendelkezésre állásának tesztelése a kubectl eszközzel

Megjegyzés

A cikkben szereplő példakód a Microsoft Terraform GitHub adattárában található.

Előfeltételek

  • Azure-előfizetés: Ha nem rendelkezik Azure-előfizetéssel, első lépésként mindössze néhány perc alatt létrehozhat egy ingyenes fiókot.

A Terraform-kód implementálása

  1. Hozzon létre egy könyvtárat, amelyben tesztelheti a Terraform-mintakódot, és az aktuális könyvtárvá teheti.

  2. Hozzon létre egy nevű providers.tf fájlt, és szúrja be a következő kódot:

    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. Hozzon létre egy nevű main.tf fájlt, és szúrja be a következő kódot:

    # 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       = "agentpool"
        vm_size    = "Standard_D2_v2"
        node_count = var.agent_count
      }
      linux_profile {
        admin_username = "ubuntu"
    
        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
      }
    }
    
  4. Hozzon létre egy nevű variables.tf fájlt, és szúrja be a következő kódot:

    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. Hozzon létre egy nevű outputs.tf fájlt, és szúrja be a következő kódot:

    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. Hozzon létre egy nevű terraform.tfvars fájlt, és szúrja be a következő kódot.

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

A Terraform inicializálása

Futtassa a Terraform init parancsot a Terraform üzembe helyezésének inicializálásához. Ez a parancs letölti az Azure-erőforrások kezeléséhez szükséges Azure-szolgáltatót.

terraform init -upgrade

Főbb pontok:

  • A -upgrade paraméter frissíti a szükséges szolgáltatói beépülő modulokat a legújabb verzióra, amely megfelel a konfiguráció verziókorlátozásainak.

Terraform végrehajtási terv létrehozása

Végrehajtási terv létrehozásához futtassa a Terraform-tervet .

terraform plan -out main.tfplan

Főbb pontok:

  • A terraform plan parancs létrehoz egy végrehajtási tervet, de nem hajtja végre. Ehelyett meghatározza, hogy milyen műveletek szükségesek a konfigurációs fájlokban megadott konfiguráció létrehozásához. Ez a minta lehetővé teszi annak ellenőrzését, hogy a végrehajtási terv megfelel-e az elvárásainak, mielőtt módosításokat végez a tényleges erőforrásokon.
  • A választható -out paraméter lehetővé teszi a terv kimeneti fájljának megadását. -out A paraméter használatával biztosítható, hogy az ön által áttekintett csomag pontosan az, amit alkalmaz.
  • A végrehajtási tervek és a biztonság megőrzésével kapcsolatos további információkért tekintse meg a biztonsági figyelmeztetések szakaszt.

Terraform végrehajtási terv alkalmazása

A terraform alkalmazás futtatásával alkalmazza a végrehajtási tervet a felhőinfrastruktúrára.

terraform apply main.tfplan

Főbb pontok:

  • A terraform apply fenti parancs feltételezi, hogy korábban futtatta a parancsot terraform plan -out main.tfplan.
  • Ha másik fájlnevet adott meg a -out paraméterhez, használja ugyanazt a fájlnevet a hívásban terraform apply.
  • Ha nem használta a paramétert -out , hívjon terraform apply paraméterek nélkül.

Az eredmények ellenőrzése

  1. Kérje le az erőforráscsoport nevét.

    echo "$(terraform output resource_group_name)"
    
  2. Keresse meg a Azure Portal.

  3. Az Azure-szolgáltatások területen válassza az Erőforráscsoportok lehetőséget, és keresse meg az új erőforráscsoportot a bemutatóban létrehozott alábbi erőforrások megtekintéséhez:

    • Megoldás: Alapértelmezés szerint a bemutató ezt a megoldást ContainerInsights néven nevezi el. A portál zárójelben jeleníti meg a megoldás munkaterületnevét.
    • Kubernetes-szolgáltatás: Alapértelmezés szerint a bemutató ezt a szolgáltatást k8stest néven nevezi el. (A felügyelt Kubernetes-fürtök AKS/Azure Kubernetes Service néven is ismertek.)
    • Log Analytics-munkaterület: A bemutató alapértelmezés szerint a TestLogAnalyticsWorkspaceName előtaggal nevezi el ezt a munkaterületet, amelyet egy véletlenszerű szám követ.
  4. Kérje le a Kubernetes-konfigurációt a Terraform állapotából, és tárolja el egy fájlban, amelyet a kubectl olvashat.

    echo "$(terraform output kube_config)" > ./azurek8s
    
  5. Győződjön meg arról, hogy az előző parancs nem adott hozzá ASCII EOT-karaktert.

    cat ./azurek8s
    

    Főbb pontok:

    • Ha az elején és EOT végén látható<< EOT, távolítsa el ezeket a karaktereket a fájlból. Ellenkező esetben a következő hibaüzenet jelenhet meg: error: error loading config file "./azurek8s": yaml: line 2: mapping values are not allowed in this context
  6. Állítson be egy környezeti változót, így a kubectl a helyes konfigurációt veszi fel.

    export KUBECONFIG=./azurek8s
    
  7. Ellenőrizze a fürt állapotát.

    kubectl get nodes
    

    A kubectl eszközzel ellenőrizheti a Kubernetes-fürt állapotát

Főbb pontok:

  • Az AKS-fürt létrejöttekor a monitorozás is engedélyezve lett, hogy rögzítse a fürtcsomópontok és a podok állapotmetrikáit. Ezek az állapotmetrikák elérhetők az Azure Portalon. A tároló állapotának monitorozásával kapcsolatos további információ az Azure Kubernetes Service állapotmonitorozásáról szóló témakörben érhető el.
  • A Terraform végrehajtási tervének alkalmazásakor több fő érték is ki lett kapcsolva. A gazdagép címe, az AKS-fürt felhasználóneve és az AKS-fürt jelszava például kimenet.
  • Az összes kimeneti érték megtekintéséhez futtassa a parancsot terraform output.
  • Egy adott kimeneti érték megtekintéséhez futtassa a parancsot echo "$(terraform output <output_value_name>)".

Az erőforrások eltávolítása

AKS-erőforrások törlése

Ha már nincs szüksége a Terraformon keresztül létrehozott erőforrásokra, hajtsa végre az alábbi lépéseket:

  1. Futtassa a Terraform-tervet , és adja meg a jelzőt destroy .

    terraform plan -destroy -out main.destroy.tfplan
    

    Főbb pontok:

    • A terraform plan parancs létrehoz egy végrehajtási tervet, de nem hajtja végre. Ehelyett meghatározza, hogy milyen műveletek szükségesek a konfigurációs fájlokban megadott konfiguráció létrehozásához. Ez a minta lehetővé teszi annak ellenőrzését, hogy a végrehajtási terv megfelel-e az elvárásainak, mielőtt módosításokat végez a tényleges erőforrásokon.
    • A választható -out paraméter lehetővé teszi a terv kimeneti fájljának megadását. -out A paraméter használatával biztosítható, hogy az ön által áttekintett csomag pontosan az, amit alkalmaz.
    • A végrehajtási tervek és a biztonság megőrzésével kapcsolatos további információkért tekintse meg a biztonsági figyelmeztetések szakaszt.
  2. Futtassa a terraform apply parancsot a végrehajtási terv alkalmazásához.

    terraform apply main.destroy.tfplan
    

Szolgáltatásnév törlése

Figyelemfelhívás

Csak akkor törölje a bemutatóban használt szolgáltatásnevet, ha nem használja máshoz.

  1. Futtassa az az ad sp listát a szolgáltatásnév objektumazonosítójának lekéréséhez.

    az ad sp list --display-name "<display_name>" --query "[].{\"Object ID\":id}" --output table
    
    
  2. Futtassa az az ad sp delete parancsot a szolgáltatásnév törléséhez.

    az ad sp delete --id <service_principal_object_id>
    

A Terraform hibaelhárítása az Azure-ban

A Terraform Azure-on való használatakor felmerülő gyakori problémák elhárítása

Következő lépések