Déploiement

Cette page décrit les objets de déploiement Kubernetes et leur utilisation dans Google Kubernetes Engine.

Qu'est-ce qu'un déploiement ?

Les déploiements représentent un ensemble de pods identiques sans identités uniques. Un déploiement exécute plusieurs instances dupliquées de votre application et remplace automatiquement les instances qui échouent ou ne répondent plus. De cette manière, les déploiements permettent de s’assurer qu’une ou plusieurs instances de votre application sont disponibles pour répondre aux demandes des utilisateurs. Les déploiements sont gérés par le contrôleur de déploiement Kubernetes.

Les déploiements utilisent un modèle de pod qui contient une spécification pour ses pods. La spécification du pod détermine l'apparence de chaque pod : les applications à exécuter dans ses conteneurs, les volumes que les pods doivent monter, ses libellés, etc.

Lorsqu'un modèle de pod de déploiement est modifié, de nouveaux pods sont automatiquement créés un à un.

Schémas d'utilisation

Les déploiements conviennent parfaitement aux applications sans état qui utilisent des volumes ReadOnlyMany ou ReadWriteMany montés sur plusieurs instances dupliquées, mais ne conviennent pas aux charges de travail utilisant des volumes ReadWriteOnce. Pour les applications avec état utilisant des volumes ReadWriteOnce, utilisez des objets StatefulSet. Les objets StatefulSet sont conçus pour déployer des applications avec état et des applications en cluster qui sauvegardent des données sur un espace de stockage persistant, comme des disques persistants Compute Engine. Les StatefulSets conviennent au déploiement de Kafka, MySQL, Redis, ZooKeeper et d'autres applications nécessitant des identités uniques et persistantes et des noms d'hôte stables.

Créer des déploiements

Vous pouvez créer un déploiement en utilisant les commandes kubectl apply ou kubectl create.

Une fois créé, le déploiement garantit que le nombre souhaité de pods est en cours d'exécution et disponible à tout moment. Le déploiement remplace automatiquement les pods qui échouent ou sont évincés de leurs nœuds.

Voici un exemple de fichier manifeste de déploiement au format YAML :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

Dans cet exemple :

  • Un déploiement nommé nginx est créé, indiqué par le champ metadata: name.
  • Le déploiement crée trois pods répliqués, indiqués par le champ replicas.
  • Le modèle de pod, ou le champ spec: template, indique que ses pods sont libellés app: nginx.
  • La spécification du modèle de pod, ou du champ template: spec, indique que les pods exécutent un conteneur, nginx, qui exécute l'image Docker Hub nginx dans sa version 1.7.9.
  • Le déploiement ouvre le port 80 pour une utilisation par les pods.

Pour en savoir plus sur les spécifications du déploiement, consultez la documentation de l'API Kubernetes.

En résumé, le modèle de pod contient les instructions suivantes pour les pods créés par ce déploiement :

  • Chaque pod est libellé app: nginx.
  • Créez un conteneur et nommez-le nginx.
  • Exécutez l'image nginx dans sa version 1.7.9.
  • Ouvrez le port 80 pour envoyer et recevoir du trafic.

Pour plus d'informations sur la création de déploiements, reportez-vous à la section Créer un déploiement.

Mettre à jour des déploiements

Vous pouvez mettre à jour un déploiement en apportant des modifications à la spécification du modèle de pod du déploiement. Les modifications apportées au champ de spécification déclenchent automatiquement le déploiement de la mise à jour. Vous pouvez utiliser kubectl, l'API Kubernetes ou le menu des charges de travail GKE dans Google Cloud Console.

Par défaut, lorsqu'un déploiement déclenche une mise à jour, le déploiement arrête les pods, réduit progressivement le nombre de pods à zéro, puis draine et met fin aux pods. Ensuite, le déploiement utilise le modèle de pod mis à jour pour générer de nouveaux pods.

Les anciens pods ne sont supprimés que lorsqu'un nombre suffisant de nouveaux pods sont en cours d'exécution et les nouveaux pods ne sont pas créés tant qu'un nombre suffisant d'anciens pods n'a pas été supprimé. Pour voir dans quel ordre les pods sont déployés et supprimés, vous pouvez exécuter la commande kubectl describe deployments.

Les déploiements peuvent garantir que le nombre d'instances dupliquées en cours d'exécution est au minimum égal au nombre souhaité moins une instance, avec au maximum un pod indisponible. De même, les déploiements peuvent garantir que le nombre d'instances dupliquées en cours d'exécution est au maximum égal au nombre souhaité plus une instance, avec au maximum un pod en cours d’exécution de plus que le nombre souhaité.

Vous pouvez effectuer un rollback de la mise à jour à l'aide de la commande kubectl rollout undo. Vous pouvez également utiliser kubectl rollout pause pour interrompre temporairement un déploiement.

Gérer les déploiements

Voici une liste des tâches de gestion courantes pour les déploiements :

Statut et cycle de vie

Les déploiements peuvent se trouver dans l'un des trois états au cours de leur cycle de vie : en progression, terminé ou en échec.

Un état progression indique que le déploiement est en train d'exécuter ses tâches, telles que le déploiement ou la mise à l'échelle de ses pods.

Un état terminé indique que le déploiement a terminé ses tâches avec succès, que tous ses pods sont disponibles et qu'ils s'exécutent avec la dernière spécification, et qu'aucun ancien pod n'est en cours d'exécution.

Un état d'échec indique que le déploiement a rencontré un ou plusieurs problèmes qui l'empêchent d'exécuter ses tâches. Certaines causes incluent des quotas ou des autorisations insuffisants, des erreurs d'extraction d'image, des plages limites ou des erreurs d'exécution. Pour rechercher les causes de l'échec d'un déploiement, vous pouvez exécuter kubectl get deployment [DEPLOYMENT+NAME] -o yaml et examiner les messages dans le champ status: conditions.

Vous pouvez surveiller la progression d'un déploiement ou vérifier son état à l'aide de la commande kubectl rollout status.

Étapes suivantes