Noeuds

Concept Noeud Kubernetes

Un nƓud est une machine de travail dans Kubernetes, connue auparavant sous le nom de minion. Un nƓud peut ĂȘtre une machine virtuelle ou une machine physique, selon le cluster. Chaque nƓud contient les services nĂ©cessaires Ă  l'exĂ©cution de pods et est gĂ©rĂ© par les composants du master. Les services sur un nƓud incluent le container runtime, kubelet et kube-proxy. Consultez la section Le NƓud Kubernetes dans le document de conception de l'architecture pour plus de dĂ©tails.

Statut du nƓud

Le statut d'un nƓud contient les informations suivantes:

Chaque section est décrite en détail ci-dessous.

Adresses

L'utilisation de ces champs varie en fonction de votre fournisseur de cloud ou de votre configuration physique.

  • HostName: Le nom d'hĂŽte tel que rapportĂ© par le noyau du nƓud. Peut ĂȘtre remplacĂ© via le paramĂštre kubelet --hostname-override.
  • ExternalIP: En rĂšgle gĂ©nĂ©rale, l'adresse IP du nƓud pouvant ĂȘtre routĂ© en externe (disponible de l'extĂ©rieur du cluster).
  • InternalIP: En rĂšgle gĂ©nĂ©rale, l'adresse IP du nƓud pouvant ĂȘtre routĂ© uniquement dans le cluster.

Condition

Le champ conditions dĂ©crit le statut de tous les nƓuds Running.

Node Condition Description
OutOfDisk True si l'espace disponible sur le nƓud est insuffisant pour l'ajout de nouveaux pods, sinon False
Ready True si le noeud est sain et prĂȘt Ă  accepter des pods, False si le noeud n'est pas sain et n'accepte pas de pods, et Unknown si le contrĂŽleur de noeud n'a pas reçu d'information du noeud depuis node-monitor-grace-period (la valeur par dĂ©faut est de 40 secondes)
MemoryPressure True s'il existe une pression sur la mémoire du noeud, c'est-à-dire si la mémoire du noeud est faible; autrement False
PIDPressure True s'il existe une pression sur le nombre de processus, c'est-à-dire s'il y a trop de processus sur le nƓud; autrement False
DiskPressure True s'il existe une pression sur la taille du disque, c'est-à-dire si la capacité du disque est faible; autrement False
NetworkUnavailable True si le réseau pour le noeud n'est pas correctement configuré, sinon False

La condition de noeud est reprĂ©sentĂ©e sous la forme d'un objet JSON. Par exemple, la rĂ©ponse suivante dĂ©crit un nƓud sain.

"conditions": [
  {
    "type": "Ready",
    "status": "True"
  }
]

Si le statut de l'Ă©tat Ready reste Unknown ou False plus longtemps que pod-eviction-timeout, un argument est passĂ© au kube-controller-manager et les pods sur le nƓud sont programmĂ©s pour ĂȘtre supprimĂ©s par le contrĂŽleur du nƓud. Le dĂ©lai d’expulsion par dĂ©faut est de cinq minutes.. Dans certains cas, lorsque le nƓud est inaccessible, l'apiserver est incapable de communiquer avec le kubelet sur le nƓud. La dĂ©cision de supprimer les pods ne peut pas ĂȘtre communiquĂ©e au kublet tant que la communication avec l'apiserver n'est pas rĂ©tablie. Entre-temps, les pods dont la suppression est planifiĂ©e peuvent continuer Ă  s'exĂ©cuter sur le nƓud inaccessible.

Dans les versions de Kubernetes antĂ©rieures Ă  1.5, le contrĂŽleur de noeud forcait la suppression de ces pods inaccessibles de l'apiserver. Toutefois, dans la version 1.5 et ultĂ©rieure, le contrĂŽleur de noeud ne force pas la suppression des pods tant qu'il n'est pas confirmĂ© qu'ils ont cessĂ© de fonctionner dans le cluster. Vous pouvez voir que les pods en cours d'exĂ©cution sur un nƓud inaccessible sont dans l'Ă©tat Terminating ou Unknown. Dans les cas oĂč Kubernetes ne peut pas dĂ©duire de l'infrastructure sous-jacente si un nƓud a dĂ©finitivement quittĂ© un cluster, l'administrateur du cluster peut avoir besoin de supprimer l'objet nƓud Ă  la main. La suppression de l'objet nƓud de Kubernetes entraĂźne la suppression de tous les objets Pod exĂ©cutĂ©s sur le nƓud de l'apiserver et libĂšre leurs noms.

Dans la version 1.12, la fonctionnalitĂ© TaintNodesByCondition est promue en version bĂȘta, ce qui permet au contrĂŽleur de cycle de vie du nƓud de crĂ©er automatiquement des marquages (taints en anglais) qui reprĂ©sentent des conditions. De mĂȘme, l'ordonnanceur ignore les conditions lors de la prise en compte d'un nƓud; au lieu de cela, il regarde les taints du nƓud et les tolĂ©rances d'un pod.

Les utilisateurs peuvent dĂ©sormais choisir entre l'ancien modĂšle de planification et un nouveau modĂšle de planification plus flexible. Un pod qui n’a aucune tolĂ©rance est programmĂ© selon l’ancien modĂšle. Mais un pod qui tolĂšre les taints d'un nƓud particulier peut ĂȘtre programmĂ© sur ce nƓud.

Capacité

DĂ©crit les ressources disponibles sur le nƓud: CPU, mĂ©moire et nombre maximal de pods pouvant ĂȘtre planifiĂ©s sur le nƓud.

Info

Informations générales sur le noeud, telles que la version du noyau, la version de Kubernetes (versions de kubelet et kube-proxy), la version de Docker (si utilisée), le nom du systÚme d'exploitation. Les informations sont collectées par Kubelet à partir du noeud.

Gestion

Contrairement aux pods et aux [services] (/docs/concepts/services-networking/service/), un nƓud n'est pas créé de maniĂšre inhĂ©rente par Kubernetes: il est créé de maniĂšre externe par un cloud tel que Google Compute Engine, ou bien il existe dans votre pool de machines physiques ou virtuelles. Ainsi, lorsque Kubernetes crĂ©e un nƓud, il crĂ©e un objet qui reprĂ©sente le nƓud. AprĂšs la crĂ©ation, Kubernetes vĂ©rifie si le nƓud est valide ou non. Par exemple, si vous essayez de crĂ©er un nƓud Ă  partir du contenu suivant:

{
  "kind": "Node",
  "apiVersion": "v1",
  "metadata": {
    "name": "10.240.79.157",
    "labels": {
      "name": "my-first-k8s-node"
    }
  }
}

Kubernetes crĂ©e un objet noeud en interne (la reprĂ©sentation) et valide le noeud en vĂ©rifiant son intĂ©gritĂ© en fonction du champ metadata.name. Si le nƓud est valide, c'est-Ă -dire si tous les services nĂ©cessaires sont en cours d'exĂ©cution, il est Ă©ligible pour exĂ©cuter un pod. Sinon, il est ignorĂ© pour toute activitĂ© de cluster jusqu'Ă  ce qu'il devienne valide.

Actuellement, trois composants interagissent avec l'interface de noeud Kubernetes: le contrĂŽleur de noeud, kubelet et kubectl.

Contrîleur de nƓud

Le contrĂŽleur de noeud (node controller en anglais) est un composant du master Kubernetes qui gĂšre divers aspects des noeuds.

Le contrĂŽleur de nƓud a plusieurs rĂŽles dans la vie d'un nƓud. La premiĂšre consiste Ă  affecter un bloc CIDR au nƓud lorsqu’il est enregistrĂ© (si l’affectation CIDR est activĂ©e).

La seconde consiste Ă  tenir Ă  jour la liste interne des nƓuds du contrĂŽleur de nƓud avec la liste des machines disponibles du fournisseur de cloud. Lorsqu'il s'exĂ©cute dans un environnement de cloud, chaque fois qu'un nƓud est en mauvaise santĂ©, le contrĂŽleur de nƓud demande au fournisseur de cloud si la machine virtuelle de ce nƓud est toujours disponible. Sinon, le contrĂŽleur de nƓud supprime le nƓud de sa liste de nƓuds.

La troisiĂšme est la surveillance de la santĂ© des nƓuds. Le contrĂŽleur de noeud est responsable de la mise Ă  jour de la condition NodeReady de NodeStatus vers ConditionUnknown lorsqu'un noeud devient inaccessible (le contrĂŽleur de noeud cesse de recevoir des heartbeats pour une raison quelconque, par exemple en raison d'une panne du noeud), puis de l'Ă©viction ultĂ©rieure de tous les pods du noeud. (en utilisant une terminaison propre) si le nƓud continue d’ĂȘtre inaccessible. (Les dĂ©lais d'attente par dĂ©faut sont de 40 secondes pour commencer Ă  signaler ConditionUnknown et de 5 minutes aprĂšs cela pour commencer Ă  expulser les pods.)

Le contrĂŽleur de nƓud vĂ©rifie l'Ă©tat de chaque nƓud toutes les --node-monitor-period secondes.

Dans les versions de Kubernetes antĂ©rieures Ă  1.13, NodeStatus correspond au heartbeat du nƓud. À partir de Kubernetes 1.13, la fonctionnalitĂ© de bail de nƓud (node lease en anglais) est introduite en tant que fonctionnalitĂ© alpha (feature gate NodeLease, KEP-0009). Lorsque la fonction de node lease est activĂ©e, chaque noeud a un objet Lease associĂ© dans le namespace kube-node-lease qui est renouvelĂ© pĂ©riodiquement par le noeud, et NodeStatus et le node lease sont traitĂ©s comme des heartbeat du noeud. Les node leases sont renouvelĂ©s frĂ©quemment lorsque NodeStatus est signalĂ© de nƓud Ă  master uniquement lorsque des modifications ont Ă©tĂ© apportĂ©es ou que suffisamment de temps s'est Ă©coulĂ© (la valeur par dĂ©faut est 1 minute, ce qui est plus long que le dĂ©lai par dĂ©faut de 40 secondes pour les nƓuds inaccessibles). Étant donnĂ© qu'un node lease est beaucoup plus lĂ©ger qu'un NodeStatus, cette fonctionnalitĂ© rends le heartbeat d'un nƓud nettement moins coĂ»teux, tant du point de vue de l'Ă©volutivitĂ© que des performances.

Dans Kubernetes 1.4, nous avons mis Ă  jour la logique du contrĂŽleur de noeud afin de mieux gĂ©rer les cas oĂč un grand nombre de noeuds rencontrent des difficultĂ©s pour atteindre le master (par exemple parce que le master a un problĂšme de rĂ©seau). À partir de la version 1.4, le contrĂŽleur de noeud examine l’état de tous les noeuds du cluster lorsqu’il prend une dĂ©cision concernant l’éviction des pods.

Dans la plupart des cas, le contrĂŽleur de noeud limite le taux d’expulsion Ă  --node-eviction-rate (0,1 par dĂ©faut) par seconde, ce qui signifie qu’il n’expulsera pas les pods de plus d’un nƓud toutes les 10 secondes.

Le comportement d'Ă©viction de noeud change lorsqu'un noeud d'une zone de disponibilitĂ© donnĂ©e devient dĂ©faillant. Le contrĂŽleur de nƓud vĂ©rifie quel pourcentage de nƓuds de la zone est dĂ©faillant (la condition NodeReady est ConditionUnknown ou ConditionFalse) en mĂȘme temps. Si la fraction de nƓuds dĂ©faillant est au moins --unhealthy-zone-threshold (valeur par dĂ©faut de 0,55), le taux d'expulsion est rĂ©duit: si le cluster est petit (c'est-Ă -dire infĂ©rieur ou Ă©gal Ă  --large-cluster-size-threshold noeuds - valeur par dĂ©faut 50) puis les expulsions sont arrĂȘtĂ©es, sinon le taux d'expulsion est rĂ©duit Ă  --secondary-node-eviction-rate (valeur par dĂ©faut de 0,01) par seconde.

Ces stratĂ©gies sont implĂ©mentĂ©es par zone de disponibilitĂ© car une zone de disponibilitĂ© peut ĂȘtre partitionnĂ©e Ă  partir du master, tandis que les autres restent connectĂ©es. Si votre cluster ne s'Ă©tend pas sur plusieurs zones de disponibilitĂ© de fournisseur de cloud, il n'existe qu'une seule zone de disponibilitĂ© (la totalitĂ© du cluster).

L'une des principales raisons de la rĂ©partition de vos nƓuds entre les zones de disponibilitĂ© est de pouvoir dĂ©placer la charge de travail vers des zones saines lorsqu'une zone entiĂšre tombe en panne. Par consĂ©quent, si tous les nƓuds d’une zone sont dĂ©faillants, le contrĂŽleur de nƓud expulse Ă  la vitesse normale --node-eviction-rate. Le cas pathologique se produit lorsque toutes les zones sont complĂštement dĂ©faillantes (c'est-Ă -dire qu'il n'y a pas de nƓuds sains dans le cluster). Dans ce cas, le contrĂŽleur de noeud suppose qu'il existe un problĂšme de connectivitĂ© au master et arrĂȘte toutes les expulsions jusqu'Ă  ce que la connectivitĂ© soit restaurĂ©e.

À partir de Kubernetes 1.6, NodeController est Ă©galement responsable de l'expulsion des pods s'exĂ©cutant sur des noeuds avec des marques NoExecute, lorsque les pods ne tolĂšrent pas ces marques. De plus, en tant que fonctionnalitĂ© alpha dĂ©sactivĂ©e par dĂ©faut, NodeController est responsable de l'ajout de marques correspondant aux problĂšmes de noeud tels que les noeuds inaccessibles ou non prĂȘts. Voir cette documentation pour plus de dĂ©tails sur les marques NoExecute et cette fonctionnalitĂ© alpha.

À partir de la version 1.8, le contrĂŽleur de noeud peut ĂȘtre chargĂ© de crĂ©er des tĂąches reprĂ©sentant les conditions de noeud. Ceci est une fonctionnalitĂ© alpha de la version 1.8.

Auto-enregistrement des nƓuds

Lorsque l'indicateur de kubelet --register-node est à true (valeur par défaut), le kubelet tente de s'enregistrer auprÚs du serveur d'API. C'est le modÚle préféré, utilisé par la plupart des distributions Linux.

Pour l'auto-enregistrement (self-registration en anglais), le kubelet est lancé avec les options suivantes:

  • --kubeconfig - Chemin d'accĂšs aux informations d'identification pour s'authentifier auprĂšs de l'apiserver.
  • --cloud-provider - Comment lire les mĂ©tadonnĂ©es d'un fournisseur de cloud sur lui-mĂȘme.
  • --register-node - Enregistrement automatique avec le serveur API.
  • --register-with-taints - Enregistrez le noeud avec la liste donnĂ©e de marques (sĂ©parĂ©s par des virgules <key>=<value>:<effect>). Sans effet si register-node est Ă  false.
  • --node-ip - Adresse IP du noeud.
  • --node-labels - Labels Ă  ajouter lors de l’enregistrement du noeud dans le cluster (voir Restrictions des labels appliquĂ©es par le plugin NodeRestriction admission dans les versions 1.13+).
  • --node-status-update-frequency - SpĂ©cifie la frĂ©quence Ă  laquelle kubelet publie le statut de nƓud sur master.

Quand le mode autorisation de nƓud et plugin NodeRestriction admission sont activĂ©s, les kubelets sont uniquement autorisĂ©s Ă  crĂ©er / modifier leur propre ressource de noeud.

Administration manuelle de noeuds

Un administrateur de cluster peut crĂ©er et modifier des objets de nƓud.

Si l'administrateur souhaite créer des objets de noeud manuellement, définissez l'argument de kubelet: --register-node=false.

L'administrateur peut modifier les ressources du nƓud (quel que soit le rĂ©glage de --register-node). Les modifications comprennent la dĂ©finition de labels sur le nƓud et son marquage comme non programmable.

Les Ă©tiquettes sur les nƓuds peuvent ĂȘtre utilisĂ©es avec les sĂ©lecteurs de nƓuds sur les pods pour contrĂŽler la planification. Par exemple, pour contraindre un pod Ă  ne pouvoir s'exĂ©cuter que sur un sous-ensemble de nƓuds.

Marquer un nƓud comme non planifiable empĂȘche la planification de nouveaux pods sur ce nƓud, mais n'affecte pas les pods existants sur le nƓud. Ceci est utile comme Ă©tape prĂ©paratoire avant le redĂ©marrage d'un nƓud, etc. Par exemple, pour marquer un nƓud comme non programmable, exĂ©cutez la commande suivante:

kubectl cordon $NODENAME

CapacitĂ© de nƓud

La capacitĂ© du nƓud (nombre de CPU et quantitĂ© de mĂ©moire) fait partie de l’objet Node. Normalement, les nƓuds s'enregistrent et indiquent leur capacitĂ© lors de la crĂ©ation de l'objet Node. Si vous faites une administration manuelle de nƓud, alors vous devez dĂ©finir la capacitĂ© du nƓud lors de l'ajout d'un nƓud.

Le scheduler Kubernetes veille Ă  ce qu'il y ait suffisamment de ressources pour tous les pods d'un noeud. Il vĂ©rifie que la somme des demandes des conteneurs sur le nƓud n'est pas supĂ©rieure Ă  la capacitĂ© du nƓud. Cela inclut tous les conteneurs lancĂ©s par le kubelet, mais pas les conteneurs lancĂ©s directement par le conteneur runtime, ni aucun processus exĂ©cutĂ© en dehors des conteneurs.

Si vous souhaitez réserver explicitement des ressources pour des processus autres que Pod, suivez ce tutoriel pour: réserver des ressources pour les démons systÚme.

API Object

L'objet Node est une ressource de niveau supĂ©rieur dans l'API REST de Kubernetes. Plus de dĂ©tails sur l'objet API peuvent ĂȘtre trouvĂ©s Ă  l'adresse suivante: Node API object.

DerniĂšre modification September 25, 2021 at 4:19 PM PST : Update nodes.md (24f5f7251)