Noeuds
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 siregister-nodeest Ă 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.