Resolução de problemas de armazenamento

Este documento fornece orientações de resolução de problemas para problemas de armazenamento.

O volume não é anexado

Este problema pode ocorrer se um disco virtual estiver associado à máquina virtual errada e pode dever-se ao problema n.º 32727 no Kubernetes 1.12.

O resultado de gkectl diagnose cluster tem o seguinte aspeto:

Checking cluster object...PASS
Checking machine objects...PASS
Checking control plane pods...PASS
Checking gke-connect pods...PASS
Checking kube-system pods...PASS
Checking gke-system pods...PASS
Checking storage...FAIL
    PersistentVolume pvc-776459c3-d350-11e9-9db8-e297f465bc84: virtual disk "[datastore_nfs] kubevols/kubernetes-dynamic-pvc-776459c3-d350-11e9-9db8-e297f465bc84.vmdk" IS attached to machine "gsl-test-user-9b46dbf9b-9wdj7" but IS NOT listed in the Node.Status
1 storage errors

Neste exemplo, um ou mais pods estão bloqueados no estado ContainerCreating e apresentam avisos como o resultado do exemplo seguinte:

Events:
  Type     Reason              Age               From                     Message
  ----     ------              ----              ----                     -------
  Warning  FailedAttachVolume  6s (x6 over 31s)  attachdetach-controller  AttachVolume.Attach failed for volume "pvc-776459c3-d350-11e9-9db8-e297f465bc84" : Failed to add disk 'scsi0:6'.

Se um disco virtual estiver associado à máquina virtual errada, pode desassociá-lo manualmente através dos seguintes passos:

  1. Drenar um nó. Opcionalmente, pode incluir os sinalizadores --ignore-daemonsets e --delete-local-data no comando kubectl drain.

  2. Desligue a VM.

  3. Edite a configuração de hardware da VM no vCenter para remover o volume.

  4. Ligue a VM.

  5. Anule a restrição do nó.

O volume é perdido

Este problema pode ocorrer se um disco virtual tiver sido eliminado permanentemente. Esta situação pode ocorrer se um operador eliminar manualmente um disco virtual ou eliminar a VM à qual o disco está anexado.

Se vir um erro "não encontrado" relacionado com o seu ficheiro VMDK, é provável que o disco virtual tenha sido eliminado permanentemente.

O resultado de gkectl diagnose cluster tem o seguinte aspeto:

Checking cluster object...PASS
Checking machine objects...PASS
Checking control plane pods...PASS
Checking gke-connect pods...PASS
Checking kube-system pods...PASS
Checking gke-system pods...PASS
Checking storage...FAIL
    PersistentVolume pvc-52161704-d350-11e9-9db8-e297f465bc84: virtual disk "[datastore_nfs] kubevols/kubernetes-dynamic-pvc-52161704-d350-11e9-9db8-e297f465bc84.vmdk" IS NOT found
1 storage errors

Um ou mais pods estão bloqueados no estado ContainerCreating, conforme mostrado no seguinte exemplo de resultado:

Events:
  Type     Reason              Age                   From                                    Message
  ----     ------              ----                  ----                                    -------
  Warning  FailedAttachVolume  71s (x28 over 42m)    attachdetach-controller                 AttachVolume.Attach failed for volume "pvc-52161704-d350-11e9-9db8-e297f465bc84" : File []/vmfs/volumes/43416d29-03095e58/kubevols/
  kubernetes-dynamic-pvc-52161704-d350-11e9-9db8-e297f465bc84.vmdk was not found

Para evitar que este problema ocorra, faça a gestão das suas máquinas virtuais conforme descrito em Redimensionar um cluster de utilizadores e Atualizar clusters.

Para resolver este problema, pode limpar manualmente os recursos do Kubernetes relacionados:

  1. Elimine o PVC que fez referência ao PV executando o comando kubectl delete pvc [PVC_NAME].

  2. Elimine o pod que referenciou o PVC executando o comando kubectl delete pod [POD_NAME].

  3. Repita o passo 2 devido ao problema do Kubernetes n.º 74374.

O volume do CSI do vSphere não é separado

