Lorsque vous devez réparer ou gérer des nœuds, vous devez d'abord les passer en mode maintenance. Cela draine de manière optimale les pods et les charges de travail existants, à l'exclusion des pods système critiques tels que le serveur d'API. Le mode maintenance empêche également le nœud de recevoir de nouvelles attributions de pods. En mode maintenance, vous pouvez travailler sur vos nœuds sans risquer de perturber le trafic des pods.
Fonctionnement
Google Distributed Cloud permet de placer des nœuds en mode maintenance. Cette approche permet aux autres composants de cluster de savoir correctement que le nœud est en mode de maintenance. Lorsque vous placez un nœud en mode de maintenance, aucun pod supplémentaire ne peut être planifié sur le nœud et les pods existants sont arrêtés.
Au lieu d'utiliser le mode de maintenance, vous pouvez utiliser manuellement des commandes Kubernetes telles que kubectl cordon
et kubectl drain
sur un nœud spécifique.
Lorsque vous utilisez le processus en mode maintenance, Google Distributed Cloud effectue les opérations suivantes:
1.29
Google Distributed Cloud ajoute le rejet
baremetal.cluster.gke.io/maintenance:NoSchedule
aux nœuds spécifiés pour empêcher la planification de nouveaux pods sur le nœud.Google Distributed Cloud utilise l'API Eviction pour évincer chaque pod. Cette méthode de drainage des nœuds respecte les PodDisruptionBudgets (PDB). Vous pouvez configurer des PDB pour protéger vos charges de travail en spécifiant un niveau d'interruption tolérable pour un ensemble de pods à l'aide des champs
minAvailable
etmaxUnavailable
. Ce procédé permet de mieux protéger les nœuds contre les interruptions de la charge de travail. Le drainage de nœuds basé sur l'éviction est disponible en disponibilité générale pour la version 1.29.Un délai avant expiration de 20 minutes est appliqué pour garantir que les nœuds ne restent pas bloqués dans l'attente de l'arrêt des pods. Les pods peuvent ne pas s'arrêter s'ils sont configurés pour tolérer tous les rejets ou s'ils disposent de finaliseurs. Google Distributed Cloud tente d'arrêter tous les pods, mais si le délai avant expiration est dépassé, le nœud passe en mode maintenance. Ce délai empêche les pods en cours d'exécution de bloquer les mises à niveau.
1.28 et versions antérieures
Google Distributed Cloud ajoute le rejet
baremetal.cluster.gke.io/maintenance:NoSchedule
aux nœuds spécifiés pour empêcher la planification de nouveaux pods sur le nœud.Google Distributed Cloud ajoute le rejet
baremetal.cluster.gke.io/maintenance:NoExecute
. En agissant sur le rejetNoExecute
, Google Distributed Cloudkube-scheduler
arrête les pods et draine le nœud. Cette méthode de drainage des nœuds ne respecte pas les PDB.Un délai avant expiration de 20 minutes est appliqué pour garantir que les nœuds ne restent pas bloqués dans l'attente de l'arrêt des pods. Les pods peuvent ne pas s'arrêter s'ils sont configurés pour tolérer tous les rejets ou s'ils disposent de finaliseurs. Google Distributed Cloud tente d'arrêter tous les pods, mais si le délai avant expiration est dépassé, le nœud passe en mode maintenance. Ce délai empêche les pods en cours d'exécution de bloquer les mises à niveau.
Vidange avec éviction
Aucun changement de procédure n'est associé au passage au drainage de nœud basé sur l'éviction, et non au drainage basé sur le rejet. Cette option n'affecte que la logique de rapprochement.
Cette fonctionnalité n'est pas au même stade de lancement pour toutes les versions compatibles:
- 1.29: DG
- 1.28: Non disponible
- 1.16: Non disponible
Ordre de drainage
Avant la version 1.29, le drainage de nœud basé sur le rejet effectué par le service cloud distribué kube-scheduler
de Google n'utilisait pas d'algorithme particulier pour drainer les pods d'un nœud. Avec le drainage de nœuds basé sur l'éviction, les pods sont évincés dans un ordre spécifique en fonction de la priorité. La priorité d'éviction est associée à des critères spécifiques au pod, comme indiqué dans le tableau suivant:
Ordre de drainage | Critères des pods (doivent correspondre à tous les critères) et |
---|---|
1 |
Les pods correspondant aux critères suivants sont évincés:
|
2 |
Les pods correspondant aux critères suivants sont évincés:
|
3 |
Les pods correspondant aux critères suivants sont évincés:
L'ordre d'éviction des pods correspondants est basé sur |
4 |
Attendez que CSI nettoie les montages PV/PVC une fois les pods évincés. Utilisez |
5 |
Les pods correspondant aux critères suivants sont évincés:
Ces pods nécessitent toujours un drainage, car kubelet n'assure pas la compatibilité des mises à niveau sur place. |
Étant donné que le drainage des nœuds basé sur une éviction respecte les PDB, les paramètres PDB peuvent bloquer le drainage des nœuds dans certaines circonstances. Pour obtenir des informations de dépannage sur le drainage du pool de nœuds, consultez la section Vérifier pourquoi un nœud présente l'état de drainage depuis longtemps.
Désactiver le drainage de nœuds basé sur l'éviction
Le drainage de nœuds basé sur l'éviction est activé par défaut pour les clusters à la version mineure 1.29 ou sur les clusters mis à niveau vers la version mineure 1.29. Si le drainage de nœuds basé sur l'éviction entraîne des problèmes lors des mises à niveau ou de la maintenance du cluster, vous pouvez revenir au drainage de nœuds basé sur le rejet en ajoutant l'annotation baremetal.cluster.gke.io/maintenance-mode-ignore-pdb: true
à votre ressource de cluster.
Placer un nœud en mode de maintenance
Choisissez les nœuds que vous souhaitez passer en mode maintenance en spécifiant des plages d'adresses IP pour les nœuds sélectionnés sous maintenanceBlocks
dans votre fichier de configuration de cluster. Les nœuds que vous choisissez doivent être prêts et opérationnels dans le cluster.
Pour passer des nœuds en mode maintenance, procédez comme suit :
Modifiez le fichier de configuration du cluster pour sélectionner les nœuds à passer en mode maintenance.
Vous pouvez modifier le fichier de configuration avec l'éditeur de votre choix ou modifier directement la ressource personnalisée du cluster en exécutant la commande suivante :
kubectl -n CLUSTER_NAMESPACE edit cluster CLUSTER_NAME
Remplacez les éléments suivants :
CLUSTER_NAMESPACE
: espace de noms du clusterCLUSTER_NAME
: nom du cluster.
Ajoutez la section
maintenanceBlocks
au fichier de configuration du cluster pour spécifier une adresse IP unique ou une plage d'adresses pour les nœuds que vous souhaitez passer en mode maintenance.L'exemple suivant montre comment sélectionner plusieurs nœuds en spécifiant une plage d'adresses IP :
metadata: name: my-cluster namespace: cluster-my-cluster spec: maintenanceBlocks: cidrBlocks: - 172.16.128.1-172.16.128.64
Enregistrez et appliquez la configuration de cluster mise à jour.
Google Distributed Cloud commence à mettre les nœuds en mode maintenance.
Exécutez la commande suivante pour obtenir l'état des nœuds de votre cluster :
kubectl get nodes --kubeconfig=KUBECONFIG
Le résultat ressemble à ce qui suit :
NAME STATUS ROLES AGE VERSION user-anthos-baremetal-01 Ready control-plane 2d22h v1.27.4-gke.1600 user-anthos-baremetal-04 Ready worker 2d22h v1.27.4-gke.1600 user-anthos-baremetal-05 Ready worker 2d22h v1.27.4-gke.1600 user-anthos-baremetal-06 Ready worker 2d22h v1.27.4-gke.1600
Notez que les nœuds sont toujours programmables, mais les rejets empêchent la planification des pods (sans tolérance appropriée) sur le nœud.
Exécutez la commande suivante pour obtenir le nombre de nœuds en mode maintenance :
kubectl get nodepools --kubeconfig ADMIN_KUBECONFIG
La réponse doit ressembler à l'exemple suivant:
NAME READY RECONCILING STALLED UNDERMAINTENANCE UNKNOWN np1 3 0 0 1 0
La colonne
UNDERMAINTENANCE
de cet exemple montre qu'un nœud est en mode maintenance.Google Distributed Cloud ajoute également les rejets suivants aux nœuds lorsqu'ils sont en mode maintenance:
baremetal.cluster.gke.io/maintenance:NoExecute
baremetal.cluster.gke.io/maintenance:NoSchedule
Supprimer un nœud du mode de maintenance
Pour supprimer des nœuds du mode maintenance, procédez comme suit :
Modifiez le fichier de configuration du cluster pour effacer les nœuds que vous souhaitez supprimer du mode maintenance.
Vous pouvez modifier le fichier de configuration avec l'éditeur de votre choix ou modifier directement la ressource personnalisée du cluster en exécutant la commande suivante :
kubectl -n CLUSTER_NAMESPACE edit cluster CLUSTER_NAME
Remplacez les éléments suivants :
CLUSTER_NAMESPACE
: espace de noms du clusterCLUSTER_NAME
: nom du cluster.
Modifiez les adresses IP pour supprimer des nœuds spécifiques du mode maintenance ou supprimez la section
maintenanceBlocks
pour supprimer tous les nœuds du mode maintenance.Enregistrez et appliquez la configuration de cluster mise à jour.
Utilisez les commandes
kubectl
pour vérifier l'état de vos nœuds.
Arrêter et redémarrer un cluster
S'il devient nécessaire de désactiver un cluster complet, suivez les instructions des sections suivantes pour arrêter un cluster et le restaurer en toute sécurité.
Arrêter un cluster
Si vous arrêtez un cluster qui gère des clusters d'utilisateur, vous devez d'abord arrêter tous les clusters d'utilisateur gérés. Les instructions suivantes s'appliquent à tous les types de clusters Google Distributed Cloud.
Vérifiez l'état de tous les nœuds du cluster:
kubectl get nodes --kubeconfig CLUSTER_KUBECONFIG
Remplacez
CLUSTER_KUBECONFIG
par le chemin d'accès au fichier kubeconfig du cluster.Le résultat ressemble à ce qui suit :
NAME STATUS ROLES AGE VERSION control-0 Ready control-plane 202d v1.27.4-gke.1600 control-1 Ready control-plane 202d v1.27.4-gke.1600 control-2 Ready control-plane 202d v1.27.4-gke.1600 worker-0 Ready worker 202d v1.27.4-gke.1600 worker-1 Ready worker 202d v1.27.4-gke.1600 worker-2 Ready worker 202d v1.27.4-gke.1600 worker-3 Ready worker 202d v1.27.4-gke.1600 worker-4 Ready worker 154d v1.27.4-gke.1600 worker-5 Ready worker 154d v1.27.4-gke.1600 worker-6 Ready worker 154d v1.27.4-gke.1600 worker-7 Ready worker 154d v1.27.4-gke.1600 worker-8 Ready worker 154d v1.27.4-gke.1600 worker-9 Ready worker 154d v1.27.4-gke.1600
Si l'
STATUS
d'un nœud n'est pasReady
, nous vous recommandons vivement de résoudre les problèmes liés au nœud et de ne continuer que lorsque tous les nœuds sont à l'étatReady
.Si vous arrêtez un cluster d'utilisateur, vérifiez l'état des nœuds du cluster d'administrateur:
kubectl get nodes --kubeconfig ADMIN_KUBECONFIG
Remplacez
ADMIN_KUBECONFIG
par le chemin d'accès au fichier kubeconfig du cluster de gestion.Les étapes suivantes dépendent du cluster d'administrateur. Si l'
STATUS
d'un nœud n'est pasReady
, nous vous recommandons vivement de résoudre les problèmes liés au nœud et de ne continuer que lorsque tous les nœuds sont à l'étatReady
.Vérifiez l'état du cluster que vous souhaitez arrêter:
bmctl check cluster -c CLUSTER_NAME --kubeconfig ADMIN_KUBECONFIG
Remplacez les éléments suivants :
CLUSTER_NAME
: nom du cluster que vous vérifiez.ADMIN_KUBECONFIG
: chemin d'accès au fichier kubeconfig du cluster de gestion.
Corrigez les problèmes signalés avant de continuer.
Pour le cluster que vous arrêtez, assurez-vous que tous les pods
etcd
sont en cours d'exécution:kubectl get pods --kubeconfig CLUSTER_KUBECONFIG -A \ -l component=etcd
Remplacez
CLUSTER_KUBECONFIG
par le chemin d'accès au fichier kubeconfig du cluster.Le résultat ressemble à ce qui suit :
NAMESPACE NAME READY STATUS RESTARTS AGE kube-system etcd-control-0-admin 1/1 Running 0 2d22h kube-system etcd-control-1-admin 1/1 Running 0 2d22h kube-system etcd-control-2-admin 1/1 Running 0 2d22h
Si la valeur
STATUS
d'un pod n'est pasRunning
, nous vous recommandons vivement de dépanner le pod et de ne continuer que lorsque tous les pods sont à l'étatRunning
.Effectuez une sauvegarde comme décrit dans la section Sauvegarder un cluster.
Il est important d'effectuer une sauvegarde etcd avant d'arrêter votre cluster afin qu'il puisse être restauré si vous rencontrez des problèmes lors de son redémarrage. La corruption d'Etcd, les défaillances matérielles des nœuds, les problèmes de connectivité réseau et éventuellement d'autres conditions peuvent empêcher le cluster de redémarrer correctement.
Si vous arrêtez un cluster comportant des nœuds de calcul, mettez ces derniers en mode maintenance.
Cette étape permet de réduire au minimum la quantité d'écritures dans etcd, ce qui réduit la probabilité qu'un grand nombre d'écritures etcd doive être rapprochées lors du redémarrage du cluster.
Passez les nœuds du plan de contrôle en mode maintenance.
Cette étape empêche les écritures corrompues pour les charges de travail avec état lors de l'arrêt du nœud.
Arrêtez les nœuds du cluster dans l'ordre suivant:
- Nœuds de calcul
- Nœuds de l'équilibreur de charge du plan de contrôle
Nœuds du plan de contrôle, en commençant par les followers etcd et en terminant par le leader etcd
Si vous disposez d'un cluster à haute disponibilité, vous pouvez trouver le leader etcd en vous connectant à chaque nœud du plan de contrôle via SSH et en exécutant la commande
etcdctl
suivante:ETCDCTL_API=3 etcdctl \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --cert /etc/kubernetes/pki/etcd/server.crt \ --key /etc/kubernetes/pki/etcd/server.key \ --write-out=table endpoint status
La réponse inclut une colonne
IS LEADER
, qui renvoietrue
si le nœud est le leader etcd.
À ce stade, votre cluster est complètement arrêté. Après avoir effectué les opérations de maintenance nécessaires, vous pouvez redémarrer votre cluster comme décrit dans la section suivante.
Redémarrer le cluster
Procédez comme suit pour redémarrer un cluster entièrement arrêté.
Activez les machines de nœud dans l'ordre inverse de la séquence d'arrêt.
Supprimez les nœuds du plan de contrôle du mode maintenance.
Pour obtenir des instructions, consultez la section Supprimer un nœud du mode maintenance.
Supprimez les nœuds de calcul du mode maintenance.
Exécutez les vérifications de l'état du cluster pour vous assurer qu'il fonctionne correctement:
bmctl check cluster -c CLUSTER_NAME --kubeconfig ADMIN_KUBECONFIG
Si un problème, tel que le plantage en boucle d'etcd, empêche le cluster de redémarrer correctement, essayez de le restaurer à partir de la dernière sauvegarde saine connue. Pour obtenir des instructions, consultez la section Restaurer un cluster.
Mode de facturation et de maintenance
La facturation de Google Distributed Cloud est basée sur le nombre de processeurs virtuels de votre cluster pour les nœuds capables d'exécuter des charges de travail. Lorsque vous mettez un nœud en mode maintenance, les rejets NoExecute
et NoSchedule
sont ajoutés au nœud, mais ils ne désactivent pas la facturation. Après avoir mis un nœud en mode maintenance, marquez-le comme non programmable (kubectl cordon NODE_NAME
). Une fois qu'un nœud est marqué comme non programmable, il et ses processeurs virtuels associés sont exclus de la facturation.
Comme décrit sur la page des tarifs, vous pouvez utiliser kubectl
pour afficher la capacité de processeurs virtuels (utilisée pour la facturation) de chacun de vos clusters d'utilisateur. La commande ne prend pas en compte si le nœud est programmable ou non. Elle fournit uniquement un nombre de processeurs virtuels par nœud.
Pour identifier le nombre de processeurs virtuels par nœud pour votre cluster d'utilisateur:
kubectl get nodes \
--kubeconfig USER_KUBECONFIG \
-o=jsonpath="{range .items[*]}{.metadata.name}{\"\t\"} \
{.status.capacity.cpu}{\"\n\"}{end}"
Remplacez USER_KUBECONFIG par le chemin d'accès au fichier kubeconfig de votre cluster d'utilisateur.