For AI agents: the complete documentation index is available at https://docs.ovhcloud.com/fr/llms.txt, the full documentation bundle is available at https://docs.ovhcloud.com/fr/llms-full.txt, and this page is available as Markdown at https://docs.ovhcloud.com/fr/guides/public-cloud/containers-orchestration/managed-kubernetes/taint-drain-node-pools.md.

Appliquer taint, cordon et drain sur des nœuds et des pools de nœuds

Voir en Markdown

Découvrez comment effectuer des opérations sur des nœuds et des pools de nœuds spécifiques, comme taint, drain et cordon, sur OVHcloud Managed Kubernetes

Objectif

Un précédent guide vous a montré comment déployer vos applications sur des Nodes et des Nodes Pools spécifiques, à l'aide des concepts Kubernetes labels et NodeAffinity. Ce nouveau tutoriel vous montre comment effectuer des opérations courantes sur les Nodes et les Nodes Pools, telles que taint, cordon et drain, sur votre service OVHcloud Managed Kubernetes.

Grâce à la propagation des labels du pool de nœuds vers les nœuds, vous allez :

  • créer un cluster Managed Kubernetes
  • créer un pool de nœuds
  • créer un second pool de nœuds, avec une configuration différente et l'autoscaling activé
  • appliquer un taint à un nœud
  • appliquer un cordon à un nœud
  • appliquer un drain à un nœud

Pourquoi ?

Un nœud est une machine virtuelle (VM) ou physique.

Vos applications et vos workloads s'exécutent dans des Pods, et les Pods s'exécutent sur des nœuds.

Mais dans certains cas, l'ordonnanceur Kubernetes ne peut pas déployer un Pod sur un nœud, pour plusieurs raisons :

  • le nœud n'est pas prêt
  • le nœud est injoignable
  • l'espace disque est insuffisant
  • le réseau n'est pas disponible

Pour ces cas d'usage, ainsi que pour d'autres, vous pouvez effectuer des opérations sur les nœuds. Et grâce à la propagation des labels du pool de nœuds vers les nœuds, vous pouvez cibler uniquement les nœuds appartenant à un pool de nœuds donné.

Prérequis


Accès à l'espace client OVHcloud

  • Lien direct :
  • Pour accéder à vos services : Public Cloud > Sélectionnez votre projet

En pratique

Création du cluster

Suivez le guide pas à pas « Création d'un cluster ».

Création du second pool de nœuds

Votre cluster Kubernetes est maintenant opérationnel. Vous pouvez le consulter dans votre espace client OVHcloud.

Sélectionner votre cluster

Cliquez sur votre cluster, puis sur l'onglet Pools de nœuds.

Vous allez créer votre second pool de nœuds. Cliquez sur le bouton Ajouter un pool de nœuds.

Saisissez ensuite un nom pour votre second pool de nœuds, par exemple second-node-pool.

Nommer votre second pool de nœuds

Sélectionnez une flavor pour votre nouveau pool de nœuds : choisissez par exemple « D2-8 », une flavor différente de celle de votre autre pool de nœuds.

Sélectionner une flavor pour votre second pool de nœuds

À l'étape suivante, définissez la taille de votre second pool de nœuds. Vous pouvez cette fois activer la fonctionnalité Autoscaling. Définissez alors la taille minimale et maximale du pool, par exemple 3 au minimum et 10 au maximum.

Info

En activant l'anti-affinité, les nœuds actuels et futurs seront lancés sur des hyperviseurs (serveurs physiques) différents, ce qui garantit une meilleure tolérance aux pannes.

Définir une taille et l'autoscaling pour votre second pool de nœuds

Choisissez le mode de facturation Hourly pour ce second pool de nœuds.

Mode de facturation

La création du pool de nœuds est maintenant en cours. Il devrait être disponible dans votre espace client OVHcloud d'ici quelques minutes.

Le second pool de nœuds sera d'abord au statut Installing. Attendez que son statut passe à OK.

Statut Installing Statut OK

Vérifier que tout est correctement configuré

Pour effectuer des opérations sur vos nœuds via la CLI kubectl, nous vous invitons à suivre notre guide « Configuration des paramètres par défaut ».

Une fois que vous pouvez accéder au cluster via la commande kubectl, affichez vos pools de nœuds :

$ kubectl get nodepool
NAME                                            FLAVOR   AUTO SCALED   MONTHLY BILLED   ANTI AFFINITY   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   MIN   MAX   AGE
nodepool-9680a2e9-3e58-48c7-b447-69f5a05c1828   b2-7     false         false            false           3         3         3            3           0     100   2d
second-node-pool                                d2-8     true          false            false           3         3         3            3           3     10    5m19s