Este problema ocorre se o privilégio CNS > Searchable não tiver sido concedido ao utilizador do vSphere.

Se encontrar pods bloqueados na fase ContainerCreating com avisos FailedAttachVolume, pode dever-se a uma desassociação falhada num nó diferente.

Para verificar se existem erros de desanexação de CSI, execute o seguinte comando:

kubectl get volumeattachments -o=custom-columns=NAME:metadata.name,DETACH_ERROR:status.detachError.message

O resultado é semelhante ao seguinte exemplo:

NAME                                                                   DETACH_ERROR
csi-0e80d9be14dc09a49e1997cc17fc69dd8ce58254bd48d0d8e26a554d930a91e5   rpc error: code = Internal desc = QueryVolume failed for volumeID: "57549b5d-0ad3-48a9-aeca-42e64a773469". ServerFaultCode: NoPermission
csi-164d56e3286e954befdf0f5a82d59031dbfd50709c927a0e6ccf21d1fa60192d   <none>
csi-8d9c3d0439f413fa9e176c63f5cc92bd67a33a1b76919d42c20347d52c57435c   <none>
csi-e40d65005bc64c45735e91d7f7e54b2481a2bd41f5df7cc219a2c03608e8e7a8   <none>

Para resolver este problema, adicione o privilégio CNS > Searchable à sua conta de utilizador do vCenter. A operação de desassociação é repetida automaticamente até ser bem-sucedida.

O controlador CSI do vSphere não é suportado no anfitrião ESXi

Este problema ocorre quando um anfitrião ESXi no cluster vSphere está a executar uma versão inferior à do ESXi 6.7U3.

A saída de gkectl check-config inclui o seguinte aviso:

The vSphere CSI driver is not supported on current ESXi host versions.
CSI requires ESXi 6.7U3 or above. See logs for ESXi version details.

Para resolver este problema, atualize os seus anfitriões ESXi para a versão 6.7U3 ou posterior.

A criação do volume de CSI falha com o erro NotSupported

Este problema ocorre quando um anfitrião ESXi no cluster vSphere está a executar uma versão inferior à do ESXi 6.7U3.

A saída de kubectl describe pvc inclui o seguinte erro:

Failed to provision volume with StorageClass <standard-rwo>: rpc error:
code = Internal desc = Failed to create volume. Error: CnsFault error:
CNS: Failed to create disk.:Fault cause: vmodl.fault.NotSupported

Para resolver este problema, atualize os seus anfitriões ESXi para a versão 6.7U3 ou posterior.

O volume do CSI do vSphere não é anexado

Este problema conhecido do Kubernetes no controlador CSI do vSphere de código aberto ocorre quando um nó é encerrado, eliminado ou falha.

O resultado de kubectl describe pod tem o seguinte aspeto:

Events:
 Type    Reason                 From                     Message
 ----    ------             ... ----                     -------
 Warning FailedAttachVolume ... attachdetach-controller  Multi-Attach error for volume
                                                         "pvc-xxxxx"
                                                         Volume is already exclusively attached to one
                                                         node and can't be attached to another

Para resolver este problema, conclua os seguintes passos:

  1. Tome nota do nome do PersistentVolumeClaim (PVC) no resultado anterior e encontre os VolumeAttachments associados ao PVC:

    kubectl get volumeattachments | grep pvc-xxxxx
    

    O exemplo de resultado seguinte mostra os nomes dos VolumeAttachments:

    csi-yyyyy   csi.vsphere.vmware.com   pvc-xxxxx   node-zzzzz ...
    
  2. Descreva os VolumeAttachments:

    kubectl describe volumeattachments csi-yyyyy | grep "Deletion Timestamp"
    

    Tome nota da data/hora de eliminação, como no seguinte exemplo de resultado:

    Deletion Timestamp:   2021-03-10T22:14:58Z
    
  3. Aguarde até à hora especificada pela data/hora de eliminação e, em seguida, force a eliminação do VolumeAttachment. Para tal, edite o objeto VolumeAttachment e elimine o finalizador.

    kubectl edit volumeattachment csi-yyyyy
    

    Elimine o finalizador:

    [...]
      Finalizers:
       external-attacher/csi-vsphere-vmware-com
    

