Esercizio - Distribuire un'applicazione nel cluster del servizio Azure Kubernetes

Completato

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.

  1. Accedere ad Azure Cloud Shell.

  2. In Cloud Shell creare un file manifesto per la distribuzione Kubernetes denominato deployment.yaml, usando l'editor integrato.

    touch deployment.yaml
    
  3. Aprire l'editor integrato in Cloud Shell immettendo code .

  4. 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 e kind del manifesto da creare. name è il nome della distribuzione. Verrà usato per identificare ed eseguire query sulle informazioni della distribuzione quando si usa kubectl.

    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.

  5. 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 chiave labels viene aggiunta per consentire alle distribuzioni di trovare e raggruppare i pod.

  6. 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 definiscono image, 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.

  7. È 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.

  8. L'ultimo passaggio consiste nel definire le porte che questo contenitore esporrà esternamente tramite la chiave ports. La chiave ports è 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.

  9. 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 chiave matchLabels 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.

  10. Salvare il file manifesto e chiudere l'editor.

Applicare il manifesto

  1. 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
    
  2. 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
    
  3. 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