Automatisation du basculement des applications avec état avec Trident
La fonctionnalité de détachement forcé de Trident permet de détacher automatiquement les volumes des nœuds défaillants d'un cluster Kubernetes, évitant ainsi la corruption des données et garantissant la disponibilité des applications. Cette fonctionnalité est particulièrement utile dans les scénarios où des nœuds deviennent indisponibles ou sont mis hors ligne pour maintenance.
Détails concernant le détachement forcé
Le détachement forcé est disponible pour ontap-san, ontap-san-economy, ontap-nas et ontap-nas-economy uniquement. Avant d'activer le détachement forcé, l'arrêt brutal des nœuds (NGNS) doit être activé sur le cluster Kubernetes. NGNS est activé par défaut pour Kubernetes 1.28 et versions ultérieures. Pour plus d'informations, consultez "Kubernetes : arrêt non gracieux d'un nœud".
|
|
Lorsque vous utilisez le ontap-nas ou ontap-nas-economy pilote, vous devez définir le paramètre autoExportPolicy dans la configuration du backend sur true afin que Trident puisse restreindre l'accès depuis le nœud Kubernetes avec la contamination appliquée à l'aide de politiques d'exportation gérées.
|
|
|
Étant donné que Trident repose sur Kubernetes NGNS, ne supprimez pas out-of-service les taints d'un nœud défaillant tant que toutes les charges de travail non tolérables n'ont pas été reprogrammées. Appliquer ou supprimer le taint sans précaution peut compromettre la protection des données du backend.
|
Lorsque l'administrateur du cluster Kubernetes a appliqué la node.kubernetes.io/out-of-service=nodeshutdown:NoExecute`taint au nœud et `enableForceDetach`est définie sur `true, Trident déterminera l'état du nœud et :
-
Arrêtez l'accès E/S du backend pour les volumes montés sur ce nœud.
-
Marquez l'objet nœud Trident comme
dirty(non sûr pour les nouvelles publications).Le contrôleur Trident refusera les nouvelles demandes de publication de volumes tant que le nœud n'aura pas été requalifié (après avoir été marqué comme dirty) par le pod Trident du nœud. Les charges de travail planifiées avec un PVC monté (même après que le nœud de cluster soit opérationnel et prêt) ne seront pas acceptées tant que Trident ne peut pas vérifier le nœudclean(sécurisé pour de nouvelles publications).
Lorsque l'intégrité du nœud est rétablie et que la contamination est supprimée, Trident :
-
Identifiez et nettoyez les chemins publiés obsolètes sur le nœud.
-
Si le nœud est dans un
cleanableétat (la contamination hors service a été supprimée et le nœud est dans unReadyétat) et que tous les chemins publiés obsolètes sont propres, Trident réadmettra le nœud encleanet autorisera de nouveaux volumes publiés sur le nœud.
Détails sur le basculement automatique
Vous pouvez automatiser le processus de déconnexion forcée grâce à l'intégration avec "opérateur de vérification de l'état des nœuds (NHC)". Lorsqu'une défaillance de nœud se produit, NHC déclenche la remédiation du nœud Trident (TNR) et la déconnexion forcée automatiquement en créant un CR TridentNodeRemediation dans l'espace de noms de Trident, définissant le nœud défaillant. La TNR est créée uniquement lors d'une défaillance de nœud et supprimée par NHC une fois que le nœud est remis en ligne ou supprimé.
Échec du processus de suppression du pod du nœud
Le basculement automatique sélectionne les charges de travail à retirer du nœud défaillant. Lorsqu'un TNR est créé, le contrôleur TNR marque le nœud comme sale, empêchant toute nouvelle publication de volume et commence à supprimer les pods compatibles avec le détachement forcé ainsi que leurs attachements de volumes.
Tous les volumes/PVC pris en charge par force-detach sont pris en charge par automated-failover :
-
Volumes NAS et NAS-economy utilisant des politiques d'auto-exportation (SMB n'est pas encore pris en charge).
-
Volumes SAN et SAN-economy.
Comportement par défaut:
-
Les pods utilisant des volumes compatibles avec le détachement forcé sont supprimés du nœud défaillant. Kubernetes les reprogrammera sur un nœud sain.
-
Les pods utilisant un volume non pris en charge par le force-detach, y compris les volumes non-Trident, ne sont pas supprimés du nœud défaillant.
-
Les pods sans état (et non les PVC) ne sont pas supprimés du nœud défaillant, sauf si l’annotation du pod
trident.netapp.io/podRemediationPolicy: deleteest définie.
Remplacement du comportement de suppression des pods :
Le comportement de suppression des pods peut être personnalisé à l'aide d'une annotation : trident.netapp.io/podRemediationPolicy[retain, delete]. Ces annotations sont examinées et utilisées lors d'un basculement. Appliquez des annotations à la spécification du pod du déploiement/replicaset Kubernetes pour éviter que l'annotation ne disparaisse après un basculement :
-
retain- Le pod ne sera PAS supprimé du nœud défaillant lors d'un basculement automatique. -
delete- Le pod sera supprimé du nœud défaillant lors d'un basculement automatique.
Ces annotations peuvent être appliquées à n'importe quel pod.
|
|
|
CR TridentNodeRemediation
Le TridentNodeRemediation (TNR) CR définit un nœud défaillant. Le nom du TNR est le nom du nœud défaillant.
Exemple de TNR:
apiVersion: trident.netapp.io/v1
kind: TridentNodeRemediation
metadata:
name: <K8s-node-name>
spec: {}
États TNR : Utilisez les commandes suivantes pour afficher l’état des TNR :
kubectl get tnr <name> -n <trident-namespace>
Les TNR peuvent se trouver dans l'un des états suivants :
-
Remédiation :
-
Cessez l'accès aux E/S du backend pour les volumes pris en charge par force-detach montés sur ce nœud.
-
L'objet nœud Trident est marqué comme sale (non sûr pour les nouvelles publications).
-
Supprimez les pods et les attachements de volumes du nœud
-
-
Récupération du nœud en attente:
-
Le contrôleur attend que le nœud soit de nouveau en ligne.
-
Une fois le nœud en ligne, publish-enforcement garantira que le nœud est propre et prêt pour de nouvelles publications de volumes.
-
-
Si le nœud est supprimé de K8s, le contrôleur TNR supprimera le TNR et cessera la réconciliation.
-
Réussi:
-
Toutes les étapes de correction et de récupération du nœud ont été réalisées avec succès. Le nœud est propre et prêt pour la publication de nouveaux volumes.
-
-
Échec :
-
Erreur irrécupérable. Les raisons de l'erreur sont indiquées dans le champ status.message de la CR.
-
Activation du basculement automatique
Prérequis :
-
Assurez-vous que le détachement forcé est activé avant d'activer le basculement automatique. Pour plus d'informations, consultez Détails concernant le détachement forcé.
-
Installez la vérification de l'état (NHC) dans le cluster Kubernetes.
-
Installez Operator Lifecycle Manager (OLM) dans le cluster s'il n'est pas déjà installé :
operator-sdk olm install. -
Installer l'opérateur de vérification de l'état du nœud
kubectl create -f https://operatorhub.io/install/node-healthcheck-operator.yaml.
|
|
Vous pouvez également utiliser d'autres méthodes pour détecter les défaillances de nœud, comme spécifié dans la section [Integrating Custom Node Health Check Solutions] ci-dessous. |
Voir "Opérateur de vérification de l'état des nœuds" pour plus d'informations.
-
Créez une ressource personnalisée NodeHealthCheck (NHC) dans l'espace de noms Trident pour surveiller les nœuds de travail du cluster. Exemple :
apiVersion: remediation.medik8s.io/v1alpha1 kind: NodeHealthCheck metadata: name: <CR name> spec: selector: matchExpressions: - key: node-role.kubernetes.io/control-plane operator: DoesNotExist - key: node-role.kubernetes.io/master operator: DoesNotExist remediationTemplate: apiVersion: trident.netapp.io/v1 kind: TridentNodeRemediationTemplate namespace: <Trident installation namespace> name: trident-node-remediation-template minHealthy: 0 # Trigger force-detach upon one or more node failures unhealthyConditions: - type: Ready status: "False" duration: 0s - type: Ready status: Unknown duration: 0s -
Appliquez le CR de vérification de l'état du nœud dans l'espace de noms
trident.kubectl apply -f <nhc-cr-file>.yaml -n <trident-namespace>
La ressource personnalisée (CR) ci-dessus est configurée pour surveiller les nœuds de travail K8s et détecter les états Ready: false et Unknown. Automated-Failover sera déclenché lorsqu'un nœud passe à l'état Ready: false ou Ready: Unknown.
Le unhealthyConditions dans le CR utilise un délai de grâce de 0 seconde. Cela provoque un basculement automatique immédiat dès que K8s définit la condition Ready : false, ce qui se produit après que K8s a perdu le signal de présence d'un nœud. K8s attend par défaut 40 secondes après le dernier signal de présence avant de définir Ready : false. Ce délai de grâce peut être personnalisé dans les options de déploiement de K8s.
Pour plus d'options de configuration, veuillez vous référer à "Documentation de l'opérateur Node-Healthcheck-Operator".
Informations de configuration supplémentaires
Lorsque Trident est installé avec le détachement forcé activé, deux ressources supplémentaires sont automatiquement créées dans l'espace de noms Trident pour faciliter l'intégration avec NHC : TridentNodeRemediationTemplate (TNRT) et ClusterRole.
TridentNodeRemediationTemplate (TNRT) :
Le TNRT sert de modèle au contrôleur NHC, qui utilise TNRT pour générer des ressources TNR selon les besoins.
apiVersion: trident.netapp.io/v1
kind: TridentNodeRemediationTemplate
metadata:
name: trident-node-remediation-template
namespace: trident
spec:
template:
spec: {}
ClusterRole :
Un rôle de cluster est également ajouté lors de l'installation lorsque le détachement forcé est activé. Cela donne à NHC les autorisations pour les TNR dans l'espace de noms Trident.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
rbac.ext-remediation/aggregate-to-ext-remediation: "true"
name: tridentnoderemediation-access
rules:
- apiGroups:
- trident.netapp.io
resources:
- tridentnoderemediationtemplates
- tridentnoderemediations
verbs:
- get
- list
- watch
- create
- update
- patch
- delete
Mises à niveau et maintenance des clusters K8s
Pour éviter tout basculement, suspendez le basculement automatique pendant la maintenance ou la mise à niveau de K8s, lorsque les nœuds doivent être arrêtés ou redémarrés. Vous pouvez suspendre le CR NHC (décrit ci-dessus) en modifiant son CR :
kubectl patch NodeHealthCheck <cr-name> --patch '{"spec":{"pauseRequests":["<description-for-reason-of-pause>"]}}' --type=merge
Cela suspend le basculement automatique. Pour réactiver le basculement automatique, supprimez le pauseRequests de la spécification après la fin de la maintenance.
Limitations
-
Les opérations d'E/S sont bloquées uniquement sur les nœuds défaillants pour les volumes pris en charge par force-detach. Seuls les pods utilisant des volumes/PVCs pris en charge par force-detach sont automatiquement supprimés.
-
Le basculement automatique et le détachement forcé s'exécutent au sein du pod trident-controller. Si le nœud hébergeant trident-controller tombe en panne, le basculement automatique sera différé jusqu'à ce que K8s déplace le pod vers un nœud sain.
Intégration de solutions personnalisées de vérification de l'état des nœuds
Vous pouvez remplacer Node Healthcheck Operator par d'autres outils de détection des pannes de nœuds pour déclencher un basculement automatique. Pour garantir la compatibilité avec le mécanisme de basculement automatique, votre solution personnalisée doit :
-
Créez un TNR lorsqu'une défaillance de nœud est détectée, en utilisant le nom du nœud défaillant comme nom du CR TNR.
-
Supprimez le TNR lorsque le nœud a récupéré et que le TNR est à l'état Succeeded.