O VolumeSnapshot do CSI do vSphere não está pronto devido à versão

Este problema ocorre quando a versão do vCenter Server ou do anfitrião ESXi é inferior à 7.0 Update 3.

O resultado de kubectl describe volumesnapshot inclui erros como no exemplo seguinte:

rpc error: code = Unimplemented desc = VC version does not support snapshot operations.

Para resolver este problema, atualize o vCenter Server e os anfitriões ESXi para a versão 7.0 Update 3 ou posterior.

O VolumeSnapshot do CSI do vSphere não está pronto, número máximo de instantâneos por volume

Este problema ocorre quando o número de instantâneos por volume atinge o valor máximo para o controlador de armazenamento de contentores do vSphere. O valor predefinido é três.

O resultado de kubectl describe volumesnapshot inclui os erros, como no exemplo seguinte:

rpc error: code = FailedPrecondition desc = the number of snapshots on the source volume 5394aac1-bc0a-44e2-a519-1a46b187af7b reaches the configured maximum (3)

Para resolver este problema, use os seguintes passos para atualizar o número máximo de cópias instantâneas por volume:

  1. Obtenha o nome do segredo que fornece a configuração do vSphere ao controlador do CSI do vSphere:

    kubectl --kubeconfig <var class="edit">ADMIN_CLUSTER_KUBECONFIG</var> get deployment vsphere-csi-controller \
        --namespace <var class="edit">USER_CLUSTER_NAME</var> \
        --output json \
        | jq -r '.spec.template.spec.volumes[] \
        | select(.name=="vsphere-secret") .secret.secretName'
    

    Substitua o seguinte:

    • ADMIN_KUBECONFIG: o caminho do ficheiro kubeconfig do cluster de administrador
    • USER_CLUSTER_NAME: o nome do seu cluster de utilizadores
  2. Obtenha o valor de data.config do Secret, descodifique-o em base64 e guarde-o num ficheiro com o nome config.txt:

    kubectl --kubeconfig <var class="edit">ADMIN_CLUSTER_KUBECONFIG</var> get secret <var class="edit">SECRET_NAME</var> \
        --namespace <var class="edit">USER_CLUSTER_NAME </var> \
        --output json | jq -r '.data["config"]' | base64 -d > config.txt
    

    Substitua SECRET_NAME pelo nome do segredo do passo anterior.

  3. Abra config.txt para edição:

    Edite ou adicione o campo global-max-snapshots-per-block-volume na secção [Snapshot], como no exemplo seguinte:

    [Global]
    cluster-id = "my-user-cluster"
    insecure-flag = "0"
    user = "my-account.local"
    password = "fxqSD@SZTUIsG"
    [VirtualCenter "my-vCenter"]
    port = "443"
    datacenters = "my-datacenter1"
    [Snapshot]
    global-max-snapshots-per-block-volume = 4
    
  4. Elimine e volte a criar o segredo:

    kubectl --kubeconfig <var class="edit">ADMIN_CLUSTER_KUBECONFIG</var> delete secret <var class="edit">SECRET_NAME</var> \
        --namespace <var class="edit">USER_CLUSTER_NAME</var>
    
    kubectl --kubeconfig <var class="edit">ADMIN_CLUSTER_KUBECONFIG</var> create secret generic <var class="edit">SECRET_NAME</var> \
        --namespace <var class="edit">USER_CLUSTER_NAME</var> \
        --from-file=config
    
  5. Reinicie a implementação do vsphere-csi-controller:

    kubectl --kubeconfig <var class="edit">ADMIN_CLUSTER_KUBECONFIG</var> rollout restart deployment vsphere-csi-controller \
        --namespace <var class="edit">USER_CLUSTER_NAME</var>
    

O que se segue?

Se precisar de assistência adicional, contacte o apoio ao cliente do Google Cloud.

Também pode consultar o artigo Receber apoio técnico para mais informações sobre recursos de apoio técnico, incluindo o seguinte: