Esercizio - Distribuire un'applicazione nel cluster del servizio Azure Kubernetes
In questo esercizio verrà distribuito il sito Web della società come app di test nel servizio Azure Kubernetes (AKS). Il sito Web è un sito Web statico con uno stack di tecnologie sottostanti HTML, CSS e JavaScript. Non riceve così tante richieste come gli altri servizi e rappresenta un modo sicuro per testare le opzioni di distribuzione.
Nota
Il codice per l'app Web è disponibile in questo repository GitHub se si vuole esplorare ulteriormente il codice sorgente. Questa app di esempio verrà inoltre distribuita solo in un pool di nodi Linux.
Importante
Per eseguire questo esercizio è necessario disporre di una propria sottoscrizione di Azure e questo potrebbe comportare dei costi. Se non hai ancora una sottoscrizione di Azure, crea un account gratuito prima di iniziare.
Creare un manifesto della distribuzione
Si crea un file manifesto della distribuzione per distribuire l'applicazione. Il file manifesto consente di definire il tipo di risorsa che si vuole distribuire e tutti i dettagli associati al carico di lavoro.
Kubernetes raggruppa i contenitori in strutture logiche denominate pod, non intelligenti. Le distribuzioni aggiungono l'intelligenza mancante per creare l'applicazione. A questo punto è possibile creare un file di distribuzione.
Accedere ad Azure Cloud Shell.
In Cloud Shell creare un file manifesto per la distribuzione Kubernetes denominato
deployment.yaml
, usando l'editor integrato.touch deployment.yaml
Aprire l'editor integrato in Cloud Shell immettendo
code .
Aprire il file
deployment.yaml
e aggiungere la sezione di codice YAML seguente.# deployment.yaml apiVersion: apps/v1 # The API resource where this workload resides kind: Deployment # The kind of workload we're creating metadata: name: contoso-website # This will be the name of the deployment
In questo codice sono state aggiunte le prime due chiavi per indicare a Kubernetes i valori
apiVersion
ekind
del manifesto da creare.name
è il nome della distribuzione. Verrà usato per identificare ed eseguire query sulle informazioni della distribuzione quando si usakubectl
.Suggerimento
Per altre informazioni su
apiVersion
e sui valori da inserire in questa chiave, vedere la documentazione ufficiale di Kubernetes. Trovare un collegamento alla fine del modulo.Una distribuzione esegue il wrapping di un pod. Si usa una definizione di modello per definire le informazioni del pod all'interno del file manifesto. Il modello viene inserito nel file manifesto sotto la sezione delle specifiche della distribuzione.
Aggiornare il file
deployment.yaml
in modo che corrisponda al codice YAML seguente.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: # Metadata for the pod labels: app: contoso-website
I pod non usano gli stessi nomi delle distribuzioni. Il nome del pod è una combinazione del nome della distribuzione con un ID casuale aggiunto alla fine.
Si noti l'uso della chiave
labels
. La chiavelabels
viene aggiunta per consentire alle distribuzioni di trovare e raggruppare i pod.Un pod esegue il wrapping di uno o più contenitori. Tutti i pod hanno una sezione delle specifiche che consente di definire i contenitori all'interno di tale pod.
Aggiornare il file
deployment.yaml
in modo che corrisponda al codice YAML seguente.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: containers: # Here we define all containers - name: contoso-website
La chiave
containers
è una matrice di specifiche del contenitore poiché un pod può avere uno o più contenitori. Le specifiche definisconoimage
,name
,resources
,ports
e altre informazioni importanti sul contenitore.Per tutti i pod in esecuzione verrà usato il nome
contoso-website-<UUID>
, dove UUID è un ID generato per identificare tutte le risorse in modo univoco.È consigliabile definire una quantità minima e massima di risorse che l'app è autorizzata a usare dal cluster. Usare la chiave
resources
per specificare queste informazioni.Aggiornare il file
deployment.yaml
in modo che corrisponda al codice YAML seguente.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: containers: - image: mcr.microsoft.com/mslearn/samples/contoso-website name: contoso-website resources: requests: # Minimum amount of resources requested cpu: 100m memory: 128Mi limits: # Maximum amount of resources requested cpu: 250m memory: 256Mi
Si noti che la sezione delle risorse consente di specificare la quantità minima di risorse come richiesta e la quantità massima di risorse come limite.
L'ultimo passaggio consiste nel definire le porte che questo contenitore esporrà esternamente tramite la chiave
ports
. La chiaveports
è una matrice di oggetti e ciò significa che un contenitore in un pod può esporre più porte con più nomi.Aggiornare il file
deployment.yaml
in modo che corrisponda al codice YAML seguente.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: nodeSelector: kubernetes.io/os: linux containers: - image: mcr.microsoft.com/mslearn/samples/contoso-website name: contoso-website resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 80 # This container exposes port 80 name: http # We named that port "http" so we can refer to it later
Si noti come assegnare un nome alla porta usando la chiave
name
. L'assegnazione di un nome alle porte consente di modificare la porta esposta senza modificare i file che fanno riferimento a tale porta.Aggiungere infine una sezione selector per definire i carichi di lavoro che verranno gestiti dalla distribuzione. La chiave
selector
viene inserita nella sezione delle specifiche della distribuzione del file manifesto. Usare la chiavematchLabels
per elencare le etichette per tutti i pod gestiti dalla distribuzione.Aggiornare il file
deployment.yaml
in modo che corrisponda al codice YAML seguente.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: selector: # Define the wrapping strategy matchLabels: # Match all pods with the defined labels app: contoso-website # Labels follow the `name: value` template template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: nodeSelector: kubernetes.io/os: linux containers: - image: mcr.microsoft.com/mslearn/samples/contoso-website name: contoso-website resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 80 name: http
Nota
In un cluster del servizio Azure Kubernetes in cui sono presenti più pool di nodi (Linux e Windows), il file manifesto della distribuzione elencata in precedenza definisce anche un oggetto
nodeSelector
per indicare al cluster del servizio Azure Kubernetes di eseguire il pod dell'applicazione di esempio in un nodo che può eseguire contenitori Linux.I nodi Linux non possono eseguire contenitori Windows e viceversa.
Salvare il file manifesto e chiudere l'editor.
Applicare il manifesto
In Cloud Shell eseguire il comando
kubectl apply
per inviare il manifesto della distribuzione al cluster.kubectl apply -f ./deployment.yaml
Il comando dovrebbe restituire un output simile all'esempio seguente.
deployment.apps/contoso-website created
Eseguire il comando
kubectl get deploy
per verificare se la distribuzione è stata completata correttamente.kubectl get deploy contoso-website
Il comando dovrebbe restituire una tabella simile all'esempio seguente.
NAME READY UP-TO-DATE AVAILABLE AGE contoso-website 0/1 1 0 16s
Eseguire il comando
kubectl get pods
per verificare se il pod è in esecuzione.kubectl get pods
Il comando dovrebbe restituire una tabella simile all'esempio seguente.
NAME READY STATUS RESTARTS AGE contoso-website-7c58c5f699-r79mv 1/1 Running 0 63s