Soluciona problemas de almacenamiento

En este documento, se proporcionan instrucciones para solucionar problemas de almacenamiento.

No se puede conectar el volumen

Este problema se puede generar si un disco virtual está conectado a la máquina virtual incorrecta. Puede deberse al problema n.º 32727 en Kubernetes 1.12.

La salida de gkectl diagnose cluster debería verse de la siguiente manera:

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

Uno o más Pods se detienen en el estado ContainerCreating con advertencias como esta:

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

Para solucionar este problema, sigue estos pasos:

Si un disco virtual está conectado a la máquina virtual incorrecta, es posible que debas desconectarlo de forma manual:

  1. Desvía el nodo. Consulta Safely draining a node (Desvío seguro de un nodo). Se recomienda incluir las marcas --ignore-daemonsets y --delete-local-data en el comando kubectl drain.

  2. Apaga la VM.

  3. Edita el archivo de configuración de hardware de la VM en vCenter para quitar el volumen.

  4. Enciende la VM.

  5. Desacordona el nodo

Se perdió el volumen

Este problema puede ocurrir si se borró un disco virtual de forma permanente. Esto puede suceder si un operador borra de forma manual un disco virtual o la máquina virtual a la que está conectado. Si ves un error “no encontrado” relacionado con tu archivo VMDK, es probable que el disco virtual se haya borrado de forma permanente.

La salida de gkectl diagnose cluster debería verse de la siguiente manera:

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 más Pods se quedan en estado ContainerCreating:

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, administra tus máquinas virtuales como se describe en Cambia el tamaño de un clúster de usuarios y Actualiza clústeres.

Para resolver este problema, es posible que tengas que limpiar de forma manual los recursos relacionados de Kubernetes:

  1. Ejecuta kubectl delete pvc [PVC_NAME] para borrar el PVC que hizo referencia al PV.

  2. Ejecuta kubectl delete pod [POD_NAME] para borrar el Pod que hizo referencia al PVC.

  3. Repite el paso 2. Sí, de verdad. Consulta el problema 74374 de Kubernetes.

No se puede desconectar el volumen de CSI de vSphere

Este problema se genera si no se otorgó el privilegio CNS > Searchable al usuario de vSphere.

Si encuentras Pods atascados en la fase ContainerCreating con advertencias FailedAttachVolume, podría deberse a una desconexión con errores en un nodo diferente.

Para verificar los errores de desconexión de CSI, sigue estos pasos:

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

El resultado es similar al siguiente:

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

Para resolver este problema, agrega el privilegio CNS > Searchable a tu cuenta de usuario de vCenter. La operación de desconexión se reintenta automáticamente hasta que se complete de forma correcta.

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

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

El resultado de gkectl check-config incluye esta 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 resolver este problema, actualiza tus hosts de ESXi a la versión 6.7U3 o posterior.

No se pudo crear el volumen de CSI con el error NotSupported

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

En el resultado de kubectl describe pvc, se incluye este error:

Failed to provision volume with StorageClass : 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, actualiza tus hosts de ESXi a la versión 6.7U3 o posterior.

No se pudo adjuntar el volumen de CSI de vSphere

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

La salida de kubectl describe pod debería verse de la siguiente manera:

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, sigue estos pasos:

  1. Toma nota del nombre de PersistentVolumeClaim (PVC) en el resultado anterior y busca los VolumeAttachments asociados con el PVC. Por ejemplo:

    kubectl get volumeattachments | grep pvc-xxxxx
    

    En el resultado, se muestran los nombres de los VolumeAttachments. Por ejemplo:

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

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

    Toma nota de la marca de tiempo de eliminación en el resultado.

    Deletion Timestamp:   2021-03-10T22:14:58Z
    
  3. Espera hasta el tiempo especificado en la marca de tiempo de eliminación y, luego, fuerza la eliminación del VolumeAttachment. Para ello, edita el objeto VolumeAttachment y borra el finalizador. Por ejemplo:

    kubectl edit volumeattachment csi-yyyyy
     Finalizers:
      external-attacher/csi-vsphere-vmware-com
    

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

Este problema ocurre cuando la versión de vCenter Server o del host de ESXi anterior a la 7.0, actualización 3.

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

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

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

La VolumeSnapshot de CSI de vSphere no está lista; cantidad máxima de instantáneas por volumen

Este problema ocurre cuando la cantidad de instantáneas por volumen alcanza el valor máximo para el controlador de Container Storage de vSphere. El valor predeterminado es tres.

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

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, sigue estos pasos a fin de actualizar la cantidad máxima 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 ADMIN_CLUSTER_KUBECONFIG get deployment vsphere-csi-controller \
       --namespace USER_CLUSTER_NAME \
       --output json \
       | jq -r '.spec.template.spec.volumes[] \
       | select(.name=="vsphere-secret") .secret.secretName'
    

    Reemplaza lo siguiente:

    • ADMIN_KUBECONFIG: la ruta de acceso al archivo kubeconfig del clúster de administrador
    • USER_CLUSTER_NAME: es el nombre del clúster de usuario.
  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 ADMIN_CLUSTER_KUBECONFIG get secret SECRET_NAME \
       --namespace USER_CLUSTER_NAME  \
       --output json | jq -r '.data["config"]' | base64 -d > config.txt
    

    Reemplaza SECRET_NAME por el nombre del secreto del paso anterior.

  3. Abre config.txt para editarla:

    Edita o agrega el campo global-max-snapshots-per-block-volume en la sección [Snapshot]. Por ejemplo:

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

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete secret SECRET_NAME \
       --namespace USER_CLUSTER_NAME
    
    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG create secret generic SECRET_NAME \
       --namespace USER_CLUSTER_NAME \
       --from-file=config
    
  5. Reinicia la Deployment vsphere-csi-controller:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG rollout restart deployment vsphere-csi-controller \
       --namespace USER_CLUSTER_NAME