Quickstart: Een AKS-cluster (Azure Kubernetes Service) implementeren met behulp van Terraform

Azure Kubernetes Service (AKS) is een beheerde Kubernetes-service waarmee u snel clusters kunt implementeren en beheren. In deze snelstart, gaat u het volgende doen:

  • Implementeer een AKS-cluster met behulp van Terraform.
  • Voer een voorbeeldtoepassing met meerdere containers uit met een groep microservices en webfront-ends die een retailscenario simuleren.

Notitie

Om snel aan de slag te gaan met het snel inrichten van een AKS-cluster, bevat dit artikel stappen voor het implementeren van een cluster met alleen standaardinstellingen voor evaluatiedoeleinden. Voordat u een cluster implementeert dat gereed is voor productie, raden we u aan vertrouwd te raken met de referentiearchitectuur van de basislijn om na te gaan hoe dit overeenkomt met uw bedrijfsvereisten.

Voordat u begint

Notitie

De Azure Linux-knooppuntgroep is nu algemeen beschikbaar (GA). Zie de inleiding tot de Azure Linux-containerhost voor AKS voor meer informatie over de voordelen en implementatiestappen.

Aanmelden bij uw Azure-account

Meld u eerst aan bij uw Azure-account en verifieer met behulp van een van de methoden die in de volgende sectie worden beschreven.

Terraform- en Azure-verificatiescenario's

Terraform biedt alleen ondersteuning voor verificatie bij Azure via de Azure CLI. Verificatie met behulp van Azure PowerShell wordt niet ondersteund. Hoewel u de Azure PowerShell-module kunt gebruiken bij het uitvoeren van uw Terraform-werk, moet u zich eerst verifiëren bij Azure met behulp van de Azure CLI.

In dit artikel wordt uitgelegd hoe u Terraform verifieert bij Azure voor de volgende scenario's. Zie Verifiëren met behulp van de Azure CLI voor meer informatie over opties voor het verifiëren van Terraform bij Azure.

Verifiëren bij Azure via een Microsoft-account

Een Microsoft-account is een gebruikersnaam (gekoppeld aan een e-mailadres en de bijbehorende referenties) die wordt gebruikt om u aan te melden bij Microsoft-services, zoals Azure. Een Microsoft-account kan worden gekoppeld aan een of meer Azure-abonnementen, waarbij een van deze abonnementen de standaardinstelling is.

In de volgende stappen ziet u hoe:

  • Interactief aanmelden bij Azure met behulp van een Microsoft-account
  • De gekoppelde Azure-abonnementen van het account weergeven (inclusief de standaardinstelling)
  • Stel het huidige abonnement in.
  1. Open een opdrachtregel die toegang heeft tot de Azure CLI.

  2. Voer az login zonder parameters uit en volg de instructies om u aan te melden bij Azure.

    az login
    

    Belangrijkste punten:

    • Wanneer u zich hebt aangemeld, az login wordt een lijst weergegeven met de Azure-abonnementen die zijn gekoppeld aan het aangemelde Microsoft-account, inclusief het standaardabonnement.
  3. Voer az account show uit om het huidige Azure-abonnement te bevestigen.

    az account show
    
  4. Als u alle azure-abonnementsnamen en id's voor een specifiek Microsoft-account wilt weergeven, voert u az account list uit.

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

    Belangrijkste punten:

    • Vervang de <microsoft_account_email> tijdelijke aanduiding door het e-mailadres van het Microsoft-account waarvan u de Azure-abonnementen wilt vermelden.
    • Met een live-account, zoals een Hotmail of Outlook, moet u mogelijk het volledig gekwalificeerde e-mailadres opgeven. Als uw e-mailadres bijvoorbeeld is admin@hotmail.com, moet u de tijdelijke aanduiding mogelijk vervangen door live.com#admin@hotmail.com.
  5. Als u een specifiek Azure-abonnement wilt gebruiken, voert u az account set uit.

    az account set --subscription "<subscription_id_or_subscription_name>"
    

    Belangrijkste punten:

    • Vervang de <subscription_id_or_subscription_name> tijdelijke aanduiding door de id of naam van het abonnement dat u wilt gebruiken.
    • Bij het aanroepen az account set worden de resultaten van het overschakelen naar het opgegeven Azure-abonnement niet weergegeven. U kunt echter gebruiken az account show om te bevestigen dat het huidige Azure-abonnement is gewijzigd.
    • Als u de az account list opdracht uit de vorige stap uitvoert, ziet u dat het standaard Azure-abonnement is gewijzigd in het abonnement waarmee az account setu hebt opgegeven.

Een service-principal maken

Geautomatiseerde hulpprogramma's die Azure-services implementeren of gebruiken, zoals Terraform, moeten altijd beperkte machtigingen hebben. In plaats van toepassingen zich te laten aanmelden als een gebruiker met volledige rechten, biedt Azure Service Principals.

Het meest voorkomende patroon is om u interactief aan te melden bij Azure, een service-principal te maken, de service-principal te testen en die service-principal vervolgens te gebruiken voor toekomstige verificatie (interactief of vanuit uw scripts).

  1. Meld u aan bij Azure om een service-principal te maken. Nadat u zich hebt geverifieerd bij Azure via een Microsoft-account, keert u hier terug.

  2. Als u een service-principal maakt vanuit Git Bash, stelt u de MSYS_NO_PATHCONV omgevingsvariabele in. (Deze stap is niet nodig als u Cloud Shell gebruikt.)

    export MSYS_NO_PATHCONV=1    
    

    Belangrijkste punten:

    • U kunt de MSYS_NO_PATHCONV omgevingsvariabele globaal instellen (voor alle terminalsessies) of lokaal (alleen voor de huidige sessie). Omdat u niet vaak een service-principal maakt, stelt het voorbeeld de waarde voor de huidige sessie in. Als u deze omgevingsvariabele globaal wilt instellen, voegt u de instelling toe aan het ~/.bashrc bestand.
  3. Voer az ad sp create-for-rbac uit om een service-principal te maken.

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

    Belangrijkste punten:

    • U kunt de <service-principal-name> parameter vervangen door een aangepaste naam voor uw omgeving of de parameter volledig weglaten. Als u de parameter weglaat, wordt de naam van de service-principal gegenereerd op basis van de huidige datum en tijd.
    • Wanneer de voltooiing is voltooid, az ad sp create-for-rbac worden verschillende waarden weergegeven. De appIdwaarden en waarden tenantpasswordworden gebruikt in de volgende stap.
    • Het wachtwoord kan niet worden opgehaald als het verloren gaat. Als zodanig moet u uw wachtwoord opslaan op een veilige plaats. Als u uw wachtwoord bent vergeten, kunt u de referenties van de service-principal opnieuw instellen.
    • Voor dit artikel wordt een service-principal met de rol Inzender gebruikt. Zie RBAC: Ingebouwde rollen voor meer informatie over rollen gebaseerd toegangsbeheer (RBAC).
    • De uitvoer van het maken van de service-principal bevat gevoelige referenties. Zorg ervoor dat u deze referenties niet in uw code opneemt of controleer de referenties in uw broncodebeheer.
    • Zie het artikel Een Azure-service-principal maken met de Azure CLI voor meer informatie over opties bij het maken van een service-principal met de Azure CLI.

Referenties voor de service-principal opgeven in omgevingsvariabelen

Zodra u een service-principal hebt gemaakt, kunt u de referenties voor Terraform opgeven via omgevingsvariabelen.

  1. Bewerk het ~/.bashrc bestand door de volgende omgevingsvariabelen toe te voegen.

    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. Als u het ~/.bashrc script wilt uitvoeren, voert u het script source ~/.bashrc uit (of het verkorte equivalent . ~/.bashrc). U kunt Cloud Shell ook afsluiten en opnieuw openen om het script automatisch uit te voeren.

    . ~/.bashrc
    
  3. Zodra de omgevingsvariabelen zijn ingesteld, kunt u de waarden als volgt controleren:

    printenv | grep ^ARM*
    

