Trident: Trident-csi crashloops em referências de instantâneo inválidas

Criado em 7 dez. 2020  ·  5Comentários  ·  Fonte: NetApp/trident

Descreva o erro

A implantação do trident-csi estava travando devido a

I1207 08:20:13.609384 1 connection.go:186] GRPC error: rpc error: code = FailedPrecondition desc = Trident initialization failed; error attempting to clean up snapshot snapshot-SOMEUUID from backend ontapnas.... : error reading volume size: flexvol trident_pvc_SOMEOTHERUUID not found

Por algum motivo, o trident-csi estava seguindo as referências restantes a um instantâneo em um back-end de PVC que não suportava instantâneos.
O instantâneo em si não existia mais para esse PVC (pode ter sido criado por engano no kubernetes no passado [> 1 mês atrás]). Eu até tinha deletado o PVC original. Mas o verdadeiro problema era que excluir o objeto "volumesnapshot" para esse instantâneo não parecia excluir todas as outras referências a ele.

O back-end era "ontap-nas-economy" ( https://netapp-trident.readthedocs.io/en/latest/kubernetes/operations/tasks/backends/ontap/drivers.html , o q-tree).

Parecia que o CSI estava tentando localizar um instantâneo para um PV (qtree) provisionado em um backend 'econômico', mas na verdade estava verificando o volume pvc no backend ontap-nas regular. Que é definido como nosso padrão também. Suspeito que esse problema tenha acontecido porque a classe de armazenamento padrão era a econômica, quando o instantâneo foi criado. Isso mudou mais tarde para definir o padrão para ontap-nas que suporta back-end, mas as referências provavelmente foram quebradas/não limpas adequadamente naquele ponto (?).

Essas outras referências incluem:

  • um VolumeSnapshotContent que fazia referência ao mesmo snapshot/pvc.
  • um objeto TridentVolume referenciando aquele PVC excluído
  • um TridentTransaction que também continha uma referência a esse instantâneo.

A exclusão das referências anteriores corrige o problema.

Estado inicial:

Algum tempo atrás, um recurso volumesnapshot foi criado para um back-end que não o suportava. A exclusão desse volumenapshot não pareceu excluir as referências a ele em outros objetos trident crd.

O que desencadeou o bug:

Reiniciando alguns nós, reiniciei o kubelet em um dos nós que tinha o volumeattachment para o snapshot/pvc.

Ambiente
Turno aberto 4.6.*

  • Versão Trident: 20.07.1 (também travou em 20.10.0 após a atualização)
  • Sinalizadores de instalação do Trident usados: --debug
  • Tempo de execução do contêiner: cri-o://1.19.0-24
  • Versão do Kubernetes: v1.19.0
  • Orquestrador do Kubernetes: Openshift 4.6.*
  • Gates de recursos habilitados para Kubernetes: [por exemplo, CSINodeInfo]
  • SO: Red Hat Enterprise Linux CoreOS 46.82
  • Tipos de back-end da NetApp: [por exemplo, CVS para AWS, ONTAP AFF 9.5, HCI 1.7]

Reproduzir

  • Defina o back-end de armazenamento padrão para um que não dê suporte a instantâneos.
  • Crie um objeto volumesnapshot para um back-end que não oferece suporte a instantâneos
  • Altere o SC padrão para um que suporte instantâneos
  • Excluir o volumenapshot
  • Reinicie o nó que continha o anexo para esse instantâneo.
  • Após reiniciar o nó, reinicie o pod trident-csi.
  • Verifique se todas as referências estão apagadas.

Comportamento esperado

Nenhum crashlooping em referências TridentTransaction quebradas.
Imprima um aviso e continue OU limpe a referência quebrada OU adicione um sinalizador para ativar/desativar esse comportamento.

bug tracked

Todos 5 comentários

A solução alternativa é excluir as transações do tridente manualmente e reiniciar os pods do tridente. este ainda é um bug que precisa ser resolvido.
Etapas para a solução alternativa abaixo
Verifique as entradas no CRD tridenttransactions.

#oc get tridenttransaction -n trident
# oc get tridenttransaction -n trident -o json

[ corona@stablrebco2 ~]$ oc get ttx -n trident
NOME IDADE
pvc-63836175-1515-4326-b73f-cae3e0963be7-snapshot-0462e2ea-f167-4846-86a3-10cc6599b4a8 8d

3) Apague as entradas presentes no CRD da transação trident.
Antes de excluir a entrada do CRD tridenttransaction, talvez seja necessário editar a entrada do recurso CRD e remover os finalizadores (trident.netapp.io)

Para editar o CRD, use um editor vi: (Lembre-se de salvar a alteração)

kubectl (oc) edit tridenttransaction pvc-63836175-1515-4326-b73f-cae3e0963be7-snapshot-0462e2ea-f167-4846-86a3-10cc6599b4a8 -n trident

 Exclua a linha abaixo dos finalizadores contendo a entrada "trident.netapp.io".

4) Para excluir o CRD da transação trident.

oc delete ttx pvc-63836175-1515-4326-b73f-cae3e0963be7-snapshot-0462e2ea-f167-4846-86a3-10cc6599b4a8 -n trident

Confirme que a transação trident foi excluída.

oc obter ttx -n tridente

5) Depois disso, os pods Trident devem aparecer e estar no status Running. Caso contrário, exclua o pod de tridente principal (o pod com o nome de pod mais longo).
Isso deve gerar um novo pod de tridente que tentará inicializar novamente e inicializar com sucesso porque não há transações obsoletas a serem tratadas durante a inicialização.

oc obter pods -n trident

oc excluir pod-n tridente

haverá um lançamento de patch para corrigir o bug

Olá @promothp ,

Este bug junto com todos os outros bugs são avaliados com base na gravidade e priorizados para serem corrigidos de acordo. Se possível, uma correção de bug para esse problema seria incluída na versão Trident v21.01 no final de janeiro.

Adicione meu voto para ter um patch mais cedo ou mais tarde!

Essa correção está incluída na versão Trident v21.01 com commit 0ce1aaf .

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