Mise Ă  jour du cluster Kubernetes sans temps d'arrĂȘt

Mise Ă  jour du cluster Kubernetes sans temps d'arrĂȘt

Le processus de mise Ă  jour de votre cluster Kubernetes

À un moment donnĂ©, lors de l'utilisation d'un cluster Kubernetes, il devient nĂ©cessaire de mettre Ă  jour les nƓuds en fonctionnement. Cela peut inclure des mises Ă  jour de paquets, une mise Ă  jour du noyau ou le dĂ©ploiement de nouvelles images de machines virtuelles. Dans la terminologie de Kubernetes, cela s'appelle "Interruption Volontaire".

Ce post fait partie d'un cycle de 4 articles :

  1. Cet article.
  2. ArrĂȘt correct des pods dans un cluster Kubernetes
  3. ArrĂȘt diffĂ©rĂ© d'un pod lors de sa suppression
  4. Comment Ă©viter les temps d'arrĂȘt dans un cluster Kubernetes Ă  l'aide des PodDisruptionBudgets

(trad. : attendez-vous aux traductions des autres articles du cycle dans un proche avenir)

Dans cet article, nous allons dĂ©crire tous les outils que Kubernetes fournit pour atteindre un temps d'arrĂȘt nul pour les nƓuds fonctionnant dans votre cluster.

Définir le problÚme

Dans un premier temps, nous allons adopter une approche naĂŻve, identifier des problĂšmes et Ă©valuer les risques potentiels de cette approche tout en accumulant des connaissances pour rĂ©soudre chaque problĂšme que nous rencontrerons au cours de ce cycle. À la fin, nous disposerons d'une configuration utilisant des lifecycle hooks, des readiness probes et des budgets de perturbation de pods pour atteindre notre objectif de temps d'arrĂȘt nul.

Pour commencer notre chemin, prenons un exemple concret. Supposons que nous ayons un cluster Kubernetes composĂ© de deux nƓuds, dans lequel une application avec deux pods est en cours d'exĂ©cution, derriĂšre Service:

Mise Ă  jour du cluster Kubernetes sans temps d'arrĂȘt

Commençons avec deux pods Nginx et un service exĂ©cutĂ©s sur nos deux nƓuds du cluster Kubernetes.

Nous souhaitons mettre Ă  jour la version du noyau des deux nƓuds de travail dans notre cluster. Comment allons-nous procĂ©der ? Une solution simple serait de dĂ©marrer de nouveaux nƓuds avec une configuration mise Ă  jour, puis d'Ă©teindre les anciens nƓuds tout en dĂ©marrant les nouveaux. Bien que cela fonctionne, il y aura plusieurs problĂšmes avec cette approche :

  • Lorsque vous Ă©teignez les anciens nƓuds, les pods qui y sont exĂ©cutĂ©s seront Ă©galement Ă©teints. Que se passe-t-il si les pods doivent ĂȘtre nettoyĂ©s pour un arrĂȘt correct ? Le systĂšme de virtualisation que vous utilisez peut ne pas attendre la fin du processus de nettoyage.
  • Que se passe-t-il si vous Ă©teignez tous les nƓuds en mĂȘme temps ? Vous aurez un arrĂȘt significatif pendant que les pods se dĂ©placent vers les nouveaux nƓuds.

Nous avons besoin d'un moyen correct pour migrer les pods des anciens nƓuds tout en nous assurant qu'aucun de nos processus de travail n'est en cours pendant que nous apportons des modifications aux nƓuds. Ou lorsque nous effectuons un remplacement complet du cluster, comme dans l'exemple (c'est-Ă -dire que nous remplaçons les images des machines virtuelles), nous voulons transfĂ©rer les applications en cours des anciens nƓuds vers les nouveaux. Dans les deux cas, nous voulons empĂȘcher la planification de nouveaux pods sur les anciens nƓuds, puis Ă©vacuer tous les pods en cours de ceux-ci. Pour atteindre ces objectifs, nous pouvons utiliser la commande kubectl drain.

Redistribution de tous les pods depuis le nƓud

L'opĂ©ration drain permet de redistribuer tous les pods depuis le nƓud. Au cours de l'exĂ©cution du drain, le nƓud est marquĂ© comme non planifiable (indicateur NoSchedule). Cela empĂȘche l'apparition de nouveaux pods sur celui-ci. Ensuite, le drain commence Ă  Ă©vacuer les pods du nƓud, terminant les conteneurs qui sont actuellement en cours d'exĂ©cution sur le nƓud en envoyant le signal TERM aux conteneurs dans le pod.

Bien que kubectl drain Bien que cela fonctionne parfaitement pour évacuer les pods, il y a encore deux facteurs qui peuvent causer un échec lors de l'exécution de l'opération de drainage :

  • Votre application doit pouvoir se terminer correctement lors de la rĂ©ception TERM du signal. Lorsque les pods sont Ă©vacuĂ©s, Kubernetes envoie un signal aux conteneurs et attend leur arrĂȘt pendant un certain temps, aprĂšs quoi, s'ils ne se sont pas arrĂȘtĂ©s, les termine de force. Dans tous les cas, si votre conteneur ne rĂ©agit pas correctement au signal, vous risquez de fermer les pods de maniĂšre incorrecte s'ils sont actuellement actifs (par exemple, s'il y a une transaction en cours dans la base de donnĂ©es). TERM Vous perdez tous les pods contenant votre application. Elle peut ĂȘtre inaccessible au moment du dĂ©marrage de nouveaux conteneurs sur les nouveaux nƓuds ou, si vos pods sont dĂ©ployĂ©s sans contrĂŽleurs, ils peuvent ne pas redĂ©marrer du tout.
  • Éviter les temps d'arrĂȘt

Pour minimiser le temps d'arrĂȘt causĂ© par une interruption volontaire, comme lors de l'opĂ©ration de drainage d'un nƓud, Kubernetes propose les options suivantes pour gĂ©rer les pannes :

Résiliation en douceur

Dans les autres parties du cycle, nous utiliserons les données de cette fonction Kubernetes pour atténuer les conséquences du déplacement des pods. Pour faciliter la compréhension de l'idée principale, nous prendrons comme exemple la configuration des ressources suivante :

---
apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-deployment
 labels:
   app: nginx
spec:
 replicas: 2
 selector:
   matchLabels:
     app: nginx
 template:
   metadata:
     labels:
       app: nginx
   spec:
     containers:
     - name: nginx
       image: nginx:1.15
       ports:
       - containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
 name: nginx-service
spec:
 selector:
   app: nginx
 ports:
 - protocol: TCP
   targetPort: 80
   port: 80

Cette configuration est un exemple minimal. DĂ©ploiement, qui gĂšre les pods nginx dans le cluster. De plus, la configuration dĂ©crit une ressource Service, qui peut ĂȘtre utilisĂ©e pour accĂ©der aux pods nginx dans le cluster.

Tout au long du cycle, nous allons itĂ©rativement Ă©tendre cette configuration pour qu'Ă  la fin, elle comprenne toutes les fonctionnalitĂ©s offertes par Kubernetes afin de rĂ©duire le temps d'arrĂȘt.

Pour obtenir une version entiĂšrement dĂ©ployĂ©e et testĂ©e des mises Ă  jour de clustere Kubernetes sans temps d'arrĂȘt sur AWS et d'autres ressources, visitez Gruntwork.io.

Lisez aussi d'autres articles sur notre blog :

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster