Vytvoření clusteru Kubernetes s Azure Kubernetes Service pomocí Terraformu

Azure Kubernetes Service (AKS) spravuje hostované prostředí Kubernetes. AKS umožňuje nasazovat a spravovat kontejnerizované aplikace bez znalosti orchestrace kontejnerů. AKS také umožňuje provádět mnoho běžných operací údržby, aniž by bylo třeba aplikaci offline. Mezi tyto operace patří zřizování, upgrade a škálování prostředků na vyžádání.

V tomto článku získáte informace o těchto tématech:

  • Použití HCL (Jazyk společnosti HashiCorp) k definování clusteru Kubernetes
  • Použití Terraformu a AKS k vytvoření clusteru Kubernetes
  • Použití nástroje kubectl k otestování dostupnosti clusteru Kubernetes

1. Konfigurace prostředí

  • Předplatné Azure: Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.
  • Objekt služby Azure:Pokud nemáte objekt služby, vytvořte objekt služby. Poznamenejte si hodnoty appId pro , displayName , a passwordtenant .

2. Vytvoření páru klíčů SSH

Ukázka v tomto článku používá pár klíčů SSH k ověření uživatele ve virtuálním počítače.

Vygenerujte pár klíčů SSH pomocí jednoho z následujících článků v závislosti na vašem prostředí:

3. Vytvoření adresářové struktury

Prvním krokem je vytvoření adresáře s konfiguračními soubory Terraformu pro toto cvičení.

  1. Otevřete příkazový řádek, ze kterého můžete spouštět příkazy Terraformu.

  2. Vytvořte adresář s názvem terraform-aks-k8s.

  3. Přejděte do nového adresáře:

4. Deklarace poskytovatele Azure

Konfigurační soubor Terraformu začíná specifikací poskytovatele. Při použití Azure zadáte v bloku poskytovatele Azure (azurerm).

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>2.0"
    }
  }
}
provider "azurerm" {
  features {}
}
resource "azurerm_resource_group" "rg" {
  name = "<resource_group_name>"
  location = "<location>"
}

# Your Terraform code goes here...

Klíčové body:

  • I když version je atribut volitelný, HashiCorp doporučuje připnutí na danou verzi poskytovatele.
  • Pokud používáte poskytovatele Azure 1.x, features blok není povolený.
  • Pokud používáte poskytovatele Azure 2.x, features je blok povinný.
  • Deklarace prostředku třídyazurerm_resource_group dva argumenty: a . Nastavte zástupné symboly na odpovídající hodnoty pro vaše prostředí.
  • Místní pojmenovaná hodnota skupiny prostředků se používá v článcích s postupy a články při odkazování na skupinu prostředků. Tato hodnota je nezávislá na názvu skupiny prostředků a odkazuje pouze na název proměnné ve vašem kódu. Pokud změníte tuto hodnotu v definici skupiny prostředků, změňte ji také v kódu, který na tuto hodnotu odkazuje.

5. Definování clusteru Kubernetes

Vytvořte konfigurační soubor Terraformu, který deklaruje prostředky pro cluster Kubernetes.

  1. Vytvořte soubor s názvem k8s.tf.

  2. Do nového souboru vložte následující kód:

    resource "azurerm_resource_group" "k8s" {
        name     = var.resource_group_name
        location = var.location
    }
    
    resource "random_id" "log_analytics_workspace_name_suffix" {
        byte_length = 8
    }
    
    resource "azurerm_log_analytics_workspace" "test" {
        # 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}"
        location            = var.log_analytics_workspace_location
        resource_group_name = azurerm_resource_group.k8s.name
        sku                 = var.log_analytics_workspace_sku
    }
    
    resource "azurerm_log_analytics_solution" "test" {
        solution_name         = "ContainerInsights"
        location              = azurerm_log_analytics_workspace.test.location
        resource_group_name   = azurerm_resource_group.k8s.name
        workspace_resource_id = azurerm_log_analytics_workspace.test.id
        workspace_name        = azurerm_log_analytics_workspace.test.name
    
        plan {
            publisher = "Microsoft"
            product   = "OMSGallery/ContainerInsights"
        }
    }
    
    resource "azurerm_kubernetes_cluster" "k8s" {
        name                = var.cluster_name
        location            = azurerm_resource_group.k8s.location
        resource_group_name = azurerm_resource_group.k8s.name
        dns_prefix          = var.dns_prefix
    
        linux_profile {
            admin_username = "ubuntu"
    
            ssh_key {
                key_data = file(var.ssh_public_key)
            }
        }
    
        default_node_pool {
            name            = "agentpool"
            node_count      = var.agent_count
            vm_size         = "Standard_D2_v2"
        }
    
        service_principal {
            client_id     = var.client_id
            client_secret = var.client_secret
        }
    
        addon_profile {
            oms_agent {
            enabled                    = true
            log_analytics_workspace_id = azurerm_log_analytics_workspace.test.id
            }
        }
    
        network_profile {
            load_balancer_sku = "Standard"
            network_plugin = "kubenet"
        }
    
        tags = {
            Environment = "Development"
        }
    }
    

    Předchozí kód nastaví název clusteru, umístění a název skupiny prostředků. Je také nastavena předpona plně kvalifikovaného názvu domény (FQDN). Plně kvalifikovaný název domény se používá pro přístup ke clusteru.

    Záznam umožňuje nakonfigurovat nastavení, která umožňují přihlášení k linux_profile pracovním uzlům pomocí protokolu SSH.

    Se službou AKS platíte jenom za pracovní uzly. Záznam default_node_pool nakonfiguruje podrobnosti pro tyto pracovní uzly. zahrnuje default_node_pool record počet pracovních uzlů, které se mají vytvořit, a typ pracovních uzlů. Pokud budete v budoucnu potřebovat škálovat cluster nahoru nebo dolů, upravíte count hodnotu v tomto záznamu.

