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

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
TERMsignal. Lorsque les pods sont expulsĂ©s, Kubernetes envoie un signalTERMconteneurs 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: 80Cette 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 .
Lisez également d'autres articles sur notre blog:
Source: habr.com
