Trident: O plug-in Trident CSI Node não é registrado após a atualização da versão do Kubernetes

Criado em 25 nov. 2020  ·  4Comentários  ·  Fonte: NetApp/trident

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.

Mensagens de erro

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"

Dois trident-csi estavam rodando simultaneamente

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.

image

O DaemonSet foi recriado após a atualização

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

  • Versão tridente: 20.10.0 com operador tridente
  • Sinalizadores de instalação Trident usados: silenceAutosupport: true (Operador Trident)
  • Tempo de execução do contêiner: Docker 19.03.13
  • Versão do Kubernetes: v1.19.4
  • Orquestrador do Kubernetes: Kubernetes
  • Gates de recursos habilitados para Kubernetes:
  • SO: Ubuntu 18.04
  • Tipos de back-end da NetApp: ONTAP AFF 9.1P14
  • De outros:

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.

Dois trident-csi fazem com que o kubelet cancele o registro do plugin Trident

  1. Confirme se o driver Trident CSI está registrado no nó.
$ kubectl describe csinodes.storage.k8s.io <NODE_NAME>
...
Spec:
  Drivers:
    csi.trident.netapp.io:
      Node ID:        <NODE_NAME>
      Topology Keys:  [topology.kubernetes.io/zone]
  1. Copie 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 -
  1. Aguarde a execução e exclua o trident-csi-2 DaemonSet copiado.
$ kubectl delete ds -n trident trident-csi-2
  1. Confirme se o driver Trident CSI desapareceu na seção Drivers no nó. (Isso vai levar algum tempo)
$ kubectl describe csinodes.storage.k8s.io <NODE_NAME>
Spec:

Recriar o DaemonSet permite que dois pods (antigos e novos) sejam executados simultaneamente

  1. Excluir trident-csi DaemonSet. O DaemonSet será recriado logo depois pelo operador tridente.
$ kubectl delete ds -n trident trident-csi
  1. Você verá dois pods 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

bug tracked

Comentários muito úteis

Incluiremos essa correção na versão Trident v21.01.

Todos 4 comentários

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 .

Esta página foi útil?
0 / 5 - 0 avaliações