Belangrijkste punten:

  • Net als bij elke omgevingsvariabele, gebruikt u de volgende syntaxis om toegang te krijgen tot een Azure-abonnementswaarde vanuit een Terraform-script: ${env.<environment_variable>} Als u bijvoorbeeld toegang wilt krijgen tot de ARM_SUBSCRIPTION_ID waarde, geeft u ${env.ARM_SUBSCRIPTION_ID}op.
  • Bij het maken en toepassen van Terraform-uitvoeringsplannen worden wijzigingen aangebracht in het Azure-abonnement dat is gekoppeld aan de service-principal. Dit kan soms verwarrend zijn als u bent aangemeld bij één Azure-abonnement en de omgevingsvariabelen verwijzen naar een tweede Azure-abonnement. Laten we eens kijken naar het volgende voorbeeld om het uit te leggen. Stel dat u twee Azure-abonnementen hebt: SubA en SubB. Als het huidige Azure-abonnement SubA is (bepaald via az account show) terwijl de omgevingsvariabelen verwijzen naar SubB, bevinden eventuele wijzigingen van Terraform zich in SubB. Daarom moet u zich aanmelden bij uw SubB-abonnement om Azure CLI-opdrachten of Azure PowerShell-opdrachten uit te voeren om uw wijzigingen weer te geven.

Referenties voor de service-principal opgeven in een Terraform-providerblok

Het Blok azure-provider definieert syntaxis waarmee u de verificatiegegevens van uw Azure-abonnement kunt opgeven.

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

Let op

De mogelijkheid om uw Azure-abonnementsreferenties op te geven in een Terraform-configuratiebestand kan handig zijn, met name bij het testen. Het is echter niet raadzaam om referenties op te slaan in een bestand met duidelijke tekst dat kan worden bekeken door niet-vertrouwde personen.

De Terraform-code implementeren

Notitie

De voorbeeldcode voor dit artikel bevindt zich in de Azure Terraform GitHub-opslagplaats. U kunt het logboekbestand met de testresultaten van de huidige en vorige versies van Terraform bekijken.

Zie meer artikelen en voorbeeldcode waarin wordt getoond hoe u Terraform gebruikt om Azure-resources te beheren

  1. Maak een map die u kunt gebruiken om de Terraform-voorbeeldcode te testen en de huidige map te maken.

  2. Maak een bestand met de naam providers.tf en voeg de volgende code in:

    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. Maak een bestand met de naam ssh.tf en voeg de volgende code in:

    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. Maak een bestand met de naam main.tf en voeg de volgende code in:

    # 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. Maak een bestand met de naam variables.tf en voeg de volgende code in:

    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. Maak een bestand met de naam outputs.tf en voeg de volgende code in:

    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 initialiseren

Voer terraform init uit om de Terraform-implementatie te initialiseren. Met deze opdracht wordt de Azure-provider gedownload die is vereist voor het beheren van uw Azure-resources.

terraform init -upgrade

Belangrijkste punten:

  • Met -upgrade de parameter worden de benodigde providerinvoegtoepassingen bijgewerkt naar de nieuwste versie die voldoet aan de versiebeperkingen van de configuratie.

Een Terraform-uitvoeringsplan maken

Voer terraform-plan uit om een uitvoeringsplan te maken.

terraform plan -out main.tfplan

Belangrijkste punten:

  • De terraform plan opdracht maakt een uitvoeringsplan, maar voert het niet uit. In plaats daarvan wordt bepaald welke acties nodig zijn om de configuratie te maken die is opgegeven in uw configuratiebestanden. Met dit patroon kunt u controleren of het uitvoeringsplan aan uw verwachtingen voldoet voordat u wijzigingen aanbrengt in de werkelijke resources.
  • Met de optionele -out parameter kunt u een uitvoerbestand voor het plan opgeven. Door de -out parameter te gebruiken, zorgt u ervoor dat het plan dat u hebt gecontroleerd precies wordt toegepast.

Een Terraform-uitvoeringsplan toepassen

Terraform uitvoeren is van toepassing om het uitvoeringsplan toe te passen op uw cloudinfrastructuur.

terraform apply main.tfplan

Belangrijkste punten:

  • Bij de voorbeeldopdracht terraform apply wordt ervan uitgegaan dat u eerder hebt uitgevoerd terraform plan -out main.tfplan.
  • Als u een andere bestandsnaam voor de -out parameter hebt opgegeven, gebruikt u diezelfde bestandsnaam in de aanroep naar terraform apply.
  • Als u de parameter niet hebt gebruikt, roept terraform apply u deze -out aan zonder parameters.

De resultaten controleren

  1. Haal de naam van de Azure-resourcegroep op met behulp van de volgende opdracht.

    resource_group_name=$(terraform output -raw resource_group_name)
    
  2. Geef de naam van uw nieuwe Kubernetes-cluster weer met behulp van de opdracht az aks list .

    az aks list \
      --resource-group $resource_group_name \
      --query "[].{\"K8s cluster name\":name}" \
      --output table
    
  3. Haal de Kubernetes-configuratie op uit de Terraform-status en sla deze op in een bestand dat kubectl kan worden gelezen met behulp van de volgende opdracht.

    echo "$(terraform output kube_config)" > ./azurek8s
    
  4. Controleer of de vorige opdracht geen ASCII EOT-teken heeft toegevoegd met behulp van de volgende opdracht.

    cat ./azurek8s
    

    Belangrijkste punten:

    • Als u aan het begin en EOT aan het einde ziet<< EOT, verwijdert u deze tekens uit het bestand. Anders wordt mogelijk het volgende foutbericht weergegeven: error: error loading config file "./azurek8s": yaml: line 2: mapping values are not allowed in this context
  5. Stel een omgevingsvariabele in zodat kubectl de juiste configuratie kan worden opgehaald met behulp van de volgende opdracht.

    export KUBECONFIG=./azurek8s
    
  6. Controleer de status van het cluster met behulp van de kubectl get nodes opdracht.

    kubectl get nodes
    

Belangrijkste punten:

  • Toen u het AKS-cluster maakte, is bewaking ingeschakeld voor het vastleggen van metrische statusgegevens voor zowel de clusterknooppunten als pods. 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.
  • Verschillende sleutelwaarden die zijn geclassificeerd als uitvoer bij het toepassen van het Terraform-uitvoeringsplan. Het hostadres, de gebruikersnaam van het AKS-cluster en het AKS-clusterwachtwoord worden bijvoorbeeld uitgevoerd.

De toepassing implementeren

Als u de toepassing wilt implementeren, gebruikt u een manifestbestand om alle objecten te maken die nodig zijn om de AKS Store-toepassing uit te voeren. Een Kubernetes-manifestbestand definieert de gewenste status van een cluster, zoals welke containerinstallatiekopieën moeten worden uitgevoerd. Het manifest bevat de volgende Kubernetes-implementaties en -services:

Schermopname van azure Store-voorbeeldarchitectuur.

  • Webwinkel: Webtoepassing voor klanten om producten te bekijken en bestellingen te plaatsen.
  • Productservice: toont productgegevens.
  • Orderservice: Orders plaatsen.
  • Rabbit MQ: Berichtenwachtrij voor een orderwachtrij.

Notitie

Het is niet raadzaam stateful containers, zoals Rabbit MQ, uit te voeren zonder permanente opslag voor productie. Deze worden hier gebruikt voor het gemak, maar we raden u aan beheerde services te gebruiken, zoals Azure CosmosDB of Azure Service Bus.

  1. Maak een bestand met de naam aks-store-quickstart.yaml en kopieer dit in het volgende manifest:

    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
    

    Zie Implementaties en YAML-manifestmanifesten voor een uitsplitsing van YAML-manifestbestanden.

    Als u het YAML-bestand lokaal maakt en opslaat, kunt u het manifestbestand uploaden naar uw standaardmap in CloudShell door de knop Bestanden uploaden/downloaden te selecteren en het bestand in uw lokale bestandssysteem te selecteren.

  2. Implementeer de toepassing met behulp van de kubectl apply opdracht en geef de naam van uw YAML-manifest op.

    kubectl apply -f aks-store-quickstart.yaml
    

    In de volgende voorbeelduitvoer ziet u de implementaties en services:

    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
    

