Cordons et drains : comment préparer un nœud Kubernetes pour la maintenance

0
390

Les nœuds Kubernetes nécessitent une maintenance occasionnelle. Vous pouvez mettre à jour le noyau du nœud, redimensionner sa ressource de calcul dans votre compte cloud ou remplacer des composants matériels physiques dans une installation auto-hébergée.

Les cordons et les drains Kubernetes sont deux mécanismes que vous pouvez utiliser pour se préparer en toute sécurité à l'indisponibilité de Node. Ils permettent aux charges de travail exécutées sur un nœud cible d'être replanifiées sur d'autres. Vous pouvez ensuite arrêter le nœud ou le supprimer de votre cluster sans affecter la disponibilité du service.

Application d'un cordon de nœud

Le cordon d'un nœud le marque comme indisponible pour le planificateur Kubernetes. Le nœud ne sera pas éligible pour héberger de nouveaux pods ajoutés ultérieurement à votre cluster.

Utilisez la commande kubectl cordon pour placer un cordon autour d'un nœud nommé :

$ kubectl cordon node-1 node/node -1 cordon

Les pods existants déjà en cours d'exécution sur le nœud ne seront pas affectés par le cordon. Ils resteront accessibles et seront toujours hébergés par le nœud en cordon.

Vous pouvez vérifier lesquels de vos nœuds sont actuellement en boucle avec la commande get nodes :

$ kubectl get nodes NAME STATUS ROLES AGE VERSION node-1 Ready,SchedulingDisabled control-plane,master 26m v1.23.3

Les nœuds en boucle apparaissent avec le statut SchedulingDisabled.

Drainer un nœud

L'étape suivante consiste à vider les pods restants du nœud. Cette procédure expulsera les pods afin qu'ils soient replanifiés sur d'autres nœuds de votre cluster. Les pods sont autorisés à se terminer normalement avant d'être supprimés de force du nœud cible.

Exécutez kubectl drain pour lancer une procédure de vidange. Spécifiez le nom du nœud que vous utilisez pour la maintenance :

$ kubectl drain node-1 node/node-1 deja cordoned evicting pod kube-system/storage-provisioner evicting pod default/nginx-7c658794b9- zszdd expulsant le pod kube-system/coredns-64897985d-dp6lx pod/storage-provisioner expulsé pod/nginx-7c658794b9-zszdd expulsé pod/coredns-64897985d-dp6lx expulsé node/node-1 expulsé

La procédure de vidange boucle d'abord le nœud si vous n'en avez pas déjà placé un manuellement. Il supprimera ensuite les charges de travail Kubernetes en cours d'exécution en les replanifiant en toute sécurité vers d'autres nœuds de votre cluster.

Vous pouvez arrêter ou détruire le nœud une fois le drainage terminé. Vous avez libéré le nœud de ses responsabilités envers votre cluster. Le cordon fournit l'assurance qu'aucune nouvelle charge de travail n'a été planifiée depuis la fin de la vidange.

Ignorer les périodes de grâce des pods

Les vidanges peuvent parfois prendre un certain temps si vos pods ont de longues périodes de grâce. Ce n'est peut-être pas idéal lorsque vous devez mettre un nœud hors ligne de toute urgence. Utilisez l'indicateur –grace-period pour remplacer les périodes de grâce de fin de pod et forcer une expulsion immédiate :

$ kubectl drain node-1 –grace-period 0

Ceci doit être utilisé avec précaution – certaines charges de travail peuvent ne pas bien répondre si elles sont arrêtées sans qu'on leur offre une chance de les nettoyer.

Résoudre les erreurs de drain

Les drains peuvent parfois entraîner une erreur en fonction des types de pod qui existent dans votre cluster. Voici deux problèmes courants avec leurs résolutions.

1. “Impossible de supprimer les pods non gérés par ReplicationController, ReplicaSet, Job ou StatefulSet”

Ce message s'affiche si le nœud héberge des pods qui ne sont pas gérés par un contrôleur. Il fait référence aux pods qui ont été créés en tant qu'objets autonomes, où ils ne font pas partie d'une ressource de niveau supérieur comme un déploiement ou un ReplicaSet.

Kubernetes ne peut pas replanifier automatiquement ces ’ 8220;nu” Les pods ainsi expulsés les rendront indisponibles. Adressez manuellement ces pods avant d'effectuer le drainage ou utilisez l'indicateur –force pour autoriser leur suppression :

$ kubectl drain node-1 –force

2. “Impossible de supprimer les pods gérés par DaemonSet”

