Schnellstart: Bereitstellen eines Azure Kubernetes Service-Clusters (AKS) mithilfe von Terraform
Azure Kubernetes Service (AKS) ist ein verwalteter Kubernetes-Dienst, mit dem Sie schnell Cluster bereitstellen und verwalten können. In dieser Schnellstartanleitung führen Sie die folgenden Schritte aus:
- Erstellen Sie einen AKS-Cluster mithilfe von Terraform.
- Führen Sie eine Beispielanwendung mit mehreren Containern mit einer Gruppe von Microservices und Web-Front-Ends aus, die ein Einzelhandelsszenario simulieren.
Hinweis
Um schnell mit der Bereitstellung eines AKS-Clusters zu beginnen, enthält dieser Artikel Schritte zum Bereitstellen eines Clusters mit Standardeinstellungen nur zu Evaluierungszwecken. Bevor Sie einen produktionsbereiten Cluster bereitstellen, empfehlen wir Ihnen, sich mit unserer Baselinereferenzarchitektur vertraut zu machen, um zu prüfen, inwiefern sie Ihren Geschäftsanforderungen entspricht.
Voraussetzungen
- Für diese Schnellstartanleitung werden Grundkenntnisse in Bezug auf die Kubernetes-Konzepte vorausgesetzt. Weitere Informationen finden Sie unter Grundlegende Kubernetes-Konzepte für Azure Kubernetes Service (AKS).
- Sie benötigen ein Azure-Konto mit einem aktiven Abonnement. Erstellen Sie ein kostenloses Konto, falls Sie keines besitzen.
- Befolgen Sie abhängig von Ihrer Befehlszeilenschnittstelle die entsprechenden Anweisungen.
- Weitere Informationen zum Erstellen eines Windows Server-Knotenpools finden Sie unter Erstellen eines AKS-Clusters, der Windows Server-Container unterstützt.
Hinweis
Der Azure Linux-Knotenpool ist jetzt allgemein verfügbar (GA). Informationen zu den Vorteilen und Bereitstellungsschritten finden Sie in der Einführung in den Azure-Linux-Containerhost für AKS.
- Installieren und konfigurieren Sie Terraform.
- Laden Sie kubectl herunter.
- Erstellen eines Zufallswerts für den Azure-Ressourcengruppennamen mithilfe von random_pet.
- Erstellen einer Azure-Ressourcengruppe mithilfe von azurerm_resource_group.
- Greifen Sie auf die Konfiguration des AzureRM-Anbieters zu, um die Azure-Objekt-ID mithilfe von azurerm_client_config abzurufen.
- Erstellen Sie einen Kubernetes-Cluster mithilfe von azurerm_kubernetes_cluster.
- Erstellen Sie eine AzAPI-Ressource azapi_resource.
- Erstellen Sie eine AzAPI-Ressource, um mithilfe von azapi_resource_action ein SSH-Schlüsselpaar zu generieren.
Anmelden bei Ihrem Azure-Konto
Melden Sie sich zunächst bei Ihrem Azure-Konto an, und authentifizieren Sie sich mit einer der im folgenden Abschnitt beschriebenen Methoden.
Terraform- und Azure-Authentifizierungsszenarien
Terraform unterstützt für die Authentifizierung bei Azure nur die Azure-Befehlszeilenschnittstelle (Azure CLI). Die Authentifizierung mit Azure PowerShell wird nicht unterstützt. Obwohl Sie für Ihre Arbeit mit Terraform das Azure PowerShell-Modul verwenden können, müssen Sie sich daher zunächst mithilfe der Azure CLI bei Azure authentifizieren.
In diesem Artikel wird für die unten genannten Szenarien erläutert, wie Sie Terraform bei Azure authentifizieren. Weitere Informationen zu den Optionen für die Authentifizierung von Terraform bei Azure finden Sie unter Authentifizieren mithilfe der Azure CLI.
- Authentifizieren über ein Microsoft-Konto mit Cloud Shell (mit Bash oder PowerShell)
- Authentifizieren über ein Microsoft-Konto mit Windows (mit Bash oder PowerShell)
- Authentifizieren über einen Dienstprinzipal:
- Erstellen Sie einen Dienstprinzipal, falls Sie noch nicht über einen verfügen.
- Authentifizieren Sie sich mithilfe von Umgebungsvariablen bei Azure, oder authentifizieren Sie sich mithilfe des Terraform-Anbieterblocks bei Azure.
Authentifizieren bei Azure über ein Microsoft-Konto
Ein Microsoft-Konto ist ein Benutzername (mit einer zugeordneten E-Mail-Adresse und zugehörigen Anmeldeinformationen), der zum Anmelden bei Microsoft-Diensten wie z. B. Azure verwendet wird. Ein Microsoft-Konto kann mit einem oder mehreren Azure-Abonnements verknüpft werden, wobei eines davon das Standardabonnement ist.
In den folgenden Schritten wird die Vorgehensweise erläutert:
- Melden Sie sich interaktiv mit einem Microsoft-Konto bei Azure an
- Listen Sie die zugeordneten Azure-Abonnements des Kontos (einschließlich der Standardeinstellung) auf
- Legen Sie das aktuelle Abonnement fest.
Öffnen Sie eine Befehlszeile, die Zugriff auf die Azure CLI hat.
Führen Sie az login ohne Parameter aus, und befolgen Sie die Anweisungen, um sich bei Azure anzumelden.
az login
Die wichtigsten Punkte:
- Nach erfolgreicher Anmeldung zeigt
az login
eine Liste der Azure-Abonnements an, die mit dem angemeldeten Microsoft-Konto verknüpft sind (einschließlich des Standardabonnements).
- Nach erfolgreicher Anmeldung zeigt
Führen Sie zum Überprüfen des aktuellen Azure-Abonnements az account show aus.
az account show
Führen Sie zum Anzeigen aller Azure-Abonnementnamen und -IDs für ein bestimmtes Microsoft-Konto az account list aus.
az account list --query "[?user.name=='<microsoft_account_email>'].{Name:name, ID:id, Default:isDefault}" --output Table
Die wichtigsten Punkte:
- Ersetzen Sie den Platzhalter
<microsoft_account_email>
durch die E-Mail-Adresse des Microsoft-Kontos, dessen Azure-Abonnements Sie auflisten möchten. - Bei einem Live-Konto (z. B. Hotmail oder Outlook) müssen Sie möglicherweise die vollqualifizierte E-Mail-Adresse angeben. Wenn Ihre E-Mail-Adresse
admin@hotmail.com
lautet, würden Sie den Platzhalter in diesem Fall z. B. durchlive.com#admin@hotmail.com
ersetzen.
- Ersetzen Sie den Platzhalter
Führen Sie az account set aus, um ein bestimmtes Azure-Abonnement zu verwenden.
az account set --subscription "<subscription_id_or_subscription_name>"
Die wichtigsten Punkte:
- Ersetzen Sie den Platzhalter
<subscription_id_or_subscription_name>
durch die ID oder den Namen des gewünschten Abonnements. - Die Ergebnisse des Wechsels zum angegebenen Azure-Abonnement werden durch den Aufruf von
az account set
nicht angezeigt. Sie können sich jedoch mithilfe vonaz account show
vergewissern, dass sich das aktuelle Azure-Abonnement geändert hat. - Wenn Sie den Befehl
az account list
im vorherigen Schritt ausführen, sehen Sie, dass das Azure-Standardabonnement in das Abonnement geändert wurde, das Sie mitaz account set
angegeben haben.
- Ersetzen Sie den Platzhalter
Erstellen eines Dienstprinzipals
Automatisierte Tools wie Terraform, die Azure-Dienste bereitstellen oder verwenden, sollten stets über eingeschränkte Berechtigungen verfügen. Azure bietet Dienstprinzipale, damit Anwendungen nicht als Benutzer mit uneingeschränkten Berechtigungen angemeldet werden müssen.
Das gängigste Muster für die interaktive Anmeldung bei Azure besteht darin, einen Dienstprinzipal zu erstellen, zu testen und dann für die zukünftige Authentifizierung (interaktiv oder über Ihre Skripts) zu verwenden.
Um einen Dienstprinzipal zu erstellen, melden Sie sich bei Azure an. Führen Sie dazu die Schritte zum Authentifizieren bei Azure über ein Microsoft-Konto aus, und kehren Sie dann hierher zurück.
Wenn Sie einen Dienstprinzipal über Git Bash erstellen, legen Sie die Umgebungsvariable
MSYS_NO_PATHCONV
fest. (Bei Verwendung von Cloud Shell ist dieser Schritt nicht erforderlich.)export MSYS_NO_PATHCONV=1
Die wichtigsten Punkte:
- Sie können die Umgebungsvariable
MSYS_NO_PATHCONV
global (für alle Terminalsitzungen) oder lokal (nur für die aktuelle Sitzung) festlegen. Da Sie nur selten einen Dienstprinzipal erstellen müssen, wird der Wert im Beispiel für die aktuelle Sitzung festgelegt. Um diese Umgebungsvariable global festzulegen, fügen Sie die Einstellung der~/.bashrc
-Datei hinzu.
- Sie können die Umgebungsvariable
Führen Sie zum Erstellen eines Dienstprinzipals az ad sp create-for-rbac aus.
az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
Die wichtigsten Punkte:
- Sie können
<service-principal-name>
durch einen benutzerdefinierten Namen für Ihre Umgebung ersetzen oder den Parameter ganz weglassen. Wenn Sie den Parameter weglassen, wird der Dienstprinzipalname basierend auf dem aktuellen Datum und der aktuellen Uhrzeit generiert. - Nach dem erfolgreichen Abschluss werden von
az ad sp create-for-rbac
verschiedene Werte angezeigt. Die WerteappId
,password
undtenant
werden im nächsten Schritt verwendet. - Dieses Kennwort kann nicht erneut abgerufen werden. Es empfiehlt sich daher, das Kennwort an einem sicheren Ort zu speichern. Sollten Sie Ihr Kennwort vergessen, können Sie die Anmeldeinformationen für den Dienstprinzipal zurücksetzen.
- In diesem Artikel wird ein Dienstprinzipal mit der Rolle Mitwirkender verwendet. Weitere Informationen zur rollenbasierten Zugriffssteuerung (Role-Based Access Control, RBAC) finden Sie unter RBAC: Integrierte Rollen.
- Die Ausgabe der Erstellung des Dienstprinzipals enthält vertrauliche Anmeldeinformationen. Schließen Sie diese Anmeldeinformationen nicht in Ihren Code ein, und checken Sie sie nicht in Ihre Quellcodeverwaltung ein.
- Weitere Informationen zu den Optionen beim Erstellen eines Dienstprinzipals mithilfe der Azure CLI finden Sie im Artikel Erstellen eines Azure-Dienstprinzipals mit der Azure-Befehlszeilenschnittstelle.
- Sie können
Angeben der Anmeldeinformationen für den Dienstprinzipal in Umgebungsvariablen
Nachdem Sie einen Dienstprinzipal erstellt haben, können Sie seine Anmeldeinformationen über Umgebungsvariablen für Terraform angeben.
Bearbeiten Sie die
~/.bashrc
-Datei, indem Sie die folgenden Umgebungsvariablen hinzufügen.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>"
Führen Sie
source ~/.bashrc
(oder die abgekürzte Entsprechung. ~/.bashrc
) aus, um das Skript~/.bashrc
auszuführen. Sie können Cloud Shell auch beenden und erneut öffnen, damit das Skript automatisch ausgeführt wird.. ~/.bashrc
Nachdem Sie die Umgebungsvariablen festgelegt haben, können Sie deren Werte wie folgt überprüfen:
printenv | grep ^ARM*
Die wichtigsten Punkte:
- Verwenden Sie wie bei jeder Umgebungsvariablen die folgende Syntax, um innerhalb eines Terraform-Skripts auf einen Azure-Abonnementwert zuzugreifen:
${env.<environment_variable>}
. Beispiel: Wenn Sie auf den WertARM_SUBSCRIPTION_ID
zugreifen möchten, geben Sie${env.ARM_SUBSCRIPTION_ID}
an. - Beim Erstellen und Anwenden von Terraform-Ausführungsplänen werden Änderungen an dem Azure-Abonnement vorgenommen, das dem Dienstprinzipal zugeordnet ist. Dies kann manchmal verwirrend sein, wenn Sie bei einem Azure-Abonnement angemeldet sind und die Umgebungsvariablen auf ein zweites Azure-Abonnement verweisen. Betrachten Sie zur Veranschaulichung das folgende Beispiel. Angenommen, Sie verfügen über zwei Azure-Abonnements: SubA und SubB. Wenn das aktuelle Azure-Abonnement SubA ist (über
az account show
ermittelt), während die Umgebungsvariablen auf SubB verweisen, gelten alle von Terraform vorgenommenen Änderungen für SubB. Daher müssen Sie sich beim Abonnement SubB anmelden, um Azure CLI- oder Azure PowerShell-Befehle auszuführen und Ihre Änderungen anzuzeigen.
Angeben der Anmeldeinformationen für den Dienstprinzipal in einem Terraform-Anbieterblock
Der Azure-Anbieterblock definiert die Syntax, mit der Sie die Authentifizierungsinformationen Ihres Azure-Abonnements angeben können.
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
Achtung
Die Möglichkeit, Anmeldeinformationen für Ihr Azure-Abonnement in einer Terraform-Konfigurationsdatei anzugeben, kann besonders beim Testen praktisch sein. Sie sollten Anmeldeinformationen jedoch nicht in einer Klartextdatei speichern, die von nicht vertrauenswürdigen Personen angezeigt werden kann.
Implementieren des Terraform-Codes
Hinweis
Der Beispielcode für diesen Artikel befindet sich im Azure Terraform-GitHub-Repository. Sie können die Protokolldatei anzeigen, die die Testergebnisse von aktuellen und früheren Terraform-Versionen enthält.
Betrachten Sie die weiteren Artikel und Beispielcodes zur Verwendung von Terraform zum Verwalten von Azure-Ressourcen.
Erstellen Sie ein Verzeichnis, in dem Sie den Terraform-Beispielcode testen können, und legen Sie es als aktuelles Verzeichnis fest.
Erstellen Sie eine Datei namens
providers.tf
, und fügen Sie den folgenden Code ein: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 {} }
Erstellen Sie eine Datei namens
ssh.tf
, und fügen Sie den folgenden Code ein: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 }
Erstellen Sie eine Datei namens
main.tf
, und fügen Sie den folgenden Code ein:# 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" } }
Erstellen Sie eine Datei namens
variables.tf
, und fügen Sie den folgenden Code ein: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" }
Erstellen Sie eine Datei namens
outputs.tf
, und fügen Sie den folgenden Code ein: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 }
Initialisieren von Terraform
Führen Sie zum Initialisieren der Terraform-Bereitstellung terraform init aus. Mit diesem Befehl wird der Azure-Anbieter heruntergeladen, der zum Verwalten Ihrer Azure-Ressourcen erforderlich ist.
terraform init -upgrade
Die wichtigsten Punkte:
- Der Parameter
-upgrade
aktualisiert die erforderlichen Anbieter-Plug-Ins auf die neueste Version, die den Versionseinschränkungen der Konfiguration entspricht.
Erstellen eines Terraform-Ausführungsplans
Führen Sie terraform plan aus, um einen Ausführungsplan zu erstellen.
terraform plan -out main.tfplan
Die wichtigsten Punkte:
- Durch den Befehl
terraform plan
wird ein Ausführungsplan erstellt, aber nicht ausgeführt. Stattdessen werden die Aktionen ermittelt, die erforderlich sind, um die in Ihren Konfigurationsdateien angegebene Konfiguration zu erstellen. Mit diesem Muster können Sie überprüfen, ob der Ausführungsplan Ihren Erwartungen entspricht, bevor Sie Änderungen an den eigentlichen Ressourcen vornehmen. - Der optionale Parameter
-out
ermöglicht die Angabe einer Ausgabedatei für den Plan. Durch die Verwendung des Parameters-out
wird sichergestellt, dass genau der von Ihnen überprüfte Plan angewendet wird.
Anwenden eines Terraform-Ausführungsplans
Führen Sie terraform apply aus, um den Ausführungsplan auf Ihre Cloudinfrastruktur anzuwenden.
terraform apply main.tfplan
Die wichtigsten Punkte:
- Der Beispielbefehl
terraform apply
setzt voraus, dass Sie zuvorterraform plan -out main.tfplan
ausgeführt haben. - Wenn Sie einen anderen Dateinamen für den Parameter
-out
angegeben haben, verwenden Sie denselben Dateinamen im Aufruf vonterraform apply
. - Wenn Sie den Parameter
-out
nicht verwendet haben, rufen Sieterraform apply
ohne Parameter auf.
Überprüfen der Ergebnisse
Mit dem folgenden Befehl rufen Sie den Namen der Azure-Ressourcengruppe ab.
resource_group_name=$(terraform output -raw resource_group_name)
Mit dem Befehl az aks list zeigen Sie den Namen Ihres neuen Kubernetes-Clusters an.
az aks list \ --resource-group $resource_group_name \ --query "[].{\"K8s cluster name\":name}" \ --output table
Mit dem folgenden Befehl rufen Sie die Kubernetes-Konfiguration aus dem Terraform-Status ab und speichern sie in einer Datei, die
kubectl
lesen kann.echo "$(terraform output kube_config)" > ./azurek8s
Vergewissern Sie sich, dass der vorherige Befehl kein ASCII EOT-Zeichen hinzugefügt hat, indem Sie den Befehl „“ verwenden.
cat ./azurek8s
Die wichtigsten Punkte:
- Wenn am Anfang
<< EOT
und am EndeEOT
angezeigt wird, entfernen Sie diese Zeichen aus der Datei. Sie erhalten andernfalls unter Umständen die folgende Fehlermeldung:error: error loading config file "./azurek8s": yaml: line 2: mapping values are not allowed in this context
- Wenn am Anfang
Mit dem folgenden Befehl legen Sie eine Umgebungsvariable fest, damit
kubectl
die korrekte Konfiguration übernehmen kann.export KUBECONFIG=./azurek8s
Überprüfen Sie die Integrität des Clusters mithilfe des Befehls „
kubectl get nodes
“.kubectl get nodes
Die wichtigsten Punkte:
- Beim Erstellen des AKS-Clusters wurde die Überwachung aktiviert, um Integritätsmetriken für die Clusterknoten und die Pods zu erfassen. Diese Integritätsmetriken sind im Azure-Portal verfügbar. Weitere Informationen zur Überwachung der Integrität von Containern finden Sie unter Überwachen der Integrität von Azure Kubernetes Service.
- Beim Anwenden des Terraform-Ausführungsplans wurden mehrere Schlüsselwerte als Ausgabe klassifiziert. Beispielsweise werden die Hostadresse, der AKS-Clusterbenutzername und das AKS-Clusterkennwort ausgegeben.
Bereitstellen der Anwendung
Zum Bereitstellen der Anwendung verwenden Sie eine Manifestdatei, um alle Objekte zu erstellen, die für die Ausführung der AKS Store-Anwendungerforderlich sind. Eine Kubernetes-Manifestdatei definiert den gewünschten Zustand (Desired State) eines Clusters – also beispielsweise, welche Containerimages ausgeführt werden sollen. Das Manifest umfasst die folgenden Kubernetes-Bereitstellungen und -Dienste:
- Store Front: Webanwendung für Kund*innen zum Anzeigen von Produkten und Aufgeben von Bestellungen
- Product Service: zeigt Produktinformationen an.
- Order Service: dient der Aufgabe von Bestellungen.
- Rabbit MQ: Nachrichtenwarteschlange für eine Bestellwarteschlange
Hinweis
Zustandsbehaftete Container wie Rabbit MQ sollten nicht ohne permanenten Speicher für die Produktion ausgeführt werden. Sie werden hier der Einfachheit halber verwendet, jedoch sollten verwaltete Dienste wie Azure CosmosDB oder Azure Service Bus verwendet werden.
Erstellen Sie eine Datei namens
aks-store-quickstart.yaml
, und fügen Sie das folgende Manifest ein: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
Eine Aufschlüsselung der YAML-Manifestdateien finden Sie unter Bereitstellungen und YAML-Manifeste.
Wenn Sie die YAML-Datei lokal erstellen und speichern, können Sie die Manifestdatei in Ihr Standardverzeichnis in CloudShell hochladen, indem Sie die Schaltfläche Dateien hochladen/herunterladen auswählen und die Datei aus Ihrem lokalen Dateisystem auswählen.
Stellen Sie die Anwendung über den Befehl „
kubectl apply
“ bereit, und geben Sie den Namen Ihres YAML-Manifests an.kubectl apply -f aks-store-quickstart.yaml
Die folgende Beispielausgabe zeigt die Bereitstellungen und Dienste:
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
Testen der Anwendung
Wenn die Anwendung ausgeführt wird, macht ein Kubernetes-Dienst das Anwendungs-Front-End im Internet verfügbar. Dieser Vorgang kann einige Minuten dauern.
Überprüfen Sie den Status der bereitgestellten Pods mithilfe des Befehls
kubectl get pods
. Stellen Sie sicher, dass alle Pods den StatusRunning
haben, bevor Sie fortfahren.kubectl get pods
Suchen Sie nach einer öffentlichen IP-Adresse für die Store-Front-Anwendung. Verwenden Sie zum Überwachen des Fortschritts den Befehl
kubectl get service
mit dem Argument--watch
:kubectl get service store-front --watch
Die Ausgabe von EXTERNAL-IP für den
store-front
-Dienst lautet anfangs pending (ausstehend):NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE store-front LoadBalancer 10.0.100.10 <pending> 80:30025/TCP 4h4m
Nachdem die externe IP-Adresse (EXTERNAL-IP) von ausstehend in eine tatsächliche öffentliche IP-Adresse geändert wurde, verwenden Sie
CTRL-C
, um diekubectl
-Überwachung zu beenden.Die folgende Beispielausgabe zeigt eine gültige öffentliche IP-Adresse, die dem Dienst zugewiesen ist:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE store-front LoadBalancer 10.0.100.10 20.62.159.19 80:30025/TCP 4h5m
Öffnen Sie einen Webbrowser mit der externen IP-Adresse Ihres Dienstes, um die Azure Store-App in Aktion zu sehen.
Bereinigen von Ressourcen
Löschen von AKS-Ressourcen
Wenn Sie die über Terraform erstellten Ressourcen nicht mehr benötigen, führen Sie die folgenden Schritte aus:
Führen Sie terraform plan aus, und geben Sie das Flag
destroy
an.terraform plan -destroy -out main.destroy.tfplan
Die wichtigsten Punkte:
- Durch den Befehl
terraform plan
wird ein Ausführungsplan erstellt, aber nicht ausgeführt. Stattdessen werden die Aktionen ermittelt, die erforderlich sind, um die in Ihren Konfigurationsdateien angegebene Konfiguration zu erstellen. Mit diesem Muster können Sie überprüfen, ob der Ausführungsplan Ihren Erwartungen entspricht, bevor Sie Änderungen an den eigentlichen Ressourcen vornehmen. - Der optionale Parameter
-out
ermöglicht die Angabe einer Ausgabedatei für den Plan. Durch die Verwendung des Parameters-out
wird sichergestellt, dass genau der von Ihnen überprüfte Plan angewendet wird.
- Durch den Befehl
Führen Sie zum Anwenden des Ausführungsplans den Befehl terraform apply aus.
terraform apply main.destroy.tfplan
Löschen eines Dienstprinzipals
Mit dem folgenden Befehl rufen Sie die Dienstprinzipal-ID ab.
sp=$(terraform output -raw sp)
Löschen Sie den Dienstprinzipal mithilfe des Befehls az ad sp delete.
az ad sp delete --id $sp
- Installieren der Azure Developer CLI (AZD)
- Installieren und konfigurieren Sie Terraform.
- Sie können den Anwendungscode im Repository Azure-Samples/aks-store-demo überprüfen.
Klonen der Azure Developer CLI-Vorlage
Mit der Azure Developer CLI können Sie schnell Beispiele aus dem Repository Azure-Samples herunterladen. In unserer Schnellstartanleitung laden Sie die Anwendung aks-store-demo
herunter. Weitere Informationen zu diesen Optionen finden Sie in der Übersicht zu azd
.
Klonen Sie die Demovorlage für einen AKS-Store aus dem Azure-Samples-Repository, indem Sie den Befehl
azd init
mit dem Parameter--template
ausführen.azd init --template Azure-Samples/aks-store-demo
Geben Sie einen Umgebungsnamen für Ihr Projekt ein, der nur alphanumerische Zeichen und Bindestriche enthält, z. B. aks-terraform-1.
Enter a new environment name: aks-terraform-1
Anmelden beim Azure-Cloudkonto
Die azd
-Vorlage enthält den gesamten Code, der zum Erstellen der Dienste erforderlich ist. Sie müssen sich jedoch bei Ihrem Azure-Konto anmelden, um die Anwendung in AKS zu hosten.
Melden Sie sich mithilfe des Befehls
azd auth login
bei Ihrem Konto an.azd auth login
Kopieren Sie den Gerätecode, der in der Ausgabe angezeigt wird, und drücken Sie die EINGABETASTE, um sich anzumelden.
Start by copying the next code: XXXXXXXXX Then press enter and continue to log in from your browser...
Wichtig
Wenn Sie eine VM außerhalb des Netzwerks oder GitHub Codespace verwenden, verursachen bestimmte Azure-Sicherheitsrichtlinien Konflikte bei der Anmeldung über
azd auth login
. Wenn Sie hierbei Probleme haben, können Sie die erläuterte Problemumgehung mit „azd auth“ und einercurl
-Anforderung an die Localhost-URL verwenden, zu der Sie nach dem Ausführen vonazd auth login
weitergeleitet wurden.Authentifizieren Sie sich mit Ihren Anmeldeinformationen auf der Anmeldeseite Ihrer Organisation.
Bestätigen Sie, dass Sie die Person sind, die versucht, eine Verbindung mit der Azure CLI herzustellen.
Vergewissern Sie sich, dass die Meldung „Gerätecodeauthentifizierung abgeschlossen. Bei Azure angemeldet.“ im ursprünglichen Terminal angezeigt wird.
Waiting for you to complete authentication in the browser... Device code authentication completed. Logged in to Azure.
Problemumgehung mit „azd auth“
Für diese Problemumgehung müssen Sie die Azure CLI installiert haben.
Öffnen Sie ein Terminalfenster, und melden Sie sich über die Azure CLI mit dem Befehl
az login
an. Legen Sie dabei den Parameter--scope
aufhttps://graph.microsoft.com/.default
fest.az login --scope https://graph.microsoft.com/.default
Sie sollten auf eine Authentifizierungsseite auf einer neuen Registerkarte umgeleitet werden, um ein Browserzugriffstoken zu erstellen, wie im folgenden Beispiel zu sehen:
https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize?clientid=<your_client_id>.
Kopieren Sie die Localhost-URL der Webseite, die Sie erhalten haben, nachdem Sie versucht haben, sich mit
azd auth login
anzumelden.Verwenden Sie in einem neuen Terminalfenster die folgende
curl
-Anforderung, um sich anzumelden. Stellen Sie sicher, dass Sie den Platzhalter<localhost>
durch die Localhost-URL ersetzen, die Sie im vorherigen Schritt kopiert haben.curl <localhost>
Bei einer erfolgreichen Anmeldung wird eine HTML-Webseite ausgegeben, wie im folgenden Beispiel zu sehen:
<!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>
Schließen Sie das aktuelle Terminal, und öffnen Sie das ursprüngliche. Ihnen sollte nun eine JSON-Liste mit Ihren Abonnements angezeigt werden.
Kopieren Sie das
id
-Feld des Abonnements, das Sie verwenden möchten.Legen Sie Ihr Abonnement mithilfe des Befehls
az account set
fest.az account set --subscription <subscription_id>
Erstellen und Bereitstellen von Ressourcen für Ihren Cluster
Zum Bereitstellen der Anwendung verwenden Sie den Befehl azd up
, um alle Objekte zu erstellen, die für die Ausführung der AKS Store-Anwendung erforderlich sind.
- Eine Datei vom Typ
azure.yaml
definiert den gewünschten Zustand eines Clusters, z. B. die abzurufenden Containerimages, und enthält die folgenden Kubernetes-Bereitstellungen und -Dienste:
- Store Front: Webanwendung für Kund*innen zum Anzeigen von Produkten und Aufgeben von Bestellungen
- Product Service: zeigt Produktinformationen an.
- Order Service: dient der Aufgabe von Bestellungen.
- Rabbit MQ: Nachrichtenwarteschlange für eine Bestellwarteschlange
Hinweis
Zustandsbehaftete Container wie Rabbit MQ sollten nicht ohne permanenten Speicher für die Produktion ausgeführt werden. Sie werden hier der Einfachheit halber verwendet, jedoch sollten verwaltete Dienste wie Azure Cosmos DB oder Azure Service Bus verwendet werden.
Bereitstellen von Anwendungsressourcen
Mit der azd
-Vorlage für diese Schnellstartanleitung wird eine neue Ressourcengruppe mit einem AKS-Cluster und einer Azure Key Vault-Instanz erstellt. Die Key Vault-Instanz speichert geheime Clientschlüssel und führt die Dienste im Namespace pets
aus.
Erstellen Sie mit dem Befehl
azd up
alle Anwendungsressourcen.azd up
azd up
führt alle Hooks imazd-hooks
-Ordner aus, um die Anwendungsdienste vorab zu registrieren und bereitzustellen.Passen Sie Hooks an, um benutzerdefinierten Code in den
azd
-Workflowphasen hinzuzufügen. Weitere Informationen finden Sie in der Referenz zuazd
-Hooks.Wählen Sie ein Azure-Abonnement für die Abrechnung aus.
? Select an Azure Subscription to use: [Use arrows to move, type to filter] > 1. My Azure Subscription (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
Wählen Sie eine Region aus, in der Ihre Anwendung bereitgestellt werden soll.
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
führt automatisch die Hooks vor und nach der Bereitstellung aus, um die Ressourcen für Ihre Anwendung zu erstellen. Dieser Vorgang kann einige Minuten dauern. Anschließend sollte eine Ausgabe ähnlich der folgenden Beispielausgabe angezeigt werden:SUCCESS: Your workflow to provision and deploy to Azure completed in 9 minutes 40 seconds.
Generieren von Terraform-Plänen
In Ihrer Azure-Entwicklervorlage enthält der Ordner /infra/terraform
den gesamten Code, der zum Generieren des Terraform-Plans verwendet wird.
Terraform stellt Befehle bereit und führt sie aus, die terraform apply
als Teil des azd
-Bereitstellungsschritts verwenden. Anschließend sollte eine Ausgabe ähnlich der folgenden Beispielausgabe angezeigt werden:
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
Testen der Anwendung
Wenn die Anwendung ausgeführt wird, macht ein Kubernetes-Dienst das Anwendungs-Front-End im Internet verfügbar. Dieser Vorgang kann einige Minuten dauern.
Verwenden Sie den Befehl
kubectl set-context
, um Ihren Namespace auf den Demonamespacepets
festzulegen.kubectl config set-context --current --namespace=pets
Überprüfen Sie den Status der bereitgestellten Pods mithilfe des Befehls
kubectl get pods
. Stellen Sie sicher, dass alle Pods den StatusRunning
haben, bevor Sie fortfahren.kubectl get pods
Suchen Sie nach einer öffentlichen IP-Adresse für die Storefront-Anwendung, und überwachen Sie den Fortschritt mithilfe des Befehls
kubectl get service
mit dem Argument--watch
.kubectl get service store-front --watch
Die Ausgabe von EXTERNAL-IP für den
store-front
-Dienst lautet anfangs pending (ausstehend):NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE store-front LoadBalancer 10.0.100.10 <pending> 80:30025/TCP 4h4m
Nachdem die externe IP-Adresse (EXTERNAL-IP) von ausstehend in eine tatsächliche öffentliche IP-Adresse geändert wurde, verwenden Sie
CTRL-C
, um diekubectl
-Überwachung zu beenden.Die folgende Beispielausgabe zeigt eine gültige öffentliche IP-Adresse, die dem Dienst zugewiesen ist:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE store-front LoadBalancer 10.0.100.10 20.62.159.19 80:30025/TCP 4h5m
Öffnen Sie einen Webbrowser mit der externen IP-Adresse Ihres Dienstes, um die Azure Store-App in Aktion zu sehen.
Löschen des Clusters
Bereinigen Sie nach Abschluss der Schnellstartanleitung die nicht benötigten Ressourcen, um Azure-Gebühren zu vermeiden.
Löschen Sie alle in der Schnellstartanleitung erstellten Ressourcen mit dem Befehl
azd down
.azd down
Bestätigen Sie Ihre Entscheidung, alle verwendeten Ressourcen aus Ihrem Abonnement zu entfernen, indem Sie
y
eingeben und dieEnter
-TASTE drücken.? Total resources to delete: 14, are you sure you want to continue? (y/N)
Erlauben Sie bei der Bereinigung, dass die Variablen aus dieser Schnellstartanleitung ggf. wiederverwendet werden, indem Sie
y
eingeben und dann dieEnter
-TASTE drücken.[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.
Problembehandlung für Terraform in Azure
Behandeln Sie allgemeine Probleme bei der Verwendung von Terraform in Azure.
Nächste Schritte
In dieser Schnellstartanleitung haben Sie einen Kubernetes-Cluster und eine Beispielanwendung mit mehreren Containern dafür bereitgestellt. Diese Beispielanwendung dient nur zu Demozwecken und stellt nicht alle bewährten Methoden für Kubernetes-Anwendungen dar. Anleitungen zum Erstellen vollständiger Lösungen mit AKS für die Produktion finden Sie unter AKS-Lösungsleitfaden.
Weitere Informationen zu Azure Kubernetes Service (AKS) sowie ein vollständiges Beispiel vom Code bis zur Bereitstellung finden Sie im Tutorial zu Kubernetes-Clustern.