Creare un Azure Container Service (ACS) con un Kubernetes cluster

Abbiamo già visto in diversi articoli apparsi su questo sito che l’utilizzo dei container ci permette di migliorare l’utilizzo delle macchine virtuali sia on-premises che nel Cloud. Tuttavia, per migliorare l’affidabilità e la scalabilità, è necessario far girare decine se non migliaia di container utilizzando diversi Host. Azure Container Service, servendosi di diversi tipi di container orchestrator open source come Docker Swarm, Kubernetes e Marathon di Mesosphere’s DC/OS, permette di semplificare tantissimo la gestione dei container cluster.

In questo articolo analizzeremo l’uso di Kubernetes e della sua implementazione in Azure.

Introduzione

Azure Container Service (ACS) permette di gestire cluster di diversi Docker Hosts, dandoci la possibilità di scalare le nostre applicazioni gestendo decine di migliaia di container grazie anche ad orchestrator come Kubernetes.

Google ha rilasciato Kubernetes nel Febbraio 2015 proprio con lo scopo di orchestrare i container Docker. A Marzo 2016 ha reso il codice open source, donandolo alla Cloud Native Computing Foundation (CNCF) e impegnandosi al suo continuo sviluppo. Fin dall’inizio il software ha riscosso parecchio successo tra gli sviluppatori grazie alle numerose funzionalità che supporta.

Creazione di un cluster Kubernetes utilizzando Azure Container Service

Per creare un cluster Kubernetes in Azure è possibile utilizzare il portale web, un template di Azure Resource Manager oppure Azure CLI 2.0. In alternativa è anche possibile utilizzare un progetto open source presente su Github chiamato acs-engine per definire il cluster e per poterlo creare utilizzando Azure CLI 2.0.

Il modo più veloce per creare un cluster container su Azure è l’utilizzo della Azure Cloud Shell, una shell interattiva accessibile dal browser che permette di gestire le risorse di Azure. Gli utenti Linux possono scegliere di utilizzare Bash, mentre gli utenti Windows possono scegliere di utilizzare PowerShell. È possibile lanciare la Azure Cloud Shell direttamente dal portale di Azure, come mostrato in figura:

Figura 1: Lancio della Azure Cloud Shell dal portale

Quando lanciate la Azure Cloud Shell dal portale di Microsoft Azure la prima volta vi verrà chiesto di creare un gruppo di risorse, un account di archiviazione e una condivisione file (Azure file share). Scegliete di utilizzare Bash (Linux).

Figura 2: Primo lancio della Azure Cloud Shell con la richiesta di creazione dello storage account

Dopo aver creato uno storage account con ridondanza locale (LRS), a cui vengono applicati i normali costi di esercizio, verrà creata una Azure file share, che utilizzeremo sia per gli ambienti Bash che PowerShell.

Figura 3: Avvio della Azure Cloud Shell con Bash

Nella Azure Cloud Shell sono preinstallati i più diffusi strumenti da riga di comando, compreso Azure CLI 2.0, che utilizzeremo per creare l’Azure Container Service. Per prima cosa creiamo un Resource Group con il comando

az group create --name ACS-LabRG --location westeurope

e successivamente creiamo un nuovo servizio di Azure Container Service con orchestrator Kubernetes lanciando il comando

az acs create --orchestrator-type kubernetes --resource-group ACS-LabRG --name ACS-k8scluster --generate-ssh-keys

Figura 4: Creazione del nuovo Azure Container Service

Figura 5: Oggetti creati per l’Azure Container Service

Dopo aver atteso la creazione del nuovo Azure Container Service (che durerà alcuni minuti) possiamo scaricare e configurare le credenziali per accedere all’ACS Kubernetes cluster lanciando il comando

az acs kubernetes get-credentials --resource-group ACS-LabRG --name ACS-k8scluster

Le credenziali verranno salvate nello storage account utilizzato da Azure Cloud Shell.

Figura 6: Download delle credenziali per accedere al cluster ACS

Per verificare la connettività all’ACS Kubernetes Cluster vi basterà eseguire il comando:

kubectl get nodes

e verificare che tutti gli agent nodes siano Ready, come mostrato in figura:

Figura 7: Verifica della creazione e dello stato dei nodi del cluster

Distribuzione di un’applicazione nel cluster ACS Kubernetes

Per testare il nostro cluster distribuiremo un container con nginx, prendendolo dal Docker Hub. Lanciamo il comando

kubectl run nginx-lab --image=nginx --replicas=1 --port=80

e verifichiamo che il pod Kubernetes sia stato creato utilizzando il comando

kubectl get pods

Per identificare lo stato del deployment utilizziamo invece il comando

kubectl get deployment

Figura 8: Verifica dello stato del deployment

Per rendere il pod disponibile dall’esterno dovremo però prima esporlo con il comando

kubectl expose deployment nginx-lab --port=80 --type=LoadBalancer

Dopo qualche minuto, il servizio verrà esposto e potremo connetterci. Per individuare l’indirizzo IP pubblico utilizzato possiamo lanciare il comando

kubectl get services

Se la colonna relativa all’EXTERNAL-IP vi indica Pending, aspettate qualche minuto (nel mio caso ci sono voluti circa 5 minuti) e ripetete il comando.

Figura 9: Indirizzo IP pubblico del cluster

Collegatevi all’indirizzo IP ottenuto ed il vostro container NGINX vi farà apparire la pagina di benvenuto.

Figura 10: Pagina di benvenuto del container

Gestione di un’applicazione nel cluster ACS Kubernetes

Dopo aver creato la prima istanza del nostro deployment, possiamo scalarla facilmente utilizzando il comando

kubectl scale --replicas=2 deployment/nginx-lab

ed esattamente come prima, per verificare la buona riuscita, lanciamo il comando

kubectl get pods

Figura 11: Creazione dello scaling completato

Come potete vedere adesso ci sono due istanze che fanno girare il container nginx.

Con la stessa rapidità con cui è stato scalato è anche possibile cancellare il deployment con il comando

kubectl delete deployment nginx-lab

e verificare con il comando

kubectl get deployment

Figura 12: Cancellazione del Deployment

Conclusioni

I Docker Container di fatto ottimizzano il deployment delle nostre applicazioni e le rendono trasportabili. È necessario però fare in modo che gli Host che ospitano i container siano affidabili e scalabili. Una soluzione di orchestation è quindi necessaria per il corretto funzionamento ma soprattutto per la facilità e rapidità di utilizzo. Kubernetes insieme a Azure Container Service è senza dubbio una soluzione semplice da implementare ed altamente scalabile.

Microsoft ha anche annunciato da un paio di giorni la preview di AKS (Azure Container Service). Per maggiori info visualizzate l’articolo Introducing AKS (managed Kubernetes) and Azure Container Registry improvements