Décrivez le bogue
Le plug-in Trident CSI Node ( csi.trident.netapp.io
) sur un nœud est désormais désenregistré après la mise à jour de la version Kubernetes de la v1.18.9 à la v1.19.4. Les pods sur ce nœud ne peuvent plus monter et démonter des volumes Trident.
Nous voyons les messages suivants dans le journal kubelet.
csi.trident.netapp.io
n'a pas été enregistré car le socket d'enregistrement ( /var/lib/kubelet/plugins_registry/csi.trident.netapp.io-reg.sock
) a été supprimé.
I1119 05:47:54.246972 6550 plugin_watcher.go:212] Suppression du chemin de socket /var/lib/kubelet/plugins_registry/csi.trident.netapp.io-reg.sock du cache d'état souhaité
I1119 05:47:53.162305 6550 réconciliationr.go:139] operationExecutor.UnregisterPlugin a démarré pour le plugin à "/var/lib/kubelet/plugins_registry/csi.trident.netapp.io-reg.sock" (détails du plugin : &{/var /lib/kubelet/plugins_registry/csi.trident.netapp.io-reg.sock 2020-11-04 05:08:19.553684094 +0000 UTC m=+38.893901704 0x704c200 csi.trident.netapp.io})
I1119 05:47:53.163390 6550 csi_plugin.go:177] kubernetes.io/csi : registrationHandler.DeRegisterPlugin demande pour le plug-in csi.trident.netapp.io
Le pod n'a pas pu démonter le volume car csi.trident.netapp.io
n'a pas été trouvé.
E1119 09:02:52.819122 6550 nestedpendingoperations.go:301] Opération pour "{v olumeName:kubernetes.io/csi/csi.trident.netapp.io ^pvc-75a6fd7f-7aee-45e8-a5fa-d4500272528e podName:ad18a7d1-4090 -4e0c-9e71-cba46dfc3657 nodeName :}" a échoué. Aucune nouvelle tentative n'est autorisée jusqu'au 2020-11-19 09:04:54.819071328 +0000 UTC m=+1310234.159288938 (durationBeforeRetry 2m2s). Erreur : "UnmountVolume.TearDown a échoué pour le volume "données" (UniqueName : "kubernetes.io/csi/csi.trident.netapp.io^pvc-75a6fd7f-7aee-45e8-a5fa-d4500272528e") pod "ad18a7d1-4090-4e0c -9e71-cba46dfc3657" (UID : "ad18a7d1-4090-4e0c-9e71-cba46dfc3657") : kubernetes.io/csi : mounter.SetUpAt n'a pas réussi à obtenir le client CSI : le nom du pilote csi.trident.netapp.io est introuvable dans la liste de pilotes inscrits au CSI"
Nous avons constaté que deux pods trident-csi
(Node Plugin) sur ce nœud fonctionnaient simultanément pendant une très courte période et que l'ancien driver-registrar
s'était arrêté après le démarrage d'un nouveau.
driver-registrar
supprime le socket d'enregistrement ( /var/lib/kubelet/plugins_registry/csi.trident.netapp.io-reg.sock
) lorsqu'il reçoit SIGTERM ( node_register.go#L113-L116 ). La suppression du socket entraîne la désinscription du plug-in Trident par le kubelet. Je crois que c'est la cause du problème.
Les pods Trident-csi (Node Plugin) sont gérés par DaemonSet. Normalement, un seul pod s'exécute sur chaque nœud. Mais après la mise à jour de Kubernetes, trident-csi Daemonset a été recréé par trident-operator
. La suppression de DaemonSet permet à deux pods (ancien et nouveau) de s'exécuter simultanément.
Nous l'avons confirmé sur le journal trident-operator
.
Ici, le trident-csi
Daemonset a été supprimé.
time="2020-11-19T05:47:45Z" level=debug msg="Ensemble de démons Kubernetes supprimé." DaemonSet=espace de noms trident-csi=trident
Le trident-csi
Daemonset a ensuite été créé peu de temps après.
time="2020-11-19T05:47:45Z" level=debug msg="Création d'un objet." kind=DaemonSet name=trident-csi namespace=trident
Après la mise à jour de Kubernetes, l'indicateur shouldUpdate
a été défini sur true ( controller.go#L1110 ). Il semble que le drapeau shouldUpdate
provoque la suppression du Daemonset trident-csi
( installer.go#L1489-L1494 ).
Environnement
silenceAutosupport: true
(Opérateur Trident)Reproduire
La mise à jour de la version de Kubernetes peut reproduire ce problème. Étant donné que la mise à jour de Kubernetes prend beaucoup de temps et ne se produit pas toujours, nous avons confirmé les comportements suivants qui causent ce problème à travers différentes démonstrations.
$ kubectl describe csinodes.storage.k8s.io <NODE_NAME>
...
Spec:
Drivers:
csi.trident.netapp.io:
Node ID: <NODE_NAME>
Topology Keys: [topology.kubernetes.io/zone]
trident-csi
DaemonSet pour exécuter deux pods trident-csi sur chaque nœud.$ kubectl get ds -n trident trident-csi -o json | jq '.metadata.name|="trident-csi-2"' | kubectl apply -f -
trident-csi-2
copié.$ kubectl delete ds -n trident trident-csi-2
$ kubectl describe csinodes.storage.k8s.io <NODE_NAME>
Spec:
trident-csi
DaemonSet. Le DaemonSet sera recréé peu de temps après par l'opérateur trident.$ kubectl delete ds -n trident trident-csi
trident-csi
sur chaque nœud.$ kubectl get pods -n trident -o wide
Comportement attendu
Les pods peuvent monter et démonter des volumes Trident après la mise à jour de la version de Kubernetes.
Contexte supplémentaire
Rien
Bonjour @tksm
Merci d'avoir fourni des détails sur ce problème et d'avoir examiné de près la cause sous-jacente, votre analyse est très utile. La fenêtre entre l'arrêt du pod daemonset et l'obtention de la recréation est critique, et cette dernière ne doit se produire que lorsque la première est terminée. Par conséquent, l'opérateur doit s'assurer qu'avant la création de l'ensemble de démons, les pods appartenant à l'ensemble de démons précédent sont tous supprimés, puis créer uniquement un nouvel ensemble de démons.
Par curiosité, cela vous dérange-t-il que je demande le nombre de clusters qui ont rencontré ce problème lors d'une mise à niveau ?
Merci!
Salut, @ntap-arorar
Merci pour votre confirmation. Je pense que ton idée résoudra ce problème.
Jusqu'à présent, nous avons rencontré ce problème sur un seul cluster, car nous n'avions mis à niveau que quelques clusters à titre de test.
Nous inclurons ce correctif dans la version Trident v21.01.
Ce problème a été résolu avec le commit 820579d .
Commentaire le plus utile
Nous inclurons ce correctif dans la version Trident v21.01.