Chapitre 05

Au quotidien

Une application en ligne n'est que le début. Publier, revenir en arrière, encaisser les redémarrages de nuit : les gestes qui reviennent chaque semaine.

Niveau intermédiaire  ·  Lecture 11 min  ·  Pour les développeurs

01Publier une nouvelle version

Changez le tag de l'image dans le manifeste, puis réappliquez. Kubernetes remplace les pods un par un, et n'envoie du trafic aux nouveaux que lorsque leur sonde répond : pas d'interruption.

Mise à jour progressive
# image: registry.gitlab.com/mon-equipe/boutique:1.4.2  ->  1.4.3
kubectl apply -f boutique.yaml
kubectl rollout status deploy/boutique
latest est un menteur

Le tag latest désigne une image différente chaque semaine, et Kubernetes ne sait pas qu'elle a changé. Résultat : deux pods qui tournent sur deux versions, et un retour arrière impossible. Utilisez des tags immuables : numéro de version ou empreinte du commit.

02Revenir en arrière

Le bouton panique
kubectl rollout history deploy/boutique
kubectl rollout undo deploy/boutique                  # la version précédente
kubectl rollout undo deploy/boutique --to-revision=3  # une version précise

Le retour arrière prend quelques secondes. Pensez ensuite à corriger le manifeste : le prochain apply remettrait sinon la version fautive. Quant au kubectl delete en production un vendredi à 17 heures, même les super-héros l'évitent.

03Les sondes

Deux sondes, deux questions
          readinessProbe:            # puis-je recevoir du trafic ?
            httpGet: { path: /health/ready, port: 8080 }
            periodSeconds: 5
          livenessProbe:             # suis-je bloqué au point d'être redémarré ?
            httpGet: { path: /health/live, port: 8080 }
            initialDelaySeconds: 20
            periodSeconds: 10
            failureThreshold: 3
  • readiness retire temporairement le pod du Service : démarrage, base indisponible, surcharge. Indispensable.
  • liveness redémarre le pod. À utiliser avec prudence : une sonde de vie qui dépend de la base de données redémarre toute l'application dès que la base tousse.

04Requests et limits

RéglageCe qu'il faitNotre conseil
requests.cpuRéserve du processeur pour placer le podCe que l'application consomme au calme
requests.memoryRéserve de la mémoireCe qu'elle consomme en charge normale
limits.memoryPlafond : au-delà, le conteneur est tuéUne fois et demie à deux fois la demande
limits.cpuPlafond de processeur : au-delà, ralentiSouvent inutile, il ralentit plus qu'il ne protège

Un conteneur tué pour excès de mémoire apparaît avec la raison OOMKilled dans kubectl describe pod. Pour connaître la consommation réelle : kubectl top pods.

05Traverser les nuits de mise à jour

Les serveurs de la plateforme se mettent à jour certaines nuits, un par un. Chaque serveur est vidé de ses pods avant de redémarrer. Votre application reste en ligne si :

  • elle a au moins deux réplicas, que Kubernetes répartit sur des serveurs différents ;
  • elle a une readinessProbe, pour ne recevoir du trafic qu'une fois prête ;
  • elle déclare un PodDisruptionBudget, qui interdit de vider un serveur si cela laisse l'application sans copie :
PodDisruptionBudget
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: boutique
spec:
  minAvailable: 1
  selector:
    matchLabels: { app: boutique }

Attention au piège inverse : un PodDisruptionBudget à minAvailable: 1 sur une application à un seul réplica bloque la maintenance du serveur. L'administrateur viendra alors vous voir, et pas pour vous féliciter.

06Journaux et shell

BesoinCommande
Suivre les journaux en directkubectl logs deploy/boutique -f
Journaux du conteneur précédent, celui qui a plantékubectl logs <pod> --previous
Ouvrir un shellkubectl exec -it deploy/boutique -- sh
Tester le Service depuis votre postekubectl port-forward svc/boutique 8080:80
Événements récents du namespacekubectl get events --sort-by=.lastTimestamp

Écrivez vos journaux sur la sortie standard, pas dans des fichiers : c'est là que Kubernetes et Rancher les cherchent.

07Mise à l'échelle

Plus de copies, tout de suite
kubectl scale deploy/boutique --replicas=4

Pratique pour encaisser un pic, mais reportez la valeur dans le manifeste, sinon le prochain apply la ramènera à l'ancienne. Une mise à l'échelle automatique selon la charge est possible avec un HorizontalPodAutoscaler, à condition d'avoir déclaré des requests réalistes.

Vous codez, nous veillons sur le cluster

Cette plateforme existe pour que vos développeurs déploient sans attendre personne et sans ticket. Nous l'hébergeons et l'exploitons pour vous : réseau, certificats, sauvegardes, mises à jour et surveillance des attaques. Il vous reste le plus intéressant.