6. Deklarace proměnných

  1. Vytvořte soubor s názvem , který bude obsahovat proměnné projektu, a variables.tf vložte následující kód:

    variable "client_id" {}
    variable "client_secret" {}
    
    variable "agent_count" {
        default = 3
    }
    
    variable "ssh_public_key" {
        default = "~/.ssh/id_rsa.pub"
    }
    
    variable "dns_prefix" {
        default = "k8stest"
    }
    
    variable cluster_name {
        default = "k8stest"
    }
    
    variable resource_group_name {
        default = "azure-k8stest"
    }
    
    variable location {
        default = "Central US"
    }
    
    variable log_analytics_workspace_name {
        default = "testLogAnalyticsWorkspaceName"
    }
    
    # refer https://azure.microsoft.com/global-infrastructure/services/?products=monitor for log analytics available regions
    variable log_analytics_workspace_location {
        default = "eastus"
    }
    
    # refer https://azure.microsoft.com/pricing/details/monitor/ for log analytics pricing 
    variable log_analytics_workspace_sku {
        default = "PerGB2018"
    }
    

7. Vytvoření výstupního souboru Terraformu

Výstupy Terraformu vám umožňují definovat hodnoty, které se uživateli zvýrazní, když Terraform použije plán a bude možné se na něj dotázat příkazem . V této části vytvoříte výstupní soubor, který pomocí kubectl umožňuje přístup ke clusteru.

  1. Vytvořte soubor s názvem output.tf.

  2. Do nového souboru vložte následující kód:

    output "client_key" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.client_key
    }
    
    output "client_certificate" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.client_certificate
    }
    
    output "cluster_ca_certificate" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.cluster_ca_certificate
    }
    
    output "cluster_username" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.username
    }
    
    output "cluster_password" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.password
    }
    
    output "kube_config" {
        value = azurerm_kubernetes_cluster.k8s.kube_config_raw
        sensitive = true
    }
    
    output "host" {
        value = azurerm_kubernetes_cluster.k8s.kube_config.0.host
    }
    

8. Nastavení úložiště Azure pro uložení stavu Terraformu

Terraform sleduje stav místně prostřednictvím souboru terraform.tfstate. Tento model funguje dobře v prostředí s jednou osobou. V prostředí s více osoby se ke sledování stavu používá úložiště Azure.

V této části se můžete podívat, jak provádět následující úlohy:

  • Načtení informací o účtu úložiště (název účtu a klíč účtu)
  • Vytvořte kontejner úložiště, do kterého se budou ukládat informace o stavu Terraformu.
  1. Na webu Azure Portal vyberte v levé nabídce Všechny služby.

  2. Vyberte Účty úložiště.

  3. Na kartě Účty úložiště vyberte název účtu úložiště, do kterého má Terraform ukládat stav. Můžete například použít účet úložiště, který se vytvoří při prvním otevření služby Cloud Shell. Název účtu úložiště vytvořeného službou Cloud Shell obvykle začíná na cs a následuje ho řetězec náhodných čísel a písmen. Poznamenejte si účet úložiště, který vyberete. Tato hodnota se bude potřebovat později.

  4. Na kartě účtu úložiště vyberte Přístupové klíče.

    Nabídka účtu úložiště

  5. Poznamenejte si hodnotu Klíč v části klíč1. (Výběr ikony napravo od klíče zkopíruje příslušnou hodnotu do schránky.)

    Přístupové klíče účtu úložiště

  6. Ve svém účtu úložiště Azure vytvořte kontejner. Zástupné symboly nahraďte příslušnými hodnotami pro vaše prostředí.

    az storage container create -n tfstate --account-name <YourAzureStorageAccountName> --account-key <YourAzureStorageAccountKey>
    

9. Vytvoření clusteru Kubernetes

V této části se dozvíte, jak pomocí příkazu vytvořit prostředky definované v konfiguračních souborech, které jste vytvořili terraform init v předchozích částech.

  1. V Cloud Shell inicializovat Terraform. Zástupné symboly nahraďte příslušnými hodnotami pro vaše prostředí.

    terraform init -backend-config="storage_account_name=<YourAzureStorageAccountName>" -backend-config="container_name=tfstate" -backend-config="access_key=<YourStorageAccountAccessKey>" -backend-config="key=codelab.microsoft.tfstate" 
    

    Příkaz terraform init zobrazí úspěch inicializace back-endu a modulu plug-in zprostředkovatele:

    Příklad výsledků příkazu „terraform init“

  2. Exportujte své přihlašovací údaje instančního objektu. Zástupné symboly nahraďte příslušnými hodnotami z vašeho objektu služby.

    export TF_VAR_client_id=<service-principal-appid>
    export TF_VAR_client_secret=<service-principal-password>
    
  3. Spuštěním příkazu terraform plan vytvořte plán Terraformu, který definuje prvky infrastruktury.

    terraform plan -out out.plan
    

    Příkaz terraform plan zobrazí prostředky, které se po spuštění příkazu terraform apply vytvoří:

    Příklad výsledků příkazu „terraform plan“

  4. Spuštěním příkazu terraform apply použijte plán a vytvořte cluster Kubernetes. Proces vytvoření clusteru Kubernetes může trvat několik minut, což vede k Cloud Shell relace. Pokud Cloud Shell časový limit relace, můžete postupovat podle kroků v části Obnovení z časového limitu Cloud Shell, abyste mohli proces dokončit.

    terraform apply out.plan
    

    Příkaz terraform apply zobrazí výsledky vytvoření prostředků definovaných v konfiguračních souborech:

    Příklad výsledků příkazu „terraform apply“

  5. V Azure Portal nabídce vlevo vyberte Všechny prostředky. Zobrazí se prostředky vytvořené pro nový cluster Kubernetes.

    Všechny prostředky v Azure Portal

10. Zotavení z Cloud Shell časového limitu

Pokud Cloud Shell relace aplikace, můžete provést následující kroky k obnovení:

  1. Spusťte relaci služby Cloud Shell.

  2. Přejděte do adresáře, který obsahuje konfigurační soubory Terraformu.

    cd /clouddrive/terraform-aks-k8s
    
  3. Spusťte následující příkaz:

    export KUBECONFIG=./azurek8s
    

11. Testování clusteru Kubernetes

Nově vytvořený cluster můžete pomocí nástrojů Kubernetes ověřit.

  1. Získejte konfiguraci Kubernetes ze stavu Terraformu a uložte ji do souboru, který dokáže nástroj kubectl přečíst.

    echo "$(terraform output kube_config)" > ./azurek8s
    
  2. Zkontrolujte, že předchozí příkaz nepřidá znak EOT ASCII.

    cat ./azurek8s
    

    Pokud se zobrazí na začátku a na konci, upravte obsah souboru a << EOTEOT odeberte je. To je nezbytné, jinak by se vám mohla zobrazit následující zpráva: error: error loading config file "./azurek8s": yaml: line 2: mapping values ​​are not allowed in this context

  3. Nastavte proměnnou prostředí, aby kubectl převzal správnou konfiguraci.

    export KUBECONFIG=./azurek8s
    
  4. Ověřte stav clusteru.

    kubectl get nodes
    

    Měly by se zobrazit podrobnosti o pracovních uzlech a všechny uzly by měli být ve stavu Ready (Připravené), jak je znázorněno na následujícím obrázku:

    Nástroj kubectl vám umožňuje ověřit stav clusteru Kubernetes.

12. Monitorování stavu a protokolů

Při vytvoření clusteru AKS se povolilo monitorování za účelem zachycování metrik stavu podů i uzlů clusteru. Tyto metriky stavu jsou k dispozici na webu Azure Portal. Další informace o monitorování stavu clusteru najdete v tématu Monitorování stavu služby Azure Kubernetes Service.

Řešení potíží s Terraformem v Azure

Řešení běžných problémů při používání Terraformu v Azure

Další kroky