Mettre Ă  niveau un cluster Kubernetes sans temps d'arrĂȘt

Mettre Ă  niveau un cluster Kubernetes sans temps d'arrĂȘt

Processus de mise Ă  niveau pour 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 cours d'exĂ©cution. Cela peut inclure des mises Ă  jour de packages, des mises Ă  jour du noyau ou le dĂ©ploiement de nouvelles images de machine virtuelle. Dans la terminologie Kubernetes, cela s'appelle « Perturbation volontaire Â».

Cet article fait partie d'une sĂ©rie de 4 articles :

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

(environ. Attendez-vous à des traductions des articles restants de la série dans un avenir proche)

Dans cet article, nous dĂ©crirons tous les outils fournis par Kubernetes pour atteindre zĂ©ro temps d'arrĂȘt pour les nƓuds exĂ©cutĂ©s dans votre cluster.

Définition du problÚme

Nous adopterons d'abord une approche naĂŻve, identifierons les problĂšmes et Ă©valuerons les risques potentiels de cette approche, et dĂ©velopperons des connaissances pour rĂ©soudre chacun des problĂšmes que nous rencontrons tout au long du cycle. Le rĂ©sultat est une configuration qui utilise des hooks de cycle de vie, des sondes de prĂ©paration et des budgets de perturbation des pods pour atteindre notre objectif de zĂ©ro temps d'arrĂȘt.

Pour commencer notre voyage, prenons un exemple concret. Disons que nous avons un cluster Kubernetes de deux nƓuds, dans lequel une application s'exĂ©cute avec deux pods situĂ©s derriĂšre Service:

Mettre Ă  niveau un cluster Kubernetes sans temps d'arrĂȘt

Commençons par deux pods avec Nginx et Service exĂ©cutĂ©s sur nos deux nƓuds de cluster Kubernetes.

Nous souhaitons mettre Ă  jour la version du noyau de deux nƓuds de travail de notre cluster. Comment faisons-nous cela? Une solution simple consisterait Ă  dĂ©marrer de nouveaux nƓuds avec la configuration mise Ă  jour, puis Ă  arrĂȘter les anciens nƓuds tout en dĂ©marrant les nouveaux. MĂȘme si cela fonctionnera, cette approche posera quelques problĂšmes :

  • Lorsque vous dĂ©sactivez les anciens nƓuds, les pods qui s'y exĂ©cutent seront Ă©galement dĂ©sactivĂ©s. Que se passe-t-il si les pods doivent ĂȘtre effacĂ©s pour un arrĂȘt progressif ? Le systĂšme de virtualisation que vous utilisez peut ne pas attendre la fin du processus de nettoyage.
  • Et si vous dĂ©sactiviez tous les nƓuds en mĂȘme temps ? Vous bĂ©nĂ©ficierez d'un temps d'arrĂȘt dĂ©cent pendant que les pods se dĂ©placent vers de nouveaux nƓuds.

Nous avons besoin d'un moyen de migrer gracieusement les pods des anciens nƓuds tout en garantissant qu'aucun de nos processus de travail n'est en cours d'exĂ©cution pendant que nous apportons des modifications au nƓud. Ou lorsque nous effectuons un remplacement complet du cluster, comme dans l'exemple (c'est-Ă -dire que nous remplaçons les images de VM), nous souhaitons transfĂ©rer les applications en cours d'exĂ©cution des anciens nƓuds vers les nouveaux. Dans les deux cas, nous souhaitons empĂȘcher les nouveaux pods de se planifier sur d'anciens nƓuds, puis en expulser tous les pods en cours d'exĂ©cution. Pour atteindre ces objectifs, nous pouvons utiliser la commande kubectl drain.

Redistribuer tous les pods d'un nƓud

L'opĂ©ration de drainage vous permet de redistribuer tous les pods d'un nƓud. Lors de l'exĂ©cution du drain, le nƓud est marquĂ© comme non planifiable (drapeau NoSchedule). Cela empĂȘche de nouveaux pods d’apparaĂźtre dessus. Ensuite, drain commence Ă  expulser les pods du nƓud, arrĂȘte les conteneurs qui s'exĂ©cutent actuellement sur le nƓud, envoyant un signal TERM conteneurs dans une nacelle.

Bien que kubectl drain fera un excellent travail pour expulser les pods, il existe deux autres facteurs qui peuvent provoquer l'Ă©chec de l'opĂ©ration de drainage :

  • Votre candidature doit pouvoir se terminer gracieusement lors de la soumission TERM signal. Lorsque les pods sont expulsĂ©s, Kubernetes envoie un signal TERM conteneurs et attend qu'ils s'arrĂȘtent pendant un laps de temps spĂ©cifiĂ©, aprĂšs quoi, s'ils ne se sont pas arrĂȘtĂ©s, il les termine de force. Dans tous les cas, si votre conteneur ne perçoit pas correctement le signal, vous pouvez toujours Ă©teindre incorrectement les pods s'ils sont en cours d'exĂ©cution (par exemple, une transaction de base de donnĂ©es est en cours).
  • Vous perdez tous les pods qui contiennent votre application. Il peut ne pas ĂȘtre disponible lorsque de nouveaux conteneurs sont lancĂ©s sur de 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 les temps d'arrĂȘt dus Ă  une interruption volontaire, telle qu'une opĂ©ration de drainage sur un nƓud, Kubernetes propose les options de gestion des pannes suivantes :

Dans le reste de la sĂ©rie, nous utiliserons ces fonctionnalitĂ©s de Kubernetes pour attĂ©nuer l'impact de la migration des pods. Pour faciliter la comprĂ©hension de l'idĂ©e principale, nous utiliserons notre exemple ci-dessus avec la configuration de 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 Deployment, qui gĂšre les pods nginx dans le cluster. De plus, la configuration dĂ©crit la ressource Service, qui peut ĂȘtre utilisĂ© pour accĂ©der aux pods nginx dans un cluster.

Tout au long du cycle, nous Ă©tendrons cette configuration de maniĂšre itĂ©rative afin qu'elle inclue Ă  terme toutes les fonctionnalitĂ©s fournies par Kubernetes pour rĂ©duire les temps d'arrĂȘt.

Pour une version entiĂšrement implĂ©mentĂ©e et testĂ©e des mises Ă  jour du cluster Kubernetes pour un temps d'arrĂȘt nul sur AWS et au-delĂ , visitez Gruntwork.io.

Lisez également d'autres articles sur notre blog:

Source: habr.com

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