Descreva o erro
O plug-in Trident CSI Node ( csi.trident.netapp.io
) em um nó agora não está registrado depois que a versão do Kubernetes foi atualizada da v1.18.9 para v1.19.4. Os pods neste nó não podem mais montar e desmontar volumes Trident.
Vemos as seguintes mensagens no log do kubelet.
csi.trident.netapp.io
não foi registrado desde que o soquete de registro ( /var/lib/kubelet/plugins_registry/csi.trident.netapp.io-reg.sock
) foi removido.
I1119 05:47:54.246972 6550 plugin_watcher.go:212] Removendo o caminho do soquete /var/lib/kubelet/plugins_registry/csi.trident.netapp.io-reg.sock do cache de estado desejado
I1119 05:47:53.162305 6550 conciliar.go:139] operationExecutor.UnregisterPlugin iniciado para plug-in em "/var/lib/kubelet/plugins_registry/csi.trident.netapp.io-reg.sock" (detalhes do plug-in: &{/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 request for plugin csi.trident.netapp.io
O pod não pôde desmontar o volume porque csi.trident.netapp.io
não foi encontrado.
E1119 09:02:52.819122 6550 nestedpendingoperations.go:301] Operação para "{v olumeName:kubernetes.io/csi/csi.trident.netapp.io ^pvc-75a6fd7f-7aee-45e8-a5fa-d4500272528e podName:ad18a7d1-4090 -4e0c-9e71-cba46dfc3657 nodeName:}" falhou. Não são permitidas novas tentativas até 2020-11-19 09:04:54.819071328 +0000 UTC m=+1310234.159288938 (durationBeforeRetry 2m2s). Erro: "UnmountVolume.TearDown falhou para o volume "data" (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 falhou ao obter cliente CSI: nome do driver csi.trident.netapp.io não encontrado na lista de drivers CSI registrados"
Descobrimos que dois pods trident-csi
(Node Plugin) neste nó estavam sendo executados simultaneamente por um período muito curto e que o antigo driver-registrar
parou depois que um novo foi iniciado.
driver-registrar
remove o soquete de registro ( /var/lib/kubelet/plugins_registry/csi.trident.netapp.io-reg.sock
) quando recebe SIGTERM ( node_register.go#L113-L116 ). A remoção do soquete faz com que o kubelet cancele o registro do plug-in Trident. Acredito que esta seja a causa do problema.
Os pods Trident-csi (Node Plugin) são gerenciados pelo DaemonSet. Normalmente, apenas um pod é executado em cada nó. Mas depois que o Kubernetes foi atualizado, o trident-csi Daemonset foi recriado por trident-operator
. A exclusão do DaemonSet permite que dois pods (antigos e novos) sejam executados simultaneamente.
Confirmamos isso no log trident-operator
.
Aqui, o trident-csi
Daemonset foi excluído.
time="2020-11-19T05:47:45Z" level=debug msg="Deleted Kubernetes DaemonSet." DaemonSet=trident-csi namespace=trident
O trident-csi
Daemonset foi criado logo depois.
time="2020-11-19T05:47:45Z" level=debug msg="Criando objeto." kind=DaemonSet name=trident-csi namespace=trident
Depois que o Kubernetes foi atualizado, o sinalizador shouldUpdate
foi definido como verdadeiro ( controller.go#L1110 ). Parece que o sinalizador shouldUpdate
faz com que o trident-csi
Daemonset seja excluído ( installer.go#L1489-L1494 ).
Ambiente
silenceAutosupport: true
(Operador Trident)Reproduzir
A atualização da versão do Kubernetes pode reproduzir esse problema. Como a atualização do Kubernetes leva muito tempo e nem sempre acontece, confirmamos os seguintes comportamentos que causam esse problema por meio de diferentes demonstrações.
$ 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 para executar dois pods trident-csi em cada nó.$ kubectl get ds -n trident trident-csi -o json | jq '.metadata.name|="trident-csi-2"' | kubectl apply -f -
trident-csi-2
DaemonSet copiado.$ kubectl delete ds -n trident trident-csi-2
$ kubectl describe csinodes.storage.k8s.io <NODE_NAME>
Spec:
trident-csi
DaemonSet. O DaemonSet será recriado logo depois pelo operador tridente.$ kubectl delete ds -n trident trident-csi
trident-csi
em cada nó.$ kubectl get pods -n trident -o wide
Comportamento esperado
Os pods podem montar e desmontar volumes Trident após a atualização da versão do Kubernetes.
Contexto adicional
Nenhum
Olá @tksm
Obrigado por fornecer detalhes sobre esse problema e analisar atentamente a causa subjacente. Sua análise é muito útil. A janela entre o término do pod do daemonset e a recriação é crítica, e o último só deve ocorrer quando o primeiro for concluído. Portanto, o operador deve garantir que, antes da criação do daemonset, todos os pods pertencentes ao daemonset anterior sejam excluídos e, em seguida, crie apenas um novo daemonset.
Por curiosidade, você se importa se eu perguntar o número de clusters que tiveram esse problema durante uma atualização?
Obrigada!
Olá, @ntap-arorar
Obrigado por confirmar. Acho que sua ideia resolverá esse problema.
Encontramos esse problema em apenas um cluster até agora, pois atualizamos apenas alguns clusters como teste.
Incluiremos essa correção na versão Trident v21.01.
Esse problema foi corrigido com o commit 820579d .
Comentários muito úteis
Incluiremos essa correção na versão Trident v21.01.