De toepassing testen

Wanneer de toepassing wordt uitgevoerd, maakt een Kubernetes-service de front-end van de toepassing beschikbaar op internet. Dit proces kan enkele minuten duren.

  1. Controleer de status van de geïmplementeerde pods met behulp van de kubectl get pods opdracht. Zorg ervoor dat alle pods worden Running gebruikt voordat u doorgaat.

    kubectl get pods
    
  2. Controleer op een openbaar IP-adres voor de store-front-toepassing. Bewaak de voortgang met behulp van de kubectl get service opdracht met het --watch argument.

    kubectl get service store-front --watch
    

    De UITVOER VAN HET EXTERNE IP-adres voor de store-front service wordt in eerste instantie weergegeven als in behandeling:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   <pending>     80:30025/TCP   4h4m
    
  3. Zodra het EXTERNAL-IP-adres is gewijzigd in een daadwerkelijk openbaar IP-adres, gebruikt CTRL-C u dit om het kubectl controleproces te stoppen.

    In de volgende voorbeelduitvoer ziet u een geldig openbaar IP-adres dat aan de service is toegewezen:

    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. Open een webbrowser naar het externe IP-adres van uw service om de Azure Store-app in actie te zien.

    Schermopname van de AKS Store-voorbeeldtoepassing.

Resources opschonen

AKS-resources verwijderen

Voer de volgende stappen uit wanneer u de resources die zijn gemaakt via Terraform niet meer nodig hebt:

  1. Voer terraform-plan uit en geef de destroy vlag op.

    terraform plan -destroy -out main.destroy.tfplan
    

    Belangrijkste punten:

    • De terraform plan opdracht maakt een uitvoeringsplan, maar voert het niet uit. In plaats daarvan wordt bepaald welke acties nodig zijn om de configuratie te maken die is opgegeven in uw configuratiebestanden. Met dit patroon kunt u controleren of het uitvoeringsplan aan uw verwachtingen voldoet voordat u wijzigingen aanbrengt in de werkelijke resources.
    • Met de optionele -out parameter kunt u een uitvoerbestand voor het plan opgeven. Door de -out parameter te gebruiken, zorgt u ervoor dat het plan dat u hebt gecontroleerd precies wordt toegepast.
  2. Terraform uitvoeren is van toepassing om het uitvoeringsplan toe te passen.

    terraform apply main.destroy.tfplan
    

Service-principal verwijderen

  1. Haal de service-principal-id op met behulp van de volgende opdracht.

    sp=$(terraform output -raw sp)
    
  2. Verwijder de service-principal met behulp van de opdracht az ad sp delete .

    az ad sp delete --id $sp
    

De Azure Developer CLI-sjabloon klonen

Met de Azure Developer CLI kunt u snel voorbeelden downloaden uit de opslagplaats Azure-Samples . In onze quickstart downloadt u de aks-store-demo toepassing. Zie het azd overzicht voor meer informatie over de algemene gebruiksvoorbeelden.

  1. Kloon de demosjabloon voor het AKS-archief uit de opslagplaats Azure-Samples met behulp van de azd init opdracht met de --template parameter.

    azd init --template Azure-Samples/aks-store-demo
    
  2. Voer een omgevingsnaam in voor uw project die alleen alfanumerieke tekens en afbreekstreepjes gebruikt, zoals aks-terraform-1.

    Enter a new environment name: aks-terraform-1
    

Aanmelden bij uw Azure Cloud-account