Nos deux pools de nœuds existent et nous pouvons constater la différence de configuration et de mode d'autoscaling.

Affichez maintenant vos nœuds. Vous devriez avoir 3 nœuds en cours d'exécution dans votre premier pool de nœuds et 3 nœuds dans le pool de nœuds « second-node-pool » :

$ kubectl get nodes
NAME                                         STATUS   ROLES    AGE     VERSION
nodepool-9680a2e9-3e58-48c7-b4-node-874105   Ready    <none>   2d      v1.34.0
nodepool-9680a2e9-3e58-48c7-b4-node-b5c9e2   Ready    <none>   2d      v1.34.0
nodepool-9680a2e9-3e58-48c7-b4-node-c65648   Ready    <none>   2d      v1.34.0
second-node-pool-node-519613                 Ready    <none>   3m30s   v1.34.0
second-node-pool-node-5fda8f                 Ready    <none>   3m28s   v1.34.0
second-node-pool-node-c355db                 Ready    <none>   3m35s   v1.34.0

Appliquer un cordon à un nœud

Appliquer un cordon à un nœud consiste à le rendre non ordonnançable. Ce nœud ne peut donc plus accueillir de pods tant qu'il est marqué comme Unschedulable.

Appliquer un cordon à un nœud

Plutôt que d'appliquer un cordon à chaque nœud manuellement :

kubectl cordon my-node

vous pouvez appliquer un cordon à tous les nœuds d'un pool de nœuds. Voici comment appliquer un cordon à tous les nœuds de second-node-pool, par exemple, grâce au label.

kubectl cordon -l "nodepool=second-node-pool"

Dans notre exemple, voici le résultat obtenu :

$ kubectl cordon -l "nodepool=second-node-pool"

node/second-node-pool-node-519613 cordoned
node/second-node-pool-node-5fda8f cordoned
node/second-node-pool-node-c355db cordoned

$ kubectl get nodes
NAME                                         STATUS                     ROLES    AGE     VERSION
nodepool-9680a2e9-3e58-48c7-b4-node-874105   Ready                      <none>   2d      v1.34.0
nodepool-9680a2e9-3e58-48c7-b4-node-b5c9e2   Ready                      <none>   2d      v1.34.0
nodepool-9680a2e9-3e58-48c7-b4-node-c65648   Ready                      <none>   2d      v1.34.0
second-node-pool-node-519613                 Ready,SchedulingDisabled   <none>   4m23s   v1.34.0
second-node-pool-node-5fda8f                 Ready,SchedulingDisabled   <none>   4m21s   v1.34.0
second-node-pool-node-c355db                 Ready,SchedulingDisabled   <none>   4m28s   v1.34.0

Tous les nœuds de second-node-pool sont désormais marqués comme Unschedulable. Vous ne pouvez donc plus déployer de Pods sur ces nœuds, ni sur ce pool de nœuds.

Retirer le cordon d'un nœud

Vous pouvez également annuler votre action avec la commande uncordon.

kubectl uncordon -l "nodepool=second-node-pool"

Dans notre exemple :

$ kubectl uncordon -l "nodepool=second-node-pool"

node/second-node-pool-node-519613 uncordoned
node/second-node-pool-node-5fda8f uncordoned
node/second-node-pool-node-c355db uncordoned

$ kubectl get nodes
NAME                                         STATUS   ROLES    AGE     VERSION
nodepool-9680a2e9-3e58-48c7-b4-node-874105   Ready    <none>   2d      v1.34.0
nodepool-9680a2e9-3e58-48c7-b4-node-b5c9e2   Ready    <none>   2d      v1.34.0
nodepool-9680a2e9-3e58-48c7-b4-node-c65648   Ready    <none>   2d      v1.34.0
second-node-pool-node-519613                 Ready    <none>   4m53s   v1.34.0
second-node-pool-node-5fda8f                 Ready    <none>   4m51s   v1.34.0
second-node-pool-node-c355db                 Ready    <none>   4m58s   v1.34.0

Les nœuds sont de nouveau à l'état Ready.

Appliquer un drain à un nœud

Vous pouvez utiliser la commande kubectl drain pour évincer en toute sécurité tous vos pods d'un nœud avant d'effectuer une opération de maintenance sur celui-ci ou de réduire le nombre de nœuds, par exemple. Les évictions sécurisées permettent aux conteneurs du pod de s'arrêter proprement et respectent les PodDisruptionBudgets que vous avez définis (le cas échéant).

Un PDB limite le nombre de pods d'une application répliquée qui sont arrêtés simultanément suite à des perturbations volontaires, ce qui permet une meilleure disponibilité tout en laissant l'administrateur du cluster gérer les nœuds de ses clusters. Si ce sujet vous intéresse, nous vous recommandons la lecture de la documentation officielle Kubernetes : Specifying a Disruption Budget for your Application.

Appliquer un drain à un nœud

Vous pouvez appliquer un drain à tous les nœuds de second-node-pool grâce au label.

kubectl drain -l "nodepool=second-node-pool"

Dans notre exemple :

$ kubectl drain -l "nodepool=second-node-pool"

node/second-node-pool-node-519613 cordoned
node/second-node-pool-node-5fda8f cordoned
node/second-node-pool-node-c355db cordoned

There are pending nodes to be drained:
 second-node-pool-node-519613
 second-node-pool-node-5fda8f
 second-node-pool-node-c355db
error: cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore): kube-system/canal-kpwzv, kube-system/kube-proxy-7886r, kube-system/wormhole-972p5

$ kubectl get nodes
NAME                                         STATUS                     ROLES    AGE     VERSION
nodepool-9680a2e9-3e58-48c7-b4-node-874105   Ready                      <none>   2d      v1.34.0
nodepool-9680a2e9-3e58-48c7-b4-node-b5c9e2   Ready                      <none>   2d      v1.34.0
nodepool-9680a2e9-3e58-48c7-b4-node-c65648   Ready                      <none>   2d      v1.34.0
second-node-pool-node-519613                 Ready,SchedulingDisabled   <none>   5m37s   v1.34.0
second-node-pool-node-5fda8f                 Ready,SchedulingDisabled   <none>   5m35s   v1.34.0
second-node-pool-node-c355db                 Ready,SchedulingDisabled   <none>   5m42s   v1.34.0

Comme vous pouvez le constater, Kubernetes ne peut pas supprimer les objets DaemonSet. Pour éviter ce message d'erreur, vous pouvez ajouter l'option --ignore-daemonsets :

kubectl drain -l "nodepool=second-node-pool" --ignore-daemonsets

Comme le montre la sortie console, appliquer un drain à un nœud lui applique également un cordon. Vous pouvez alors effectuer toutes les opérations souhaitées sur les nœuds, en étant certain qu'ils n'exécutent aucun workload. N'oubliez pas de retirer le cordon des nœuds du pool de nœuds, afin de permettre à nouveau l'exécution des workloads :

kubectl uncordon -l "nodepool=second-node-pool"

Les nœuds sont de nouveau à l'état Ready.

$ kubectl uncordon -l "nodepool=second-node-pool"

node/second-node-pool-node-519613 uncordoned
node/second-node-pool-node-5fda8f uncordoned
node/second-node-pool-node-c355db uncordoned

$ kubectl get nodes
NAME                                         STATUS   ROLES    AGE     VERSION
nodepool-9680a2e9-3e58-48c7-b4-node-874105   Ready    <none>   2d      v1.34.0
nodepool-9680a2e9-3e58-48c7-b4-node-b5c9e2   Ready    <none>   2d      v1.34.0
nodepool-9680a2e9-3e58-48c7-b4-node-c65648   Ready    <none>   2d      v1.34.0
second-node-pool-node-519613                 Ready    <none>   6m8s    v1.34.0
second-node-pool-node-5fda8f                 Ready    <none>   6m6s    v1.34.0
second-node-pool-node-c355db                 Ready    <none>   6m13s   v1.34.0

Appliquer un taint à un nœud

Les taints de nœud sont des paires key:value associées à un effet. Plusieurs taints peuvent être définis sur un même nœud.

Appliquer un taint à un nœud

  • Avec le taint NoSchedule, les pods qui ne tolèrent pas le taint ne peuvent pas être ordonnancés sur le nœud.
  • Avec le taint PreferNoSchedule, Kubernetes évite d'ordonnancer sur le nœud les Pods qui ne tolèrent pas le taint.
  • Avec le taint NoExecute, les Pods sont évincés du nœud s'ils y sont déjà en cours d'exécution, en plus de ne pas pouvoir y être ordonnancés.

Vous pouvez ajouter un taint sur tous les nœuds de second-node-pool grâce au label.

Pour mettre un nœud en pause et ne plus y accepter de nouveaux workloads :

kubectl taint node -l "nodepool=second-node-pool" my-key=my-value:NoSchedule

Vous pouvez afficher les taints de tous les nœuds :

kubectl get nodes  -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}{.spec.taints}{"\n"}{end}'

Dans notre exemple :

$ kubectl taint node -l "nodepool=second-node-pool" my-key=my-value:NoSchedule

node/second-node-pool-node-519613 tainted
node/second-node-pool-node-5fda8f tainted
node/second-node-pool-node-c355db tainted

$ kubectl get nodes  -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}{.spec.taints}{"\n"}{end}'
nodepool-9680a2e9-3e58-48c7-b4-node-874105
nodepool-9680a2e9-3e58-48c7-b4-node-b5c9e2
nodepool-9680a2e9-3e58-48c7-b4-node-c65648
second-node-pool-node-519613
[{"effect":"NoSchedule","key":"my-key","value":"my-value"}]
second-node-pool-node-5fda8f
[{"effect":"NoSchedule","key":"my-key","value":"my-value"}]
second-node-pool-node-c355db
[{"effect":"NoSchedule","key":"my-key","value":"my-value"}]

Vous pouvez ensuite réactiver un nœud :

kubectl taint node -l "nodepool=second-node-pool" my-key:NoSchedule-

Dans notre exemple :

$ kubectl taint node -l "nodepool=second-node-pool" my-key:NoSchedule-

node/second-node-pool-node-519613 untainted
node/second-node-pool-node-5fda8f untainted
node/second-node-pool-node-c355db untainted

Appliquer un taint à un nœud et créer un pod uniquement sur ces nœuds

Une autre fonctionnalité utile consiste à appliquer un taint à un nœud et à déployer une application uniquement sur certains nœuds. Vous pouvez par exemple réserver un ensemble de nœuds à l'usage exclusif d'un groupe d'utilisateurs donné, ou définir un sous-ensemble de nœuds dotés de matériel spécialisé.

Pour cela, vous pouvez appliquer aux nœuds de second-node-pool un taint avec une clé et une valeur particulières, par exemple flavor=d2-8 :

kubectl taint node -l "nodepool=second-node-pool" flavor=d2-8:NoSchedule

Dans notre exemple :

$ kubectl taint node -l "nodepool=second-node-pool" flavor=d2-8:NoSchedule
node/second-node-pool-node-519613 tainted
node/second-node-pool-node-5fda8f tainted
node/second-node-pool-node-c355db tainted

$ kubectl get nodes  -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}{.spec.taints}{"\n"}{end}'
nodepool-9680a2e9-3e58-48c7-b4-node-874105
nodepool-9680a2e9-3e58-48c7-b4-node-b5c9e2
nodepool-9680a2e9-3e58-48c7-b4-node-c65648
second-node-pool-node-519613
[{"effect":"NoSchedule","key":"flavor","value":"d2-8"}]
second-node-pool-node-5fda8f
[{"effect":"NoSchedule","key":"flavor","value":"d2-8"}]
second-node-pool-node-c355db
[{"effect":"NoSchedule","key":"flavor","value":"d2-8"}]

Vous pouvez ensuite créer un Pod qui ne pourra être ordonnancé que sur les nœuds portant le taint flavor=d2-8:NoSchedule.

Créez un fichier manifeste YAML my-pod.yaml avec le contenu suivant :

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: hello-world
    image: ovhplatform/hello
    ports:
    - containerPort: 80
  tolerations:
  - key: "flavor"
    value: "d2-8"
    effect: "NoSchedule"

Déployez-le ensuite :

kubectl apply -f my-pod.yaml

Puis vérifiez que votre nouveau Pod s'exécute bien sur un nœud de second-node-pool :

kubectl get pod -o wide

Dans notre exemple :

$ kubectl apply -f my-pod.yaml

pod/my-pod created

$ kubectl get pod -o wide
NAME     READY   STATUS    RESTARTS   AGE   IP         NODE                           NOMINATED NODE   READINESS GATES
my-pod   1/1     Running   0          6s    10.2.7.2   second-node-pool-node-519613   <none>           <none>

Grâce à l'option -o wide, vous pouvez vérifier que votre Pod s'exécute sur le nœud second-node-pool-node-519613.

Aller plus loin

Ce tutoriel vous a montré comment effectuer des opérations sur les nœuds — taint, drain, cordon, uncordon — et comment déployer des Pods sur des nœuds spécifiques de votre cluster OVHcloud Managed Kubernetes.

Pour en savoir plus sur l'utilisation pratique de votre cluster Kubernetes, nous vous invitons à consulter notre documentation OVHcloud Managed Kubernetes.

  • Si vous avez besoin d'une formation ou d'une assistance technique pour la mise en oeuvre de nos solutions, contactez votre commercial ou cliquez sur ce lien pour obtenir un devis et demander une analyse personnalisée de votre projet à nos experts de l’équipe Professional Services.

  • Échangez avec notre communauté d'utilisateurs.

Cette page vous a-t-elle aidé ?