Exercice : Déployer une application sur votre cluster Azure Kubernetes Service

Effectué

Dans cet exercice, déployez le site web de votre entreprise en tant qu’application de test sur Azure Kubernetes Service (AKS). Le site web est un site web statique avec une pile de technologies sous-jacentes constituée de HTML, CSS et JavaScript. Il ne reçoit pas autant de demandes que les autres services et nous fournit un moyen sûr de tester les options de déploiement.

Notes

Si vous voulez explorer plus en détails le code source de l’application web, il est disponible dans ce dépôt GitHub. En outre, cet exemple d’application sera déployé uniquement dans un pool de nœuds Linux.

Important

Vous avez besoin de votre propre abonnement Azure pour exécuter cet exercice et des frais pourraient vous être facturés. Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

Créer un manifeste de déploiement

Vous créez un fichier manifeste de déploiement pour déployer votre application. Le fichier manifeste vous permet de définir le type de ressource que vous voulez déployer et tous les détails associés à la charge de travail.

Kubernetes regroupe les conteneurs en structures logiques appelées « pods », qui n’ont aucune intelligence. Les déploiements ajoutent l’intelligence manquante pour créer votre application. Nous allons créer un fichier de déploiement.

  1. Connectez-vous à Azure Cloud Shell.

  2. Dans Cloud Shell, créez un fichier manifeste pour le déploiement Kubernetes appelé deployment.yaml en utilisant l’éditeur intégré.

    touch deployment.yaml
    
  3. Ouvrez l’éditeur intégré dans Cloud Shell en entrant code .

  4. Ouvrez le fichier deployment.yaml et ajoutez la section de code YAML suivante.

    # 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
    

    Dans ce code, vous avez ajouté les deux premières clés pour indiquer à Kubernetes les éléments apiVersion et kind du manifeste que vous créez. name représente le nom du déploiement. Utilisez-le pour identifier et interroger les informations du déploiement quand vous utilisez kubectl.

    Conseil

    Pour plus d’informations sur apiVersion et les valeurs à placer dans cette clé, consultez la documentation officielle de Kubernetes. Vous trouverez un lien à la fin de ce module.

  5. Un déploiement encapsule un pod. Vous utilisez un modèle de définition pour définir les informations du pod dans le fichier manifeste. Le modèle est placé dans le fichier manifeste sous la section de spécification du déploiement.

    Mettez à jour le fichier deployment.yaml pour le faire correspondre au code YAML suivant.

    # 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
    

    Les pods n’utilisent pas les mêmes noms que les déploiements. Le nom d’un pod est un mélange du nom de déploiement, auquel un ID aléatoire est ajouté à la fin.

    Notez l’utilisation de la clé labels. Vous ajoutez la clé labels pour permettre aux déploiements de rechercher et de regrouper des pods.

  6. Un pod encapsule un ou plusieurs conteneurs. Tous les pods ont une section de spécification qui vous permet de définir les conteneurs à l’intérieur de ce pod.

    Mettez à jour le fichier deployment.yaml pour le faire correspondre au code YAML suivant.

    # 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 clé containers est un tableau de spécifications de conteneurs, car un pod peut avoir un ou plusieurs conteneurs. La spécification définit une image, un name, des resources, des ports et d’autres informations importantes sur le conteneur.

    Tous les pods en cours d’exécution ont un nom qui suit le modèle contoso-website-<UUID>, où UUID est un ID généré pour identifier toutes les ressources de façon univoque.

  7. C’est une bonne pratique que de définir le minimum et le maximum de ressources que l’application est autorisée à utiliser dans le cluster. Vous utilisez la clé resources pour spécifier ces informations.

    Mettez à jour le fichier deployment.yaml pour le faire correspondre au code YAML suivant.

    # 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
    

    Notez comment la section resource vous permet de spécifier la quantité minimale de ressources en tant que demande et la quantité maximale de ressources en tant que limite.

  8. La dernière étape consiste à définir les ports que ce conteneur expose en externe via la clé ports. La clé ports est un tableau d’objets, ce qui signifie qu’un conteneur dans un pod peut exposer plusieurs ports avec plusieurs noms.

    Mettez à jour le fichier deployment.yaml pour le faire correspondre au code YAML suivant.

    # 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
    

    Notez comment vous nommez le port avec la clé name. Le nommage des ports vous permet de changer le port exposé sans changer les fichiers qui référencent ce port.

  9. Enfin, ajoutez une section selector pour définir les charges de travail que le déploiement gère. La clé selector est placée dans la section de spécification du déploiement du fichier manifeste. Utilisez la clé matchLabels pour lister les étiquettes de tous les pods gérées par le déploiement.

    Mettez à jour le fichier deployment.yaml pour le faire correspondre au code YAML suivant.

    # 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
    

    Notes

    Dans un cluster AKS qui a plusieurs pools de nœuds (Linux et Windows), le fichier manifeste de déploiement listé précédemment définit également un nodeSelector pour indiquer à votre cluster AKS d’exécuter le pod de l’exemple d’application sur un nœud qui peut exécuter des conteneurs Linux.

    Les nœuds Linux ne peuvent pas exécuter des conteneurs Windows, et inversement.

  10. Enregistrez le fichier manifeste et fermez l’éditeur.

Appliquer le manifeste

  1. Dans Cloud Shell, exécutez la commande kubectl apply pour envoyer le manifeste de déploiement à votre cluster.

    kubectl apply -f ./deployment.yaml
    

    La commande doit produire un résultat similaire à l’exemple suivant.

    deployment.apps/contoso-website created
    
  2. Exécutez la commande kubectl get deploy pour vérifier si le déploiement a réussi.

    kubectl get deploy contoso-website
    

    La commande doit produire un tableau similaire à l’exemple suivant.

    NAME              READY   UP-TO-DATE   AVAILABLE   AGE
    contoso-website   0/1     1            0           16s
    
  3. Exécutez la commande kubectl get pods pour vérifier si le pod est en cours d’exécution.

    kubectl get pods
    

    La commande doit produire un tableau similaire à l’exemple suivant.

    NAME                               READY   STATUS    RESTARTS   AGE
    contoso-website-7c58c5f699-r79mv   1/1     Running   0          63s