Snabbstart: Distribuera ett AKS-kluster (Azure Kubernetes Service) med Terraform
Azure Kubernetes Service (AKS) är en hanterad Kubernetes-tjänst som gör att du snabbt kan distribuera och hantera kluster. I den här snabbstarten kommer du att göra följande:
- Distribuera ett AKS-kluster med Terraform.
- Kör ett exempelprogram med flera containrar med en grupp mikrotjänster och webbklientdelar som simulerar ett detaljhandelsscenario.
Kommentar
För att komma igång med att snabbt etablera ett AKS-kluster innehåller den här artikeln steg för att distribuera ett kluster med standardinställningar endast i utvärderingssyfte. Innan du distribuerar ett produktionsklart kluster rekommenderar vi att du bekantar dig med vår referensarkitektur för baslinje för att överväga hur det överensstämmer med dina affärskrav.
Innan du börjar
- Den här snabbstarten förutsätter grundläggande kunskaper om Kubernetes-begrepp. Mer information finns i Viktiga koncept för Azure Kubernetes Service (AKS).
- Du behöver ett Azure-konto med en aktiv prenumeration. Om du inte har något skapar du ett konto kostnadsfritt.
- Följ anvisningarna baserat på kommandoradsgränssnittet.
- Mer information om hur du skapar en Windows Server-nodpool finns i Skapa ett AKS-kluster som stöder Windows Server-containrar.
Kommentar
Azure Linux-nodpoolen är nu allmänt tillgänglig (GA). Mer information om fördelarna och distributionsstegen finns i Introduktion till Azure Linux Container Host for AKS.
- Installera och konfigurera Terraform.
- Ladda ned kubectl.
- Skapa ett slumpmässigt värde för Azure-resursgruppens namn med hjälp av random_pet.
- Skapa en Azure-resursgrupp med hjälp av azurerm_resource_group.
- Få åtkomst till konfigurationen av AzureRM-providern för att hämta Azure Object ID med hjälp av azurerm_client_config.
- Skapa ett Kubernetes-kluster med azurerm_kubernetes_cluster.
- Skapa en AzAPI-resurs azapi_resource.
- Skapa en AzAPI-resurs för att generera ett SSH-nyckelpar med hjälp av azapi_resource_action.
Logga in på ditt Azure-konto
Logga först in på ditt Azure-konto och autentisera med någon av metoderna som beskrivs i följande avsnitt.
Scenarier för Terraform- och Azure-autentisering
Terraform stöder endast autentisering till Azure via Azure CLI. Autentisering med Azure PowerShell stöds inte. Även om du kan använda Azure PowerShell-modulen när du utför ditt Terraform-arbete måste du därför först autentisera till Azure med hjälp av Azure CLI.
Den här artikeln beskriver hur du autentiserar Terraform till Azure för följande scenarier. Mer information om alternativ för att autentisera Terraform till Azure finns i Autentisera med Hjälp av Azure CLI.
- Autentisera via ett Microsoft-konto med Cloud Shell (med Bash eller PowerShell)
- Autentisera via ett Microsoft-konto med Windows (med Bash eller PowerShell)
- Autentisera via tjänstens huvudnamn:
- Om du inte har ett huvudnamn för tjänsten skapar du ett huvudnamn för tjänsten.
- Autentisera till Azure med hjälp av miljövariabler eller autentisera till Azure med hjälp av Terraform-providerblocket
Autentisera till Azure via ett Microsoft-konto
Ett Microsoft-konto är ett användarnamn (associerat med ett e-postmeddelande och dess autentiseringsuppgifter) som används för att logga in på Microsoft-tjänster – till exempel Azure. Ett Microsoft-konto kan associeras med en eller flera Azure-prenumerationer, där en av dessa prenumerationer är standard.
Följande steg visar hur:
- Logga in på Azure interaktivt med ett Microsoft-konto
- Visa en lista över kontots associerade Azure-prenumerationer (inklusive standard)
- Ange den aktuella prenumerationen.
Öppna en kommandorad som har åtkomst till Azure CLI.
Kör az login utan några parametrar och följ anvisningarna för att logga in på Azure.
az login
Viktiga punkter:
- Vid lyckad inloggning
az login
visar en lista över De Azure-prenumerationer som är associerade med det inloggade Microsoft-kontot, inklusive standardprenumerationen.
- Vid lyckad inloggning
Bekräfta den aktuella Azure-prenumerationen genom att köra az account show.
az account show
Om du vill visa alla Azure-prenumerationsnamn och ID:er för ett specifikt Microsoft-konto kör du az account list.
az account list --query "[?user.name=='<microsoft_account_email>'].{Name:name, ID:id, Default:isDefault}" --output Table
Viktiga punkter:
<microsoft_account_email>
Ersätt platshållaren med den Microsoft-konto-e-postadress vars Azure-prenumerationer du vill visa.- Med ett Live-konto , till exempel en Hotmail eller Outlook, kan du behöva ange den fullständigt kvalificerade e-postadressen. Om din e-postadress till exempel är
admin@hotmail.com
kan du behöva ersätta platshållaren medlive.com#admin@hotmail.com
.
Om du vill använda en specifik Azure-prenumeration kör du az account set.
az account set --subscription "<subscription_id_or_subscription_name>"
Viktiga punkter:
<subscription_id_or_subscription_name>
Ersätt platshållaren med ID:t eller namnet på den prenumeration som du vill använda.- Samtal
az account set
visar inte resultatet av att växla till den angivna Azure-prenumerationen. Du kan dock användaaz account show
för att bekräfta att den aktuella Azure-prenumerationen har ändrats. - Om du kör
az account list
kommandot från föregående steg ser du att standardprenumerationen för Azure har ändrats till den prenumeration som du angav medaz account set
.
Skapa ett huvudnamn för tjänsten
Automatiserade verktyg som distribuerar eller använder Azure-tjänster , till exempel Terraform, bör alltid ha begränsade behörigheter. I stället för att låta program logga in som en fullt privilegierad användare erbjuder Azure huvudkonton för tjänsten.
Det vanligaste mönstret är att interaktivt logga in på Azure, skapa ett huvudnamn för tjänsten, testa tjänstens huvudnamn och sedan använda tjänstens huvudnamn för framtida autentisering (antingen interaktivt eller från dina skript).
Logga in på Azure för att skapa ett huvudnamn för tjänsten. När du har autentiserat till Azure via ett Microsoft-konto går du tillbaka hit.
Om du skapar ett huvudnamn för tjänsten från Git Bash anger du
MSYS_NO_PATHCONV
miljövariabeln. (Det här steget är inte nödvändigt om du använder Cloud Shell.)export MSYS_NO_PATHCONV=1
Viktiga punkter:
- Du kan ange
MSYS_NO_PATHCONV
miljövariabeln globalt (för alla terminalsessioner) eller lokalt (bara för den aktuella sessionen). Eftersom det inte är något du gör ofta när du skapar ett huvudnamn för tjänsten, anger exemplet värdet för den aktuella sessionen. Om du vill ange den här miljövariabeln globalt lägger du till inställningen i~/.bashrc
filen.
- Du kan ange
Om du vill skapa ett huvudnamn för tjänsten kör du az ad sp create-for-rbac.
az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
Viktiga punkter:
- Du kan ersätta
<service-principal-name>
med ett anpassat namn för din miljö eller utelämna parametern helt. Om du utelämnar parametern genereras tjänstens huvudnamn baserat på aktuellt datum och tid. - När du har slutfört
az ad sp create-for-rbac
det visar flera värden. VärdenaappId
,password
ochtenant
används i nästa steg. - Lösenordet kan inte hämtas om det går förlorat. Därför bör du lagra ditt lösenord på en säker plats. Om du glömmer lösenordet kan du återställa autentiseringsuppgifterna för tjänstens huvudnamn.
- I den här artikeln används ett huvudnamn för tjänsten med rollen Deltagare . Mer information om rollbaserad åtkomstkontroll (RBAC) finns i RBAC: Inbyggda roller.
- Utdata från att skapa tjänstens huvudnamn innehåller känsliga autentiseringsuppgifter. Se till att du inte inkluderar dessa autentiseringsuppgifter i koden eller kontrollera autentiseringsuppgifterna i källkontrollen.
- Mer information om alternativ när du skapar ett huvudnamn för tjänsten med Azure CLI finns i artikeln Skapa ett Huvudnamn för Azure-tjänsten med Azure CLI.
- Du kan ersätta
Ange autentiseringsuppgifter för tjänstens huvudnamn i miljövariabler
När du har skapat ett huvudnamn för tjänsten kan du ange dess autentiseringsuppgifter för Terraform via miljövariabler.
~/.bashrc
Redigera filen genom att lägga till följande miljövariabler.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>"
Kör skriptet genom att
~/.bashrc
körasource ~/.bashrc
(eller dess förkortade motsvarighet. ~/.bashrc
). Du kan också avsluta och öppna Cloud Shell igen för att skriptet ska köras automatiskt.. ~/.bashrc
När miljövariablerna har angetts kan du verifiera deras värden på följande sätt:
printenv | grep ^ARM*
Viktiga punkter:
- Precis som med alla miljövariabler använder du följande syntax för att komma åt ett Azure-prenumerationsvärde inifrån ett Terraform-skript:
${env.<environment_variable>}
. Om du till exempel vill komma åt värdetARM_SUBSCRIPTION_ID
anger du${env.ARM_SUBSCRIPTION_ID}
. - När du skapar och tillämpar Terraform-körningsplaner ändras den Azure-prenumeration som är associerad med tjänstens huvudnamn. Det här kan ibland vara förvirrande om du är inloggad i en Azure-prenumeration och miljövariablerna pekar på en andra Azure-prenumeration. Nu ska vi titta på följande exempel för att förklara. Anta att du har två Azure-prenumerationer: SubA och SubB. Om den aktuella Azure-prenumerationen är UnderA (bestäms via
az account show
) medan miljövariablerna pekar på UnderB finns alla ändringar som görs av Terraform på underb. Därför skulle du behöva logga in på din underb-prenumeration för att köra Azure CLI-kommandon eller Azure PowerShell-kommandon för att visa dina ändringar.
Ange autentiseringsuppgifter för tjänstens huvudnamn i ett Terraform-providerblock
Azure-providerblocket definierar syntax som gör att du kan ange autentiseringsinformation för din Azure-prenumeration.
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
Varning
Det kan vara praktiskt att ange dina autentiseringsuppgifter för Azure-prenumerationen i en Terraform-konfigurationsfil , särskilt när du testar. Det är dock inte lämpligt att lagra autentiseringsuppgifter i en klartextfil som kan visas av icke-betrodda personer.
Implementera Terraform-koden
Kommentar
Exempelkoden för den här artikeln finns på Azure Terraform GitHub-lagringsplatsen. Du kan visa loggfilen som innehåller testresultaten från aktuella och tidigare versioner av Terraform.
Se fler artiklar och exempelkod som visar hur du använder Terraform för att hantera Azure-resurser
Skapa en katalog som du kan använda för att testa Terraform-exempelkoden och göra den till din aktuella katalog.
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 {} }
Skapa en fil med namnet
ssh.tf
och infoga följande kod: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 }
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 = 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" } }
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 } variable "username" { type = string description = "The admin username for the new cluster." default = "azureadmin" }
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 den konfiguration 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 planen du granskade är exakt vad som tillämpas.
Tillämpa en Terraform-körningsplan
Kör terraform gäller 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ördeterraform plan -out main.tfplan
.- Om du har angett ett annat filnamn för parametern
-out
använder du samma filnamn i anropet tillterraform apply
. - Om du inte använde parametern
-out
anroparterraform apply
du utan några parametrar.
Verifiera resultatet
Hämta namnet på Azure-resursgruppen med hjälp av följande kommando.
resource_group_name=$(terraform output -raw resource_group_name)
Visa namnet på ditt nya Kubernetes-kluster med kommandot az aks list .
az aks list \ --resource-group $resource_group_name \ --query "[].{\"K8s cluster name\":name}" \ --output table
Hämta Kubernetes-konfigurationen från Terraform-tillståndet och lagra den i en fil som
kubectl
kan läsas med hjälp av följande kommando.echo "$(terraform output kube_config)" > ./azurek8s
Kontrollera att föregående kommando inte lade till ett ASCII EOT-tecken med hjälp av följande kommando.
cat ./azurek8s
Viktiga punkter:
- Om du ser
<< EOT
i början ochEOT
i 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
- Om du ser
Ange en miljövariabel så
kubectl
att du kan hämta rätt konfiguration med hjälp av följande kommando.export KUBECONFIG=./azurek8s
Kontrollera hälsotillståndet för klustret med hjälp av
kubectl get nodes
kommandot .kubectl get nodes
Viktiga punkter:
- När du skapade AKS-klustret aktiverades övervakning för att samla in 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 klassificerade som utdata när du tillämpade Terraform-körningsplanen. Till exempel är värdadressen, AKS-klustrets användarnamn och AKS-klusterlösenordet utdata.
Distribuera programmet
För att distribuera programmet använder du en manifestfil för att skapa alla objekt som krävs för att köra AKS Store-programmet. En Kubernetes-manifestfil definierar ett klusters önskade tillstånd, till exempel vilka containeravbildningar som ska köras. Manifestet innehåller följande Kubernetes-distributioner och -tjänster:
- Butiksfront: Webbprogram där kunder kan visa produkter och göra beställningar.
- Produkttjänst: Visar produktinformation.
- Ordertjänst: Gör beställningar.
- Rabbit MQ: Meddelandekö för en orderkö.
Kommentar
Vi rekommenderar inte att du kör tillståndskänsliga containrar, till exempel Rabbit MQ, utan beständig lagring för produktion. Dessa används här för enkelhetens skull, men vi rekommenderar att du använder hanterade tjänster, till exempel Azure CosmosDB eller Azure Service Bus.
Skapa en fil med namnet
aks-store-quickstart.yaml
och kopiera i följande 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
En uppdelning av YAML-manifestfiler finns i Distributioner och YAML-manifest.
Om du skapar och sparar YAML-filen lokalt kan du ladda upp manifestfilen till standardkatalogen i CloudShell genom att välja knappen Ladda upp/ladda ned filer och välja filen från det lokala filsystemet.
Distribuera programmet med kommandot
kubectl apply
och ange namnet på ditt YAML-manifest.kubectl apply -f aks-store-quickstart.yaml
Följande exempelutdata visar distributioner och tjänster:
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
Testa programmet
När programmet körs så exponerar en Kubernetes-tjänst programmets klientdel mot Internet. Den här processen kan ta ett par minuter att slutföra.
Kontrollera statusen för de distribuerade poddarna med kommandot
kubectl get pods
. Gör så att alla poddar ärRunning
innan du fortsätter.kubectl get pods
Sök efter en offentlig IP-adress för programmet store-front. Övervaka förloppet med kommandot
kubectl get service
med--watch
argumentet .kubectl get service store-front --watch
EXTERNA IP-utdata för
store-front
tjänsten visas inledningsvis som väntande:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE store-front LoadBalancer 10.0.100.10 <pending> 80:30025/TCP 4h4m
När DEN EXTERNA IP-adressen ändras från väntande till en faktisk offentlig IP-adress använder du
CTRL-C
för att stoppakubectl
bevakningsprocessen.Följande exempelutdata visar en giltig offentlig IP-adress som har tilldelats tjänsten:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE store-front LoadBalancer 10.0.100.10 20.62.159.19 80:30025/TCP 4h5m
Öppna en webbläsare till tjänstens externa IP-adress för att se hur Azure Store-appen fungerar.
Rensa resurser
Ta bort AKS-resurser
Gör följande när du inte längre behöver de resurser som skapats via Terraform:
Kör terraform-plan 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 den konfiguration 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 planen du granskade är exakt vad som tillämpas.
- Kommandot
Kör terraform tillämpa för att tillämpa körningsplanen.
terraform apply main.destroy.tfplan
Ta bort tjänstens huvudnamn
Hämta tjänstens huvudnamns-ID med hjälp av följande kommando.
sp=$(terraform output -raw sp)
Ta bort tjänstens huvudnamn med kommandot az ad sp delete .
az ad sp delete --id $sp
- Installera Azure Developer CLI (AZD)
- Installera och konfigurera Terraform.
- Du kan granska programkoden som används i lagringsplatsen Azure-Samples/aks-store-demo.
Klona CLI-mallen för Azure Developer
Med Azure Developer CLI kan du snabbt ladda ned exempel från Azure-Samples-lagringsplatsen . I vår snabbstart laddar du ned programmet aks-store-demo
. Mer information om de allmänna användningsfallen finns i översiktenazd
.
Klona AKS Store-demomallen från Azure-Samples-lagringsplatsen med hjälp av
azd init
kommandot med parametern--template
.azd init --template Azure-Samples/aks-store-demo
Ange ett miljönamn för projektet som endast använder alfanumeriska tecken och bindestreck, till exempel aks-terraform-1.
Enter a new environment name: aks-terraform-1
Logga in på ditt Azure Cloud-konto
Mallen azd
innehåller all kod som behövs för att skapa tjänsterna, men du måste logga in på ditt Azure-konto för att vara värd för programmet på AKS.
Logga in på ditt konto med kommandot
azd auth login
.azd auth login
Kopiera enhetskoden som visas i utdata och tryck på Retur för att logga in.
Start by copying the next code: XXXXXXXXX Then press enter and continue to log in from your browser...
Viktigt!
Om du använder en virtuell dator utan nätverk eller GitHub Codespace orsakar vissa Azure-säkerhetsprinciper konflikter när de används för att logga in med
azd auth login
. Om du stöter på ett problem här kan du följa auth-lösningen azd som tillhandahålls, vilket innebär att du använder encurl
begäran till den localhost-URL som du omdirigerades till efter att ha körtazd auth login
.Autentisera med dina autentiseringsuppgifter på organisationens inloggningssida.
Bekräfta att du försöker ansluta från Azure CLI.
Kontrollera meddelandet "Enhetskodautentiseringen har slutförts. Inloggad i Azure." visas i den ursprungliga terminalen.
Waiting for you to complete authentication in the browser... Device code authentication completed. Logged in to Azure.
azd auth workaround
Den här lösningen kräver att du har Azure CLI installerat.
Öppna ett terminalfönster och logga in med Azure CLI med
az login
kommandot med parametern--scope
inställd påhttps://graph.microsoft.com/.default
.az login --scope https://graph.microsoft.com/.default
Du bör omdirigeras till en autentiseringssida på en ny flik för att skapa en webbläsaråtkomsttoken, som du ser i följande exempel:
https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize?clientid=<your_client_id>.
Kopiera localhost-URL:en för webbsidan som du fick när du försökte logga in med
azd auth login
.I ett nytt terminalfönster använder du följande
curl
begäran för att logga in. Se till att du ersätter<localhost>
platshållaren med den localhost-URL som du kopierade i föregående steg.curl <localhost>
En lyckad inloggning matar ut en HTML-webbsida, som du ser i följande exempel:
<!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>
Stäng den aktuella terminalen och öppna den ursprungliga terminalen. Du bör se en JSON-lista över dina prenumerationer.
Kopiera fältet för
id
den prenumeration som du vill använda.Ange din prenumeration med hjälp av
az account set
kommandot .az account set --subscription <subscription_id>
Skapa och distribuera resurser för klustret
Om du vill distribuera programmet använder azd up
du kommandot för att skapa alla objekt som krävs för att köra AKS Store-programmet.
- En
azure.yaml
fil definierar ett klusters önskade tillstånd, till exempel vilka containeravbildningar som ska hämtas och innehåller följande Kubernetes-distributioner och -tjänster:
- Butiksfront: Webbprogram där kunder kan visa produkter och göra beställningar.
- Produkttjänst: Visar produktinformation.
- Ordertjänst: Gör beställningar.
- Rabbit MQ: Meddelandekö för en orderkö.
Kommentar
Vi rekommenderar inte att du kör tillståndskänsliga containrar, till exempel Rabbit MQ, utan beständig lagring för produktion. Dessa används här för enkelhetens skull, men vi rekommenderar att du använder hanterade tjänster, till exempel Azure Cosmos DB eller Azure Service Bus.
Distribuera programresurser
Mallen azd
för den här snabbstarten skapar en ny resursgrupp med ett AKS-kluster och ett Azure Key Vault. Nyckelvalvet lagrar klienthemligheter och kör tjänsterna i pets
namnområdet.
Skapa alla programresurser med kommandot
azd up
.azd up
azd up
kör alla krokar iazd-hooks
mappen för att förregistrera, etablera och distribuera programtjänsterna.Anpassa krokar för att lägga till anpassad kod i arbetsflödesstegen
azd
. Mer information finns i referensen förazd
krokar .Välj en Azure-prenumeration för din faktureringsanvändning.
? Select an Azure Subscription to use: [Use arrows to move, type to filter] > 1. My Azure Subscription (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
Välj en region som programmet ska distribueras till.
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
kör automatiskt företablerings- och postprovision-krokarna för att skapa resurserna för ditt program. Den här processen kan ta ett par minuter att slutföra. När du är klar bör du se utdata som liknar följande exempel:SUCCESS: Your workflow to provision and deploy to Azure completed in 9 minutes 40 seconds.
Generera Terraform-planer
I din Azure Developer-mall /infra/terraform
innehåller mappen all kod som används för att generera Terraform-planen.
Terraform distribuerar och kör kommandon med hjälp terraform apply
av som en del av azd
etableringssteget. När du är klar bör du se utdata som liknar följande exempel:
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
Testa programmet
När programmet körs så exponerar en Kubernetes-tjänst programmets klientdel mot Internet. Den här processen kan ta ett par minuter att slutföra.
Ange ditt namnområde som demonamnområdet
pets
med hjälp avkubectl set-context
kommandot .kubectl config set-context --current --namespace=pets
Kontrollera statusen för de distribuerade poddarna med kommandot
kubectl get pods
. Kontrollera att alla poddar ärRunning
innan du fortsätter.kubectl get pods
Sök efter en offentlig IP-adress för store-front-programmet och övervaka förloppet med hjälp av
kubectl get service
kommandot med--watch
argumentet .kubectl get service store-front --watch
EXTERNA IP-utdata för
store-front
tjänsten visas inledningsvis som väntande:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE store-front LoadBalancer 10.0.100.10 <pending> 80:30025/TCP 4h4m
När DEN EXTERNA IP-adressen ändras från väntande till en faktisk offentlig IP-adress använder du
CTRL-C
för att stoppakubectl
bevakningsprocessen.Följande exempelutdata visar en giltig offentlig IP-adress som tilldelats tjänsten:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE store-front LoadBalancer 10.0.100.10 20.62.159.19 80:30025/TCP 4h5m
Öppna en webbläsare till tjänstens externa IP-adress för att se hur Azure Store-appen fungerar.
Ta bort klustret
När du är klar med snabbstarten rensar du onödiga resurser för att undvika Azure-avgifter.
Ta bort alla resurser som skapades i snabbstarten
azd down
med kommandot .azd down
Bekräfta ditt beslut att ta bort alla använda resurser från din prenumeration genom att
y
skriva och trycka påEnter
.? Total resources to delete: 14, are you sure you want to continue? (y/N)
Tillåt att rensning återanvänder snabbstartsvariablerna om det är tillämpligt genom att
y
skriva och trycka på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.
Felsöka Terraform i Azure
Felsöka vanliga problem när du använder Terraform i Azure.
Nästa steg
I den här snabbstarten distribuerade du ett Kubernetes-kluster och distribuerade sedan ett enkelt program med flera containrar till det. Det här exempelprogrammet är endast i demosyfte och representerar inte alla metodtips för Kubernetes-program. Vägledning om hur du skapar fullständiga lösningar med AKS för produktion finns i AKS-lösningsvägledning.
Om du vill veta mer om AKS och gå igenom ett komplett exempel på kod-till-distribution fortsätter du till självstudiekursen för Kubernetes-klustret.