Avvio rapido: Distribuire un Host contenitore Linux di Azure per un cluster del servizio Azure Kubernetes tramite AZure PowerShell
Introduzione all'host contenitore Linux di Azure con Azure PowerShell per distribuire un host contenitore Linux di Azure per un cluster del servizio Azure Kubernetes. Dopo aver installato i prerequisiti, creare un gruppo di risorse, creare un cluster del servizio Azure Kubernetes, connettersi al cluster ed eseguire un'applicazione multi-contenitore di esempio nel cluster.
Prerequisiti
- Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito prima di iniziare.
- Usare l'ambiente di PowerShell in Azure Cloud Shell. Per altre informazioni, vedere Avvio rapido in Azure Cloud Shell.
- Se si esegue PowerShell in locale, installare il modulo
Az PowerShell
e connettersi all'account Azure usando il cmdletConnect-AzAccount
. Per altre informazioni sull'installazione del modulo Az PowerShell, vedere Installare Azure PowerShell. - L'identità usata per creare il cluster dispone 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 (AKS).
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, è necessario 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.
Nell'esempio seguente viene creato un gruppo di risorse denominato testAzureLinuxResourceGroup nell'area eastus.
Creare un gruppo di risorse usando il cmdlet
New-AzResourceGroup
.New-AzResourceGroup -Name testAzureLinuxResourceGroup -Location eastus
L'output di esempio seguente è simile alla corretta creazione del gruppo di risorse:
ResourceGroupName : testAzureLinuxResourceGroup Location : eastus ProvisioningState : Succeeded Tags : ResourceId : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testAzureLinuxResourceGroup
Nota
L'esempio precedente usa eastus, ma i cluster Host contenitore Linux di Azure sono disponibili in tutte le aree.
Creare un cluster Host contenitore Linux di Azure
L'esempio seguente crea un cluster denominato testAzureLinuxCluster con un nodo.
Creare un cluster del servizio Azure Kubernetes usando il cmdlet
New-AzAksCluster
con il flag-NodeOsSKU
impostato su AzureLinux.New-AzAksCluster -ResourceGroupName testAzureLinuxResourceGroup -Name testAzureLinuxCluster -NodeOsSKU AzureLinux
Il comando viene completato dopo pochi minuti e vengono restituite informazioni in formato JSON sul cluster.
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.
Eseguire l'installazione
kubectl
in locale usando ilInstall-AzAksCliTool
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 testAzureLinuxResourceGroup -Name testAzureLinuxCluster
Verificare la connessione al cluster usando il comando
kubectl get
. Questo comando restituisce un elenco dei pod del cluster.kubectl get pods --all-namespaces
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 Cosmos DB 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
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 il cluster
Se non si prevede di continuare con le esercitazioni seguenti, rimuovere le risorse create per evitare di incorrere in addebiti per Azure.
Rimuovi il gruppo di risorse e tutte le risorse correlate usando il cmdlet
RemoveAzResourceGroup
.Remove-AzResourceGroup -Name testAzureLinuxResourceGroup
Passaggi successivi
In questo avvio rapido è stato distribuito un cluster del servizio Azure Container Host del servizio Azure Container. Per altre informazioni sull'host contenitore Linux di Azure ed eseguire un esempio completo di distribuzione e gestione del cluster, continuare con l'esercitazione sull'host contenitore Linux di Azure.