Solucionar problemas de almacenamiento

En este documento se ofrecen instrucciones para solucionar problemas de almacenamiento.

No se puede adjuntar el volumen

Este problema puede producirse si se adjunta un disco virtual a la máquina virtual incorrecta y puede deberse al problema n.º 32727 de Kubernetes 1.12.

El resultado de gkectl diagnose cluster es similar al siguiente ejemplo:

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

En este ejemplo, uno o varios pods están en el estado ContainerCreating y muestran advertencias como las del siguiente ejemplo:

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'.

Si un disco virtual está conectado a la máquina virtual incorrecta, puedes desconectarlo manualmente siguiendo estos pasos:

  1. Drenar un nodo. También puedes incluir las marcas --ignore-daemonsets y --delete-local-data en tu comando kubectl drain.

  2. Apaga la máquina virtual.

  3. Edita la configuración de hardware de la máquina virtual en vCenter para quitar el volumen.

  4. Enciende la VM.

  5. Deja de acordonar el nodo.

El volumen se ha perdido

Este problema puede producirse si se ha eliminado de forma permanente un disco virtual. Esto puede ocurrir si un operador elimina manualmente un disco virtual o la máquina virtual a la que está conectado el disco.

Si ves un error "no encontrado" relacionado con tu archivo VMDK, es probable que el disco virtual se haya eliminado definitivamente.

El resultado de gkectl diagnose cluster es similar al siguiente:

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

Uno o varios pods están en el estado ContainerCreating, como se muestra en el siguiente ejemplo de salida:

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 se produzca este problema, gestiona tus máquinas virtuales como se describe en los artículos Modificar el tamaño de un clúster de usuarios y Actualizar clústeres.

Para solucionar este problema, puedes limpiar manualmente los recursos de Kubernetes relacionados:

  1. Elimina el PVC que hacía referencia al PV ejecutando kubectl delete pvc [PVC_NAME].

  2. Elimina el pod que hacía referencia al PVC ejecutando kubectl delete pod [POD_NAME].

  3. Repite el paso 2 debido al problema de Kubernetes #74374.

No se puede separar el volumen de CSI de vSphere

Este problema se produce si no se ha concedido el privilegio CNS > Searchable al usuario de vSphere.

Si ves que los pods se quedan atascados en la fase ContainerCreating con advertencias de FailedAttachVolume, puede deberse a que no se han podido separar en otro nodo.

Para comprobar si hay errores de separación de CSI, ejecuta el siguiente comando:

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

La salida es similar al siguiente ejemplo:

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 solucionar este problema, añade el privilegio CNS > Searchable a tu cuenta de usuario de vCenter. La operación de separación se vuelve a intentar automáticamente hasta que se realiza correctamente.

El controlador de CSI para vSphere no es compatible con el host ESXi

Este problema se produce cuando un host ESXi del clúster de vSphere ejecuta una versión anterior a ESXi 6.7U3.

La salida de gkectl check-config incluye la siguiente advertencia:

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 solucionar este problema, actualiza tus hosts ESXi a la versión 6.7U3 o a una posterior.

No se puede crear el volumen de CSI y se produce un error NotSupported

Este problema se produce cuando un host ESXi del clúster de vSphere ejecuta una versión anterior a ESXi 6.7U3.

El resultado de kubectl describe pvc incluye el siguiente error:

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 solucionar este problema, actualiza tus hosts ESXi a la versión 6.7U3 o a una posterior.

No se puede adjuntar el volumen de CSI de vSphere

Este problema conocido de Kubernetes en el controlador CSI de vSphere de código abierto se produce cuando se apaga, se elimina o falla un nodo.

El resultado de kubectl describe pod tiene este aspecto:

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 solucionar este problema, siga estos pasos:

  1. Anota el nombre de PersistentVolumeClaim (PVC) en el resultado anterior y busca los VolumeAttachments asociados al PVC:

    kubectl get volumeattachments | grep pvc-xxxxx
    

    En el siguiente ejemplo de salida se muestran los nombres de los VolumeAttachments:

    csi-yyyyy   csi.vsphere.vmware.com   pvc-xxxxx   node-zzzzz ...
    
  2. Describe los VolumeAttachments:

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

    Anota la marca de tiempo de la eliminación, como en el siguiente ejemplo de resultado:

    Deletion Timestamp:   2021-03-10T22:14:58Z
    
  3. Espera hasta la hora especificada en la marca de tiempo de eliminación y, a continuación, elimina el VolumeAttachment. Para ello, edita el objeto VolumeAttachment y elimina el finalizador.

    kubectl edit volumeattachment csi-yyyyy
    

    Elimina el finalizador:

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

VolumeSnapshot de CSI de vSphere no está listo debido a la versión

Este problema se produce cuando la versión de vCenter Server o del host ESXi es anterior a la 7.0 Update 3.

El resultado de kubectl describe volumesnapshot incluye errores como el del siguiente ejemplo:

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

Para resolver este problema, actualiza vCenter Server y los hosts ESXi a la versión 7.0 Update 3 o a una posterior.

VolumeSnapshot de CSI de vSphere no está listo, se ha alcanzado el número máximo de capturas por volumen

Este problema se produce cuando el número de snapshots por volumen alcanza el valor máximo del controlador de almacenamiento de contenedores de vSphere. El valor predeterminado es tres.

El resultado de kubectl describe volumesnapshot incluye errores como los del siguiente ejemplo:

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

Para solucionar este problema, siga estos pasos para actualizar el número máximo de instantáneas por volumen:

  1. Obtén el nombre del secreto que proporciona la configuración de vSphere al controlador de CSI de 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'
    

    Haz los cambios siguientes:

    • ADMIN_KUBECONFIG: la ruta del archivo kubeconfig de tu clúster de administrador
    • USER_CLUSTER_NAME: el nombre de tu clúster de usuarios
  2. Obtén el valor de data.config del secreto, decodifícalo en Base64 y guárdalo en un archivo llamado 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
    

    Sustituye SECRET_NAME por el nombre del secreto del paso anterior.

  3. Abre config.txt para editarla:

    Edita o añade el campo global-max-snapshots-per-block-volume en la sección [Snapshot], como en el ejemplo siguiente:

    [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. Elimina y vuelve a crear el secreto:

    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. Reinicia la implementación de 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>
    

Siguientes pasos

Si necesitas más ayuda, ponte en contacto con el servicio de atención al cliente de Cloud.

También puedes consultar la sección Obtener asistencia para obtener más información sobre los recursos de asistencia, incluidos los siguientes: