
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 .
Ce post fait partie d'un cycle de 4 articles :
- Cet article.
- ArrĂȘt correct des pods dans un cluster Kubernetes
- ArrĂȘt diffĂ©rĂ© d'un pod lors de sa suppression
- 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:

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
TERMdu 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).TERMVous 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: 80Cette 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 .
Lisez aussi d'autres articles sur notre blog :
Source : habr.com
