Chapitre 8. Nœuds de télétravailleurs à la périphérie du réseau
8.1. Utilisation de nœuds de télétravail à la périphérie du réseau
Vous pouvez configurer les clusters OpenShift Container Platform avec des nœuds situés à la périphérie de votre réseau. Dans cette rubrique, ils sont appelés remote worker nodes. Un cluster typique avec des nœuds de travail à distance combine des nœuds maîtres et des nœuds de travail sur site avec des nœuds de travail dans d'autres endroits qui se connectent au cluster. Cette rubrique vise à fournir des conseils sur les meilleures pratiques d'utilisation des nœuds de télétravail et ne contient pas de détails de configuration spécifiques.
Il existe de multiples cas d'utilisation dans différents secteurs, tels que les télécommunications, la vente au détail, la fabrication et le gouvernement, pour utiliser un modèle de déploiement avec des nœuds de travailleurs distants. Par exemple, vous pouvez séparer et isoler vos projets et charges de travail en combinant les nœuds de travailleurs distants dans des zones Kubernetes.
Cependant, l'existence de nœuds de travail distants peut entraîner une latence plus élevée, une perte intermittente de connectivité réseau et d'autres problèmes. Les défis d'un cluster avec des nœuds de travail distants sont notamment les suivants :
- Network separation: Le plan de contrôle d'OpenShift Container Platform et les nœuds de télétravail doivent pouvoir communiquer entre eux. En raison de la distance entre le plan de contrôle et les nœuds de télétravail, des problèmes de réseau peuvent empêcher cette communication. Voir Séparation du réseau avec les nœuds de télétravail pour plus d'informations sur la façon dont OpenShift Container Platform réagit à la séparation du réseau et sur les méthodes permettant de réduire l'impact sur votre cluster.
- Power outage: Étant donné que le plan de contrôle et les nœuds de télétravail se trouvent dans des endroits distincts, une panne de courant à l'emplacement distant ou à n'importe quel point entre les deux peut avoir un impact négatif sur votre cluster. Voir Power loss on remote worker nodes pour des informations sur la façon dont OpenShift Container Platform réagit à une perte d'alimentation d'un nœud et pour des méthodes permettant de diminuer l'impact sur votre cluster.
- Latency spikes or temporary reduction in throughput: Comme pour tout réseau, tout changement dans les conditions du réseau entre votre cluster et les nœuds de travail distants peut avoir un impact négatif sur votre cluster. OpenShift Container Platform offre plusieurs worker latency profiles qui vous permettent de contrôler la réaction du cluster aux problèmes de latence.
Notez les limitations suivantes lors de la planification d'une grappe avec des nœuds de travail distants :
- OpenShift Container Platform ne prend pas en charge les nœuds de travail à distance qui utilisent un fournisseur de cloud différent de celui utilisé par le cluster sur site.
- Le déplacement des charges de travail d'une zone Kubernetes vers une autre zone Kubernetes peut être problématique en raison de problèmes liés au système et à l'environnement, comme un type de mémoire spécifique qui n'est pas disponible dans une autre zone.
- Les proxys et les pare-feux peuvent présenter des limitations supplémentaires qui dépassent le cadre de ce document. Voir la documentation pertinente de OpenShift Container Platform pour savoir comment traiter ces limitations, comme par exemple Configurer votre pare-feu.
- Vous êtes responsable de la configuration et du maintien de la connectivité réseau de niveau L2/L3 entre le plan de contrôle et les nœuds de bordure du réseau.
8.1.1. Séparation des réseaux avec des nœuds de travail à distance
Tous les nœuds envoient des battements de cœur à l'opérateur du gestionnaire de contrôleur Kubernetes (kube controller) dans le cluster OpenShift Container Platform toutes les 10 secondes. Si le cluster ne reçoit pas de battements de cœur d'un nœud, OpenShift Container Platform répond à l'aide de plusieurs mécanismes par défaut.
OpenShift Container Platform est conçue pour résister aux partitions de réseau et autres perturbations. Vous pouvez atténuer certaines des perturbations les plus courantes, telles que les interruptions dues à des mises à jour logicielles, des divisions de réseau et des problèmes de routage. Les stratégies d'atténuation consistent notamment à s'assurer que les pods sur les nœuds de travail distants demandent la quantité correcte de ressources CPU et mémoire, à configurer une politique de réplication appropriée, à utiliser la redondance entre les zones et à utiliser des budgets de perturbation des pods sur les charges de travail.
Si le contrôleur kube perd le contact avec un nœud après une période configurée, le contrôleur de nœud sur le plan de contrôle met à jour l'état du nœud à Unhealthy
et marque l'état du nœud Ready
comme Unknown
. En réponse, le planificateur arrête de planifier des pods pour ce nœud. Le contrôleur de nœuds sur site ajoute une erreur node.kubernetes.io/unreachable
avec un effet NoExecute
au nœud et planifie l'éviction des pods sur le nœud après cinq minutes, par défaut.
Si un contrôleur de charge de travail, tel qu'un objet Deployment
ou StatefulSet
, dirige le trafic vers des pods sur le nœud malsain et que d'autres nœuds peuvent atteindre le cluster, OpenShift Container Platform achemine le trafic loin des pods sur le nœud. Les nœuds qui ne peuvent pas atteindre le cluster ne sont pas mis à jour avec le nouveau routage du trafic. Par conséquent, les charges de travail sur ces nœuds peuvent continuer à essayer d'atteindre le nœud malsain.
Vous pouvez atténuer les effets de la perte de connexion en procédant comme suit :
- l'utilisation d'ensembles de démons pour créer des pods qui tolèrent les taches
- utiliser des pods statiques qui redémarrent automatiquement si un nœud tombe en panne
- utiliser les zones Kubernetes pour contrôler l'éviction des pods
- configurer les tolérances des pods pour retarder ou éviter l'éviction des pods
- configurer le kubelet pour contrôler le moment où il marque les nœuds comme étant malsains.
Pour plus d'informations sur l'utilisation de ces objets dans un cluster avec des nœuds de télétravail, voir À propos des stratégies de nœuds de télétravail.
8.1.2. Perte de puissance sur les nœuds des travailleurs distants
Si un nœud de télétravail perd de l'énergie ou redémarre de façon anarchique, OpenShift Container Platform réagit à l'aide de plusieurs mécanismes par défaut.
Si l'opérateur du gestionnaire de contrôleur Kubernetes (contrôleur kube) perd le contact avec un nœud après une période configurée, le plan de contrôle met à jour la santé du nœud à Unhealthy
et marque l'état du nœud Ready
comme Unknown
. En réponse, le planificateur arrête de planifier des pods sur ce nœud. Le contrôleur de nœuds sur site ajoute une tare node.kubernetes.io/unreachable
avec un effet NoExecute
au nœud et planifie l'éviction des pods sur le nœud au bout de cinq minutes, par défaut.
Sur le nœud, les pods doivent être redémarrés lorsque le nœud est remis sous tension et reconnecté au plan de contrôle.
Si vous souhaitez que les pods redémarrent immédiatement, utilisez des pods statiques.
Après le redémarrage du nœud, le kubelet redémarre également et tente de redémarrer les pods qui ont été planifiés sur le nœud. Si la connexion au plan de contrôle prend plus de temps que les cinq minutes par défaut, le plan de contrôle ne peut pas mettre à jour l'état du nœud et supprimer l'erreur node.kubernetes.io/unreachable
. Sur le nœud, le kubelet met fin à tous les pods en cours d'exécution. Lorsque ces conditions sont levées, le planificateur peut commencer à planifier des pods sur ce nœud.
Vous pouvez atténuer les effets de la perte de puissance en :
- l'utilisation d'ensembles de démons pour créer des pods qui tolèrent les taches
- utiliser des pods statiques qui redémarrent automatiquement avec un nœud
- configurer les tolérances des pods pour retarder ou éviter l'éviction des pods
- configurer le kubelet pour contrôler le moment où le contrôleur de nœuds marque les nœuds comme étant malsains.
Pour plus d'informations sur l'utilisation de ces objets dans un cluster avec des nœuds de télétravail, voir À propos des stratégies de nœuds de télétravail.
8.1.3. Pics de latence ou réduction temporaire du débit pour les travailleurs à distance
Tous les nœuds envoient des battements de cœur à l'opérateur du contrôleur Kubernetes (kube controller) dans le cluster OpenShift Container Platform toutes les 10 secondes, par défaut. Si le cluster ne reçoit pas de battements de cœur d'un nœud, OpenShift Container Platform répond à l'aide de plusieurs mécanismes par défaut.
Par exemple, si l'opérateur du gestionnaire de contrôleur Kubernetes perd le contact avec un nœud après une période configurée :
-
Le contrôleur de nœuds sur le plan de contrôle met à jour l'état du nœud à
Unhealthy
et marque l'état du nœudReady
commeUnknown
. - En réponse, l'ordonnanceur arrête de programmer des pods sur ce nœud.
-
Le contrôleur de nœuds sur site ajoute au nœud une tare
node.kubernetes.io/unreachable
avec un effetNoExecute
et planifie l'éviction de tous les pods du nœud après cinq minutes, par défaut.
Ce comportement peut poser des problèmes si votre réseau est sujet à des problèmes de latence, en particulier si vous avez des nœuds à la périphérie du réseau. Dans certains cas, l'opérateur du gestionnaire de contrôleur Kubernetes peut ne pas recevoir de mise à jour d'un nœud sain en raison de la latence du réseau. L'opérateur du gestionnaire de contrôleur Kubernetes expulserait alors les pods du nœud, même si celui-ci est sain. Pour éviter ce problème, vous pouvez utiliser worker latency profiles pour ajuster la fréquence à laquelle le kubelet et le Kubernetes Controller Manager Operator attendent les mises à jour d'état avant d'agir. Ces ajustements permettent de s'assurer que votre cluster fonctionne correctement dans le cas où la latence du réseau entre le plan de contrôle et les nœuds de travail n'est pas optimale.
Ces profils de latence des travailleurs sont trois ensembles de paramètres prédéfinis avec des valeurs soigneusement ajustées qui vous permettent de contrôler la réaction du cluster aux problèmes de latence sans avoir à déterminer les meilleures valeurs manuellement.
8.1.4. Stratégies pour les nœuds de télétravailleurs
Si vous utilisez des nœuds de travail à distance, réfléchissez aux objets à utiliser pour exécuter vos applications.
Il est recommandé d'utiliser des ensembles de démons ou des pods statiques en fonction du comportement souhaité en cas de problèmes de réseau ou de perte d'alimentation. En outre, vous pouvez utiliser les zones et les tolérances Kubernetes pour contrôler ou éviter les évictions de pods si le plan de contrôle ne peut pas atteindre les nœuds de travail distants.
- Jeux de démons
- Les ensembles de démons constituent la meilleure approche pour gérer les pods sur les nœuds de travail distants pour les raisons suivantes :
-
Les ensembles de démons n'ont généralement pas besoin d'un comportement de replanification. Si un nœud se déconnecte du cluster, les pods sur le nœud peuvent continuer à fonctionner. OpenShift Container Platform ne modifie pas l'état des pods daemon set, et laisse les pods dans l'état qu'ils ont signalé pour la dernière fois. Par exemple, si un daemon set pod est dans l'état
Running
, lorsqu'un nœud arrête de communiquer, le pod continue de fonctionner et est supposé être en cours d'exécution par OpenShift Container Platform. Par défaut, les pods de l'ensemble démon sont créés avec des tolérances de
NoExecute
pour les taintsnode.kubernetes.io/unreachable
etnode.kubernetes.io/not-ready
, sans valeur detolerationSeconds
. Ces valeurs par défaut garantissent que les pods de l'ensemble démon ne sont jamais expulsés si le plan de contrôle ne peut pas atteindre un nœud. Par exemple :Tolérances ajoutées aux pods du daemon par défaut
tolerations: - key: node.kubernetes.io/not-ready operator: Exists effect: NoExecute - key: node.kubernetes.io/unreachable operator: Exists effect: NoExecute - key: node.kubernetes.io/disk-pressure operator: Exists effect: NoSchedule - key: node.kubernetes.io/memory-pressure operator: Exists effect: NoSchedule - key: node.kubernetes.io/pid-pressure operator: Exists effect: NoSchedule - key: node.kubernetes.io/unschedulable operator: Exists effect: NoSchedule
- Les ensembles de démons peuvent utiliser des étiquettes pour s'assurer qu'une charge de travail s'exécute sur un nœud de travail correspondant.
- Vous pouvez utiliser un point d'extrémité de service OpenShift Container Platform pour équilibrer la charge des pods de l'ensemble des démons.
Les ensembles de démons ne planifient pas les pods après un redémarrage du nœud si OpenShift Container Platform ne peut pas atteindre le nœud.
- Nacelles statiques
- Si vous souhaitez que les pods redémarrent en cas de redémarrage d'un nœud, après une panne de courant par exemple, envisagez des pods statiques. Le kubelet sur un nœud redémarre automatiquement les pods statiques lorsque le nœud redémarre.
Les pods statiques ne peuvent pas utiliser les secrets et les cartes de configuration.
- Zones Kubernetes
- Les zones Kubernetes peuvent ralentir le rythme ou, dans certains cas, arrêter complètement les évictions de pods.
Lorsque le plan de contrôle ne peut pas atteindre un nœud, le contrôleur de nœud, par défaut, applique node.kubernetes.io/unreachable
taints et expulse les pods à un taux de 0,1 nœud par seconde. Cependant, dans un cluster qui utilise des zones Kubernetes, le comportement d'éviction des pods est modifié.
Si une zone est totalement perturbée et que tous les nœuds de la zone ont une condition Ready
qui est False
ou Unknown
, le plan de contrôle n'applique pas l'erreur node.kubernetes.io/unreachable
aux nœuds de cette zone.
Pour les zones partiellement perturbées, où plus de 55 % des nœuds ont une condition False
ou Unknown
, le taux d'éviction des pods est réduit à 0,01 nœud par seconde. Les nœuds des grappes plus petites, comptant moins de 50 nœuds, ne sont pas altérés. Votre cluster doit avoir plus de trois zones pour que ce comportement prenne effet.
Vous affectez un nœud à une zone spécifique en appliquant l'étiquette topology.kubernetes.io/region
dans la spécification du nœud.
Exemples d'étiquettes de nœuds pour les zones Kubernetes
kind: Node apiVersion: v1 metadata: labels: topology.kubernetes.io/region=east
KubeletConfig
objets
Vous pouvez ajuster le temps pendant lequel le kubelet vérifie l'état de chaque nœud.
Pour définir l'intervalle qui affecte le moment où le contrôleur de nœuds sur site marque les nœuds avec la condition Unhealthy
ou Unreachable
, créez un objet KubeletConfig
qui contient les paramètres node-status-update-frequency
et node-status-report-frequency
.
Le kubelet de chaque nœud détermine l'état du nœud tel que défini par le paramètre node-status-update-frequency
et signale cet état au cluster en fonction du paramètre node-status-report-frequency
. Par défaut, le kubelet détermine l'état du nœud toutes les 10 secondes et le signale toutes les minutes. Cependant, si l'état du nœud change, le kubelet signale le changement au cluster immédiatement. OpenShift Container Platform utilise le paramètre node-status-report-frequency
uniquement lorsque la porte de fonctionnalité Node Lease est activée, ce qui est l'état par défaut dans les clusters OpenShift Container Platform. Si la porte de la fonctionnalité Node Lease est désactivée, le nœud signale son état en fonction du paramètre node-status-update-frequency
.
Exemple de configuration d'un kubelet
apiVersion: machineconfiguration.openshift.io/v1 kind: KubeletConfig metadata: name: disable-cpu-units spec: machineConfigPoolSelector: matchLabels: machineconfiguration.openshift.io/role: worker 1 kubeletConfig: node-status-update-frequency: 2 - "10s" node-status-report-frequency: 3 - "1m"
- 1
- Spécifiez le type de nœud auquel cet objet
KubeletConfig
s'applique en utilisant l'étiquette de l'objetMachineConfig
. - 2
- Indique la fréquence à laquelle le kubelet vérifie l'état d'un nœud associé à cet objet
MachineConfig
. La valeur par défaut est10s
. Si vous modifiez cette valeur par défaut, la valeurnode-status-report-frequency
est modifiée en conséquence. - 3
- Indique la fréquence à laquelle le kubelet signale l'état d'un nœud associé à cet objet
MachineConfig
. La valeur par défaut est1m
.
Le paramètre node-status-update-frequency
fonctionne avec les paramètres node-monitor-grace-period
et pod-eviction-timeout
.
-
Le paramètre
node-monitor-grace-period
spécifie la durée pendant laquelle OpenShift Container Platform attend qu'un nœud associé à un objetMachineConfig
soit marquéUnhealthy
si le gestionnaire de contrôleur ne reçoit pas le battement de cœur du nœud. Les charges de travail sur le nœud continuent de s'exécuter après ce délai. Si le nœud du travailleur distant rejoint le cluster après l'expiration denode-monitor-grace-period
, les pods continuent de s'exécuter. De nouveaux pods peuvent être programmés sur ce nœud. L'intervallenode-monitor-grace-period
est40s
. La valeurnode-status-update-frequency
doit être inférieure à la valeurnode-monitor-grace-period
. -
Le paramètre
pod-eviction-timeout
spécifie le temps qu'OpenShift Container Platform attend après avoir marqué un nœud associé à un objetMachineConfig
commeUnreachable
pour commencer à marquer les pods pour l'éviction. Les pods évincés sont reprogrammés sur d'autres nœuds. Si le nœud de travailleur distant rejoint le cluster après l'expiration depod-eviction-timeout
, les pods exécutés sur le nœud de travailleur distant sont arrêtés car le contrôleur de nœud a expulsé les pods sur site. Les pods peuvent alors être reprogrammés sur ce nœud. L'intervallepod-eviction-timeout
est5m0s
.
La modification des paramètres node-monitor-grace-period
et pod-eviction-timeout
n'est pas possible.
- Tolérances
-
Vous pouvez utiliser des tolérances de pods pour atténuer les effets si le contrôleur de nœuds sur site ajoute une erreur
node.kubernetes.io/unreachable
avec un effetNoExecute
à un nœud qu'il ne peut pas atteindre.
Une taint avec l'effet NoExecute
affecte les pods qui s'exécutent sur le nœud de la manière suivante :
- Les pods qui ne tolèrent pas l'altération sont mis en file d'attente pour être expulsés.
-
Les pods qui tolèrent l'altération sans spécifier une valeur
tolerationSeconds
dans leur spécification de tolérance restent liés pour toujours. -
Les pods qui tolèrent l'altération avec une valeur
tolerationSeconds
spécifiée restent liés pendant la durée spécifiée. Une fois le temps écoulé, les pods sont mis en file d'attente pour être expulsés.
Vous pouvez retarder ou éviter l'éviction des pods en configurant les tolérances des pods avec l'effet NoExecute
pour les taints node.kubernetes.io/unreachable
et node.kubernetes.io/not-ready
.
Exemple de tolérance dans un spec pod
... tolerations: - key: "node.kubernetes.io/unreachable" operator: "Exists" effect: "NoExecute" 1 - key: "node.kubernetes.io/not-ready" operator: "Exists" effect: "NoExecute" 2 tolerationSeconds: 600 ...
OpenShift Container Platform utilise la valeur tolerationSeconds
après l'expiration de la valeur pod-eviction-timeout
.
- Autres types d'objets OpenShift Container Platform
- Vous pouvez utiliser des ensembles de répliques, des déploiements et des contrôleurs de réplication. L'ordonnanceur peut replanifier ces pods sur d'autres nœuds après que le nœud a été déconnecté pendant cinq minutes. La replanification sur d'autres nœuds peut être bénéfique pour certaines charges de travail, telles que les API REST, pour lesquelles un administrateur peut garantir qu'un nombre spécifique de pods est en cours d'exécution et accessible.
Lorsque vous travaillez avec des nœuds de télétravailleur, la reprogrammation de pods sur différents nœuds peut ne pas être acceptable si les nœuds de télétravailleur sont destinés à être réservés à des fonctions spécifiques.
ne sont pas redémarrés en cas de panne. Les pods restent dans l'état terminating
jusqu'à ce que le plan de contrôle puisse reconnaître que les pods sont terminés.
Pour éviter de programmer un nœud qui n'a pas accès au même type de stockage persistant, OpenShift Container Platform ne peut pas migrer les pods qui nécessitent des volumes persistants vers d'autres zones dans le cas d'une séparation de réseau.
Ressources supplémentaires
- Pour plus d'informations sur les Daemonesets, voir DaemonSets.
- Pour plus d'informations sur les taches et les tolérances, voir Contrôle du placement des pods à l'aide des taches de nœuds.
-
Pour plus d'informations sur la configuration des objets
KubeletConfig
, voir Creating a KubeletConfig CRD. - Pour plus d'informations sur les ensembles de répliques, voir ReplicaSets.
- Pour plus d'informations sur les déploiements, voir Déploiements.
- Pour plus d'informations sur les contrôleurs de réplication, voir Contrôleurs de réplication.
- Pour plus d'informations sur le gestionnaire de contrôleur, voir Kubernetes Controller Manager Operator.