De azd sjabloon bevat alle code die nodig is om de services te maken, maar u moet zich aanmelden bij uw Azure-account om de toepassing op AKS te hosten.

  1. Meld u aan bij uw account met behulp van de azd auth login opdracht.

    azd auth login
    
  2. Kopieer de apparaatcode die wordt weergegeven in de uitvoer en druk op Enter om u aan te melden.

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

    Belangrijk

    Als u een buiten-netwerk-VM of GitHub Codespace gebruikt, veroorzaken bepaalde Azure-beveiligingsbeleidsregels conflicten wanneer ze worden gebruikt om u aan te melden.azd auth login Als u hier een probleem krijgt, kunt u de tijdelijke oplossing azd-verificatie volgen. Dit omvat het gebruik van een curl aanvraag voor de localhost-URL waarnaar u bent omgeleid nadat u deze hebt uitgevoerd azd auth login.

  3. Verifieer met uw referenties op de aanmeldingspagina van uw organisatie.

  4. Controleer of u verbinding probeert te maken vanuit de Azure CLI.

  5. Controleer het bericht 'Verificatie van apparaatcode voltooid. Aangemeld bij Azure." wordt weergegeven in de oorspronkelijke terminal.

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

tijdelijke oplossing azd auth

Voor deze tijdelijke oplossing moet de Azure CLI zijn geïnstalleerd.

  1. Open een terminalvenster en meld u aan met de Azure CLI met behulp van de az login opdracht waarop de --scope parameter is ingesteld https://graph.microsoft.com/.default.

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

    U wordt omgeleid naar een verificatiepagina op een nieuw tabblad om een browsertoegangstoken te maken, zoals wordt weergegeven in het volgende voorbeeld:

    https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize?clientid=<your_client_id>.
    
  2. Kopieer de localhost-URL van de webpagina die u hebt ontvangen nadat u zich hebt aangemeld.azd auth login

  3. Gebruik in een nieuw terminalvenster de volgende curl aanvraag om u aan te melden. Zorg ervoor dat u de <localhost> tijdelijke aanduiding vervangt door de localhost-URL die u in de vorige stap hebt gekopieerd.

    curl <localhost>
    

    Een geslaagde aanmelding voert een HTML-webpagina uit, zoals wordt weergegeven in het volgende voorbeeld:

    <!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. Sluit de huidige terminal en open de oorspronkelijke terminal. U ziet nu een JSON-lijst met uw abonnementen.

  5. Kopieer het id veld van het abonnement dat u wilt gebruiken.

  6. Stel uw abonnement in met behulp van de az account set opdracht.

    az account set --subscription <subscription_id>
    

Resources voor uw cluster maken en implementeren

Als u de toepassing wilt implementeren, gebruikt u de azd up opdracht om alle objecten te maken die nodig zijn om de AKS Store-toepassing uit te voeren.

  • Een azure.yaml bestand definieert de gewenste status van een cluster, zoals welke containerinstallatiekopieën moeten worden opgehaald en bevat de volgende Kubernetes-implementaties en -services:

Diagram met de Azure Store-voorbeeldarchitectuur.

  • Webwinkel: Webtoepassing voor klanten om producten te bekijken en bestellingen te plaatsen.
  • Productservice: toont productgegevens.
  • Orderservice: Orders plaatsen.
  • Rabbit MQ: Berichtenwachtrij voor een orderwachtrij.

Notitie

Het is niet raadzaam stateful containers, zoals Rabbit MQ, uit te voeren zonder permanente opslag voor productie. Deze worden hier gebruikt voor het gemak, maar we raden u aan beheerde services te gebruiken, zoals Azure Cosmos DB of Azure Service Bus.

Toepassingsbronnen implementeren

Met azd de sjabloon voor deze quickstart maakt u een nieuwe resourcegroep met een AKS-cluster en een Azure Key Vault. De sleutelkluis slaat clientgeheimen op en voert de services uit in de pets naamruimte.

  1. Maak alle toepassingsbronnen met behulp van de azd up opdracht.

    azd up
    

    azd up voert alle hooks in de azd-hooks map uit om de toepassingsservices vooraf te registreren, in te richten en te implementeren.

    Pas hooks aan om aangepaste code toe te voegen aan de azd werkstroomfasen. Zie de azd naslaginformatie over hooks voor meer informatie.

  2. Selecteer een Azure-abonnement voor uw factureringsgebruik.

    ? Select an Azure Subscription to use:  [Use arrows to move, type to filter]
    > 1. My Azure Subscription (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
    
  3. Selecteer een regio waar u uw toepassing wilt implementeren.

    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 voert automatisch de preprovision- en postprovision-hooks uit om de resources voor uw toepassing te maken. Dit proces kan enkele minuten duren. Als u klaar bent, ziet u een uitvoer die lijkt op het volgende voorbeeld:

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

Terraform-plannen genereren

Binnen uw Azure Developer-sjabloon bevat de /infra/terraform map alle code die wordt gebruikt om het Terraform-plan te genereren.

Terraform implementeert en voert opdrachten uit met behulp terraform apply van de inrichtingsstap.azd Als u klaar bent, ziet u een uitvoer die lijkt op het volgende voorbeeld:

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

De toepassing testen

Wanneer de toepassing wordt uitgevoerd, maakt een Kubernetes-service de front-end van de toepassing beschikbaar op internet. Dit proces kan enkele minuten duren.

  1. Stel uw naamruimte in als de demonaamruimte pets met behulp van de kubectl set-context opdracht.

    kubectl config set-context --current --namespace=pets
    
  2. Controleer de status van de geïmplementeerde pods met behulp van de kubectl get pods opdracht. Zorg ervoor dat alle pods zijn Running voordat u doorgaat.

    kubectl get pods
    
  3. Controleer op een openbaar IP-adres voor de store-front-toepassing en controleer de voortgang met behulp van de kubectl get service opdracht met het --watch argument.

    kubectl get service store-front --watch
    

    De UITVOER VAN HET EXTERNE IP-adres voor de store-front service wordt in eerste instantie weergegeven als in behandeling:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   <pending>     80:30025/TCP   4h4m
    
  4. Zodra het EXTERNAL-IP-adres is gewijzigd in een daadwerkelijk openbaar IP-adres, gebruikt CTRL-C u dit om het kubectl controleproces te stoppen.

    In de volgende voorbeelduitvoer ziet u een geldig openbaar IP-adres dat is toegewezen aan de service:

    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. Open een webbrowser naar het externe IP-adres van uw service om de Azure Store-app in actie te zien.

    Schermopname van de AKS Store-voorbeeldtoepassing.

Het cluster verwijderen

Zodra u klaar bent met de quickstart, schoont u overbodige resources op om Azure-kosten te voorkomen.

  1. Verwijder alle resources die u in de quickstart hebt gemaakt met behulp van de azd down opdracht.

    azd down
    
  2. Bevestig uw beslissing om alle gebruikte resources uit uw abonnement te verwijderen door te typen y en op te drukken Enter.

    ? Total resources to delete: 14, are you sure you want to continue? (y/N)
    
  3. Leegmaken toestaan om de quickstart-variabelen opnieuw te gebruiken, indien van toepassing door te typen y en op te drukken 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.
    

Problemen met Terraform in Azure oplossen

Veelvoorkomende problemen bij het gebruik van Terraform in Azure oplossen.

Volgende stappen

In deze quickstart hebt u een Kubernetes-cluster geïmplementeerd en vervolgens een eenvoudige toepassing met meerdere containers erop geïmplementeerd. Deze voorbeeldtoepassing is alleen bedoeld voor demodoeleinden en vertegenwoordigt niet alle aanbevolen procedures voor Kubernetes-toepassingen. Zie de richtlijnen voor AKS-oplossingen voor meer informatie over het maken van volledige oplossingen met AKS voor productie.

Als u meer wilt weten over AKS en een volledig voorbeeld van code-naar-implementatie wilt doorlopen, gaat u verder met de zelfstudie over het Kubernetes-cluster.