Een Kubernetes-cluster maken met Azure Kubernetes Service terraform

Azure Kubernetes Service (AKS) beheert uw gehoste Kubernetes-omgeving. Met AKS kunt u toepassingen in containers implementeren en beheren zonder kennis van container orchestration. Met AKS kunt u ook veel algemene onderhoudsbewerkingen uitvoeren zonder uw app offline te halen. Deze bewerkingen omvatten het inrichten, upgraden en schalen van resources op aanvraag.

In dit artikel leert u het volgende:

  • HCL (HashiCorp Configuration Language) gebruiken om een Kubernetes-cluster te definiëren
  • Terraform en AKS gebruiken om een Kubernetes-cluster te maken
  • Het hulpprogramma kubectl gebruiken om de beschikbaarheid van een Kubernetes-cluster te testen

1. Uw omgeving configureren

  • Azure-abonnement: Als u nog geen abonnement op Azure hebt, maak dan een gratis account aan voordat u begint.
  • Azure-service-principal:als u geen service-principal hebt, maakt u een service-principal. Noteer de waarden voor appId de , , en displayNamepasswordtenant .

2. Een SSH-sleutelpaar maken

In het voorbeeld in dit artikel wordt een SSH-sleutelpaar gebruikt om de gebruiker te valideren bij de VM.

Genereer een SSH-sleutelpaar met behulp van een van de volgende artikelen, afhankelijk van uw omgeving:

3. De mapstructuur maken

De eerste stap is het maken van een map voor de Terraform-configuratiebestanden voor de oefening.

  1. Open een opdrachtregelprompt van waaruit u Terraform-opdrachten kunt uitvoeren.

  2. Maak een map met de naam terraform-aks-k8s.

  3. Maak de nieuwe directory de actieve directory:

4. De Azure-provider declareer

Een Terraform-configuratiebestand begint met de specificatie van de provider. Wanneer u Azure gebruikt, geeft u de Azure-provider (azurerm) op in het blok.

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...

Belangrijkste punten:

  • Hoewel het version kenmerk optioneel is, raadt HashiCorp aan om vast te maken aan een bepaalde versie van de provider.
  • Als u Azure-provider 1.x gebruikt, features is het blok niet toegestaan.
  • Als u Azure-provider 2.x gebruikt, features is het blok vereist.
  • De resourcedeclaratievan azurerm_resource_group heeft twee argumenten: en . Stel de tijdelijke aanduidingen in op de juiste waarden voor uw omgeving.
  • De lokale benoemde waarde van voor de resourcegroep wordt gebruikt in de artikelen met gebruiksartikelen en artikelen wanneer wordt verwezen naar de resourcegroep. Deze waarde is onafhankelijk van de naam van de resourcegroep en verwijst alleen naar de naam van de variabele in uw code. Als u deze waarde wijzigt in de definitie van de resourcegroep, wijzigt u deze ook in de code waarnaar wordt verwezen.

5. Een Kubernetes-cluster definiëren

Maak het Terraform-configuratiebestand waarin de resources voor het Kubernetes-cluster worden gedeclareerd.

  1. Maak een bestand met de naam k8s.tf.

  2. Voeg de volgende code in het nieuwe bestand in:

    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"
        }
    }
    

    Met de voorgaande code stelt u de naam van het cluster, de locatie en de naam van de resourcegroep in. Het voorvoegsel voor de FQDN (Fully Qualified Domain Name) wordt ook ingesteld. De FQDN wordt gebruikt voor toegang tot het cluster.

    Met de record kunt u de instellingen configureren waarmee u zich met behulp van SSH kunt aanmelden bij de linux_profile werkknooppunten.

    Met AKS betaalt u alleen voor de werkknooppunten. De default_node_pool record configureert de details voor deze werkknooppunten. De default_node_pool record omvat het aantal werkknooppunten dat moet worden maken en het type werkknooppunten. Als u het cluster in de toekomst omhoog of omlaag wilt schalen, wijzigt u de count waarde in deze record.

6. De variabelen declareer

  1. Maak een bestand met de variables.tf naam dat de projectvariabelen bevat en voeg de volgende code in:

    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. Een Terraform-uitvoerbestand maken

Met Terraform-uitvoer kunt u waarden definiëren die voor de gebruiker worden gemarkeerd wanneer in Terraform een plan wordt toegepast. Deze uitvoer kan worden opgevraagd met de opdracht . In deze sectie maakt u een uitvoerbestand waarmee via kubectl toegang wordt verkregen tot het cluster.

  1. Maak een bestand met de naam output.tf.

  2. Voeg de volgende code in het nieuwe bestand in:

    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. Azure Storage instellen voor het opslaan van de Terraform-status

In Terraform wordt de status lokaal bijgehouden via het bestand terraform.tfstate. Dit patroon werkt goed in een omgeving met één persoon. In een omgeving met meerdere personen wordt Azure Storage gebruikt om de status bij te houden.

In deze sectie ziet u hoe u de volgende taken uitvoert:

  • Opslagaccountgegevens ophalen (accountnaam en accountsleutel)
  • Maak een opslagcontainer waarin Terraform-statusgegevens worden opgeslagen.
  1. Selecteer in Azure Portal de optie Alle services in het linkermenu.

  2. Selecteer Opslagaccounts.

  3. Selecteer op het tabblad Opslagaccounts de naam van het opslagaccount waarin de Terraform-status moet worden opgeslagen. U kunt bijvoorbeeld het opslagaccount gebruiken dat u hebt gemaakt toen u Cloud Shell de eerste keer opende. De opslagaccountnaam die door Cloud Shell wordt gemaakt, begint gewoonlijk met cs, gevolgd door een willekeurige tekenreeks met cijfers en letters. Noteer het opslagaccount dat u selecteert. Deze waarde is later nodig.

  4. Selecteer op het opslagaccounttabblad Toegangssleutels.

    Opslagaccountmenu

  5. Noteer de waarde van de key1-sleutel. (Als u het pictogram rechts van de sleutel selecteert, wordt de waarde gekopieerd naar het klembord.)

    Toegangssleutels voor opslagaccount

  6. Maak een container in uw Azure-opslagaccount. Vervang de tijdelijke aanduidingen door de juiste waarden voor uw omgeving.

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

9. Het Kubernetes-cluster maken

In deze sectie ziet u hoe u de opdracht gebruikt om de resources te maken die zijn gedefinieerd in de configuratiebestanden die u terraform init in de vorige secties hebt gemaakt.

  1. Initialiseer in Cloud Shell Terraform. Vervang de tijdelijke aanduidingen door de juiste waarden voor uw omgeving.

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

    De terraform init opdracht geeft het succes weer van het initialiseren van de back-en provider-in plug-in:

    Voorbeeld van de resultaten van de opdracht 'terraform init'

  2. Exporteer uw service-principal-referenties. Vervang de tijdelijke aanduidingen door de juiste waarden van uw service-principal.

    export TF_VAR_client_id=<service-principal-appid>
    export TF_VAR_client_secret=<service-principal-password>
    
  3. Voer de opdracht terraform plan uit om het Terraform-plan te maken waarmee de infrastructuurelementen worden gedefinieerd.

    terraform plan -out out.plan
    

    Met de opdracht terraform plan geeft u de resources weer die worden gemaakt tijdens het uitvoeren van de opdracht terraform apply:

    Voorbeeld van de resultaten van de opdracht 'terraform plan'

  4. Voer de opdracht terraform apply uit om het plan voor het maken van het Kubernetes-cluster toe te passen. Het proces voor het maken van een Kubernetes-cluster kan enkele minuten duren, wat resulteert in Cloud Shell time-out van de sessie. Als er Cloud Shell time-out is voor de sessie, kunt u de stappen in de sectie Herstellen van Cloud Shell time-out volgen om het proces te voltooien.

    terraform apply out.plan
    

    Met de opdracht terraform apply geeft u de resultaten weer van het maken van de resources die zijn gedefinieerd in uw configuratiebestanden:

    Voorbeeld van de resultaten van de opdracht 'terraform apply'

  5. Selecteer in Azure Portal alle resources in het linkermenu om de resources te zien die zijn gemaakt voor uw nieuwe Kubernetes-cluster.

    Alle resources in de Azure Portal

10. Herstellen van een Cloud Shell time-out

Als er een Cloud Shell, kunt u de volgende stappen volgen om te herstellen:

  1. Start een Cloud Shell-sessie.

  2. Ga naar de map met uw Terraform-configuratiebestanden.

    cd /clouddrive/terraform-aks-k8s
    
  3. Voer de volgende opdracht uit:

    export KUBECONFIG=./azurek8s
    

11. Het Kubernetes-cluster testen

U kunt het gemaakte cluster controleren met de Kubernetes-hulpprogramma's.

  1. Haal de Kubernetes-configuratie op uit de Terraform-status en sla deze op in een bestand dat door kubectl kan worden gelezen.

    echo "$(terraform output kube_config)" > ./azurek8s
    
  2. Controleer of met de vorige opdracht geen EOT ASCII-teken is toevoegen

    cat ./azurek8s
    

    Als u aan het begin en aan het einde ziet, bewerkt u << EOT de inhoud van het bestand om deze te EOT verwijderen. Dit is nodig, anders zou u het volgende bericht kunnen ontvangen: error: error loading config file "./azurek8s": yaml: line 2: mapping values ​​are not allowed in this context

  3. Stel een omgevingsvariabele in zodat de juiste configuratie wordt opgehaald door kubectl.

    export KUBECONFIG=./azurek8s
    
  4. Controleer de status van het cluster.

    kubectl get nodes
    

    De details van de werkknooppunten worden weergegeven. De status van al deze werkknooppunten moet Gereed zijn, zoals in de volgende afbeelding is weergegeven:

    Met het hulpprogramma kubectl kunt u de status van uw Kubernetes-cluster controleren

12. Status en logboeken bewaken

Toen het AKS-cluster werd gemaakt, werd controleren ingeschakeld om metrische gegevens over de status van de clusterknooppunten en -pods vast te leggen. Deze metrische gegevens over de status zijn in de Azure-portal beschikbaar. Zie Status van Azure Kubernetes Service controleren voor meer informatie over het controleren van de status van de container.

Problemen met Terraform in Azure oplossen

Veelvoorkomende problemen bij het gebruik van Terraform in Azure oplossen

Volgende stappen