Les pods qui font partie des ensembles de démons posent un défi aux expulsions. Les contrôleurs DaemonSet ne tiennent pas compte du statut planifiable de vos nœuds. La suppression d'un pod faisant partie d'un DaemonSet entraînera son retour immédiat, même si vous avez bouclé le nœud. Les opérations de drainage sont par conséquent abandonnées avec une erreur pour vous avertir de ce comportement.

Vous pouvez procéder à l'expulsion en ajoutant l'indicateur –ignore-daemonsets. Cela expulsera tout le reste tout en ignorant tous les DaemonSets existants.

$ kubectl drain node-1 –ignore-daemonsets

Vous devrez peut-être utiliser cet indicateur même si vous n'avez pas créé de DaemonSets vous-même. Les composants internes de l'espace de noms du système kube peuvent utiliser des ressources DaemonSet.

Minimiser les temps d'arrêt avec les budgets de perturbation des pods

Le drainage d'un nœud ne garantit pas que vos charges de travail resteront accessibles tout au long. Vos autres nœuds auront besoin de temps pour honorer les demandes de planification et créer de nouveaux conteneurs.

Cela peut être particulièrement important si vous drainez plusieurs nœuds en peu de temps. Vider le premier nœud pourrait reprogrammer ses pods sur le deuxième nœud, qui est lui-même alors supprimé.

Les budgets de perturbation des pods sont un mécanisme pour éviter cette situation. Vous pouvez les utiliser avec Deployments, ReplicationControllers, ReplicaSets et StatefulSets.

Les objets ciblés par un budget d'interruption de pod sont garantis avoir un nombre spécifique de pods accessibles à tout moment. Kubernetes bloquera les drains de nœuds qui entraîneraient une diminution trop importante du nombre de pods disponibles.

Voici un exemple d'objet YAML PodDisruptionBudget :

apiVersion : policy/v1 kind : PodDisruptionBudget metadata : name : demo-pdb spec : minAvailable : 4 selector : matchLabels : app : my-app

Cette règle exige qu'il y ait au moins quatre pods en cours d'exécution avec le libellé app=my-app. Les drains de nœuds qui entraîneraient la planification de seulement trois pods seront évités.

Le niveau de perturbation autorisé est exprimé sous la forme du champ maxUnavailable ou minAvailable. Un seul d'entre eux peut exister dans un seul objet Pod Disruption Budget. Chacun accepte un nombre absolu de pods ou un pourcentage relatif au nombre total de pods en pleine disponibilité :

  • minAvailable : 4 – Exiger qu'au moins quatre pods soient disponibles.
  • maxIndisponible : 50 % – Autorisez jusqu'à la moitié du nombre total de pods à être indisponibles.

Ignorer les budgets d'interruption de pod

Budgets d'interruption de pod sont un mécanisme qui assure la protection de vos charges de travail. Ils ne doivent pas être remplacés, sauf si vous devez immédiatement arrêter un nœud. L'indicateur –disable-eviction de la commande drain fournit un moyen d'y parvenir.

$ kubectl drain node-1 –disable-eviction

Cela contourne le processus d'expulsion régulier du Pod. Les pods seront directement supprimés à la place, ignorant les budgets d'interruption appliqués.

Sauvegarde des nœuds

Une fois que vous avez terminé votre maintenance, vous pouvez remettre le nœud sous tension pour le reconnecter à votre cluster. Vous devez ensuite supprimer le cordon que vous avez créé pour marquer à nouveau le nœud comme planifiable :

$ kubectl uncordon node-1 node/node-1 uncordoned

Kubernetes commencera à allouer de nouvelles charges de travail au nœud, le rendant actif service.

Résumé

La maintenance des nœuds Kubernetes ne doit pas être tentée tant que vous n'avez pas vidé les charges de travail existantes et établi un cordon. Ces mesures vous aident à éviter les temps d'arrêt inattendus lors de la maintenance de nœuds activement utilisés.

Les drains de base sont souvent adéquats si vous avez la capacité dans votre cluster de replanifier immédiatement vos charges de travail vers d'autres nœuds. Utilisez les budgets d'interruption de pod dans les situations où une disponibilité constante doit être garantie. Ils vous permettent de vous prémunir contre les temps d'arrêt involontaires lorsque plusieurs vidanges sont lancées simultanément.

LIRE LA SUITE

  • › Devriez-vous augmenter la puissance de transmission de votre routeur Wi-Fi ?
  • › Test de la tablette Amazon Fire 7 (2022) : faible mais bon marché
  • › 10 nouvelles fonctionnalités de Windows 11 que vous devriez utiliser
  • › Un aimant peut-il vraiment endommager mon téléphone ou mon ordinateur ?
  • › 10 fonctionnalités YouTube que vous devriez utiliser
  • &rsaquo ; Pourquoi voulez-vous un Wi-Fi maillé, même si vous n'avez besoin que d'un seul routeur