Guida introduttiva: Distribuire un cluster del servizio Azure Kubernetes con Azure PowerShell
Il servizio Azure Kubernetes è un servizio Kubernetes gestito che permette di distribuire e gestire rapidamente i cluster. Questa guida introduttiva spiega come:
- Distribuire un cluster del servizio Azure Kubernetes usando Azure PowerShell.
- Eseguire un'applicazione multi-contenitore di esempio con un gruppo di microservizi e front-end Web simulando uno scenario di vendita al dettaglio.
Nota
Per iniziare ad effettuare un veloce provisioning di un cluster del servizio Azure Kubernetes, questo articolo include i passaggi per la distribuzione di un cluster con impostazioni predefinite a solo scopo di valutazione. Prima di distribuire un cluster pronto per la produzione, è consigliabile acquisire familiarità con l'architettura di riferimento di base per valutare il modo in cui è allineato ai requisiti aziendali.
Operazioni preliminari
Questo articolo presuppone una conoscenza di base dei concetti relativi a Kubernetes. Per altre informazioni, vedere Concetti di base relativi a Kubernetes per il servizio Azure Kubernetes.
-
Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito prima di iniziare.
Per semplificare l'uso, provare l'ambiente PowerShell in Azure Cloud Shell. Per altre informazioni, vedere Avvio rapido per Bash in Azure Cloud Shell.
Se si vuole usare PowerShell in locale, installare il modulo Az PowerShell e connettersi all'account Azure usando il cmdlet Connect-AzAccount. Assicurarsi di eseguire i comandi con privilegi amministrativi. Per altre informazioni, vedere Installare Azure PowerShell.
Assicurarsi che l'identità usata per creare il cluster disponga delle autorizzazioni minime appropriate. Per altre informazioni sull'accesso e l'identità per il servizio Azure Kubernetes, vedere Opzioni di accesso e identità per il servizio Azure Kubernetes.
Se si dispone di più sottoscrizioni di Azure, impostare la sottoscrizione da usare per la guida introduttiva chiamando il cmdlet Set-AzContext. Per altre informazioni, vedere Gestire le sottoscrizioni di Azure con Azure PowerShell.
Creare un gruppo di risorse
Un gruppo di risorse di Azure è un gruppo logico in cui le risorse di Azure vengono distribuite e gestite. Quando si crea un gruppo di risorse, viene richiesto di specificare una posizione. Questa posizione è la posizione di archiviazione dei metadati del gruppo di risorse e dove le risorse vengono eseguite in Azure se non si specifica un'altra regione durante la creazione della risorsa.
L'esempio seguente crea un gruppo di risorse denominato myResourceGroup nella località stati uniti orientali.
Creare un gruppo di risorse usando il cmdlet
New-AzResourceGroup
.New-AzResourceGroup -Name myResourceGroup -Location eastus
L'output di esempio seguente è simile alla corretta creazione del gruppo di risorse:
ResourceGroupName : myResourceGroup Location : eastus ProvisioningState : Succeeded Tags : ResourceId : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroup
Creare un cluster del servizio Azure Container
Per creare un cluster del servizio Azure Kubernetes, usare il New-AzAksCluster
cmdlet . L'esempio seguente crea un cluster denominato myAKSCluster con un nodo e abilita un'identità gestita assegnata dal sistema.
New-AzAksCluster -ResourceGroupName myResourceGroup `
-Name myAKSCluster `
-NodeCount 1 `
-EnableManagedIdentity `
-GenerateSshKey
Il comando viene completato dopo pochi minuti e vengono restituite informazioni sul cluster.
Nota
Quando si crea un cluster del servizio Azure Kubernetes, viene creato automaticamente un secondo gruppo di risorse denominato gruppo di risorse del nodo per archiviare le risorse del servizio Azure Kubernetes. Per altre informazioni, vedere Gruppo di risorse node. Quando si elimina il gruppo di risorse per il cluster del servizio Azure Kubernetes, viene eliminato anche il gruppo di risorse del nodo. Viene visualizzato anche un gruppo di risorse NetworkWatcherRG creato per impostazione predefinita. Questo gruppo di risorse viene usato da Azure Network Watcher per archiviare i dati di monitoraggio. È possibile ignorare in modo sicuro questo gruppo di risorse. Per altre informazioni, vedere Abilitare o disabilitare Azure Network Watcher.
Stabilire la connessione al cluster
Per gestire un cluster Kubernetes, usare il client da riga di comando kubernetes kubectl. kubectl
è già installato se si usa Azure Cloud Shell. Per installare kubectl
in locale, chiamare il cmdlet Install-AzAksCliTool
.
Configurare
kubectl
per connettersi al cluster Kubernetes usando cmdletImport-AzAksCredential
. Questo comando scarica le credenziali e configura l'interfaccia della riga di comando di Kubernetes per usarli.Import-AzAksCredential -ResourceGroupName myResourceGroup -Name myAKSCluster
Verificare la connessione al cluster usando il comando
kubectl get
. Questo comando restituisce un elenco dei nodi del cluster.kubectl get nodes
L'esempio di output seguente mostra il nodo singolo creato nei passaggi precedenti. Assicurarsi che lo stato del nodo sia Pronto.
NAME STATUS ROLES AGE VERSION aks-nodepool1-11853318-vmss000000 Ready agent 2m26s v1.27.7
Distribuire l'applicazione
Per distribuire l'applicazione, usare un file manifesto per creare tutti gli oggetti necessari per eseguire l'applicazione di Archiviazione del servizio Azure Kubernetes. Un file manifesto Kubernetes definisce lo stato desiderato di un cluster, ad esempio le immagini del contenitore da eseguire. Il manifesto include le distribuzioni e i servizi Kubernetes seguenti:
- Front-store: applicazione Web per i clienti per visualizzare i prodotti ed effettuare ordini.
- Servizio prodotto: mostra le informazioni sul prodotto.
- Servizio ordini: effettua ordini.
- Rabbit MQ: coda di messaggi per una coda di ordini.
Nota
Non è consigliabile eseguire contenitori con stato, ad esempio Rabbit MQ, senza l'archiviazione permanente per la produzione. Questi vengono usati qui per semplicità, ma è consigliabile usare servizi gestiti, ad esempio Azure CosmosDB o il bus di servizio di Azure.
Creare un file denominato
aks-store-quickstart.yaml
e copiarlo nel manifesto seguente: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
Per un dettaglio dei file manifesto YAML, vedere Distribuzioni e manifesti YAML.
Se si crea e si salva il file YAML in locale, è possibile caricare il file manifesto nella directory predefinita in CloudShell facendo clic sul pulsante Carica/Scarica file e selezionando il file dal file system locale.
Distribuire l'applicazione usando il comando kubectl apply e specificare il nome del manifesto YAML.
kubectl apply -f aks-store-quickstart.yaml
L'output di esempio seguente mostra le distribuzioni e i servizi:
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
Testare l'applicazione
Quando l'applicazione viene eseguita, un servizio Kubernetes espone il front-end dell'applicazione a Internet. Questo processo può richiedere alcuni minuti.
Controllare lo stato dei pod distribuiti usando il comando kubectl get pods. Fare in modo che tutti i pod siano
Running
prima di procedere.kubectl get pods
Verificare la presenza di un indirizzo IP pubblico per l'applicazione front-store. Monitorare lo stato usando il comando kubectl get service con l'argomento
--watch
.kubectl get service store-front --watch
L'output EXTERNAL-IP per il servizio
store-front
inizialmente viene visualizzato come in sospeso:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE store-front LoadBalancer 10.0.100.10 <pending> 80:30025/TCP 4h4m
Quando l'indirizzo EXTERNAL-IP passa da in sospeso a un effettivo indirizzo IP pubblico, usare
CTRL-C
per arrestare il processo di controllokubectl
.L'output di esempio seguente mostra un indirizzo IP pubblico valido assegnato al servizio:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE store-front LoadBalancer 10.0.100.10 20.62.159.19 80:30025/TCP 4h5m
Aprire un Web browser all'indirizzo IP esterno del servizio per visualizzare l'app di Azure Store in azione.
Eliminare risorse
Se non si prevede di eseguire l'esercitazione del servizio Azure Kubernetes, ripulire le risorse non necessarie per evitare addebiti di Azure. Rimuovere il gruppo di risorse, il servizio contenitore e tutte le risorse correlate chiamando il Remove-AzResourceGroup
cmdlet .
Remove-AzResourceGroup -Name myResourceGroup
Nota
Il cluster del servizio Azure Kubernetes è stato creato con l'identità gestita assegnata dal sistema (opzione di identità predefinita usata in questa guida introduttiva), l'identità viene gestita dalla piattaforma e non richiede la rimozione.
Passaggi successivi
In questa guida introduttiva, è stato distribuito un cluster Kubernetes, successivamente è stata distribuita una semplice applicazione multi-contenitore. Questa applicazione di esempio è solo a scopo dimostrativo e non rappresenta tutte le procedure consigliate per le applicazioni Kubernetes. Per indicazioni sulla creazione di soluzioni complete con il servizio Azure Kubernetes per la produzione, vedere Linee guida per le soluzioni del servizio Azure Kubernetes.
Per altre informazioni sul servizio Azure Kubernetes e per un esempio completo di distribuzione del codice, passare all'esercitazione sul cluster Kubernetes.
Azure Kubernetes Service