Fehlerbehebung bei Speicherproblemen

Dieses Dokument enthält Hinweise zur Behebung von Speicherproblemen.

Wenn Sie weitere Unterstützung benötigen, wenden Sie sich an den Cloud Customer Care.

Volume kann nicht angehängt werden

Dieses Problem kann auftreten, wenn ein virtuelles Laufwerk an die falsche virtuelle Maschine angehängt ist, und durch das Problem 32727 in Kubernetes 1.12 verursacht werden.

Die Ausgabe von gkectl diagnose cluster sieht in etwa so aus:

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

In diesem Beispiel hängt einer oder mehrere Pods im Status ContainerCreating fest und zeigen Warnungen wie die folgende Beispielausgabe an:

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

Wenn ein virtuelles Laufwerk an die falsche virtuelle Maschine angehängt ist, können Sie es mit den folgenden Schritten manuell trennen:

  1. Knoten leeren Optional können Sie die Flags --ignore-daemonsets und --delete-local-data in den Befehl kubectl Drain einfügen.

  2. Schalten Sie die VM aus.

  3. Entfernen Sie das Volume, indem Sie die VM-Hardwarekonfiguration in vCenter entsprechend bearbeiten.

  4. Schalten Sie die VM ein.

  5. Trennen Sie die Knotenverbindung.

Das Volume geht verloren

Dieses Problem kann auftreten, wenn ein virtuelles Laufwerk endgültig gelöscht wurde. Zu dieser Situation kann es kommen, wenn ein Operator ein virtuelles Laufwerk oder die VM, an die das Laufwerk angehängt ist, manuell löscht.

Wenn Sie den Fehler „Nicht gefunden“ im Zusammenhang mit Ihrer VMDK-Datei sehen, wurde das virtuelle Laufwerk wahrscheinlich dauerhaft gelöscht.

Die Ausgabe von gkectl diagnose cluster sieht so aus:

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

Mindestens ein Pod hängt im Status ContainerCreating fest, wie in der folgenden Beispielausgabe gezeigt:

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

Um dieses Problem zu vermeiden, verwalten Sie Ihre virtuellen Maschinen, wie unter Größe eines Nutzerclusters anpassen und Cluster aktualisieren beschrieben.

Um dieses Problem zu beheben, können Sie zugehörige Kubernetes-Ressourcen manuell bereinigen:

  1. Löschen Sie mit dem Befehl kubectl delete pvc [PVC_NAME] den PVC, der auf den PV verwiesen hat.

  2. Löschen Sie durch Ausführen von kubectl delete pod [POD_NAME] den Pod, der auf den PVC verwiesen hat.

  3. Wiederholen Sie Schritt 2 aufgrund des Kubernetes-Problems 74374.

vSphere-CSI-Volume kann nicht getrennt werden

Dieses Problem tritt auf, wenn die Berechtigung CNS > Searchable dem vSphere-Nutzer nicht gewährt wurde.

Wenn Pods in der ContainerCreating-Phase mit FailedAttachVolume-Warnungen hängen, kann dies auf eine fehlgeschlagene Trennung auf einem anderen Knoten zurückzuführen sein.

Führen Sie den folgenden Befehl aus, um nach CSI-Trennfehlern zu suchen:

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

Die Ausgabe sieht etwa so aus wie im folgenden Beispiel.

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>

Fügen Sie Ihrem vCenter-Nutzerkonto die Berechtigung CNS > Searchable hinzu, um dieses Problem zu beheben. Der Trennvorgang wird automatisch wiederholt, bis er erfolgreich ist.

vSphere-CSI-Treiber wird auf dem ESXi-Host nicht unterstützt.

Dieses Problem tritt auf, wenn ein ESXi-Host im vSphere-Cluster eine niedrigere Version als ESXi 6.7U3 ausführt.

Die Ausgabe von gkectl check-config enthält die folgende Warnung:

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.

Führen Sie zur Behebung dieses Problems ein Upgrade Ihrer ESXi-Hosts auf Version 6.7U3 oder höher durch.

Erstellen von CSI-Volumes schlägt mit dem Fehler NotSupported fehl

Dieses Problem tritt auf, wenn ein ESXi-Host im vSphere-Cluster eine niedrigere Version als ESXi 6.7U3 ausführt.

Die Ausgabe von kubectl describe pvc enthält den folgenden Fehler:

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

Führen Sie zur Behebung dieses Problems ein Upgrade Ihrer ESXi-Hosts auf Version 6.7U3 oder höher durch.

vSphere-CSI-Volume kann nicht angehängt werden

Dieses bekannte Kubernetes-Problem im Open-Source-vSphere-CSI-Treiber tritt auf, wenn ein Knoten heruntergefahren, gelöscht oder ausfällt.

Die Ausgabe von kubectl describe pod sieht so aus:

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

So beheben Sie das Problem:

  1. Notieren Sie sich den Namen von PersistentVolumeClaim (PVC) in der vorherigen Ausgabe und suchen Sie die VolumeAttachments, die dem PVC zugeordnet sind:

    kubectl get volumeattachments | grep pvc-xxxxx
    

    Die folgende Beispielausgabe zeigt die Namen der VolumeAttachments:

    csi-yyyyy   csi.vsphere.vmware.com   pvc-xxxxx   node-zzzzz ...
    
  2. Beschreiben Sie die Volume-Anhänge:

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

    Notieren Sie sich den Zeitstempel des Löschvorgangs, wie in der folgenden Beispielausgabe gezeigt:

    Deletion Timestamp:   2021-03-10T22:14:58Z
    
  3. Warten Sie, bis die durch den Zeitstempel angegebene Zeit erreicht ist, und erzwingen Sie dann das Löschen des VolumeAttachment. Bearbeiten Sie dazu das VolumeAttachment-Objekt und löschen Sie den Finalizer.

    kubectl edit volumeattachment csi-yyyyy
    

    Löschen Sie den Finaler:

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

vSphere-CSI-VolumeSnapshot aufgrund der Version nicht bereit

Dieses Problem tritt auf, wenn die Version von vCenter Server oder ESXi-Host niedriger als 7.0 Update 3 ist.

Die Ausgabe von kubectl describe volumesnapshot enthält Fehler wie im folgenden Beispiel:

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

Um dieses Problem zu beheben, führen Sie ein Upgrade von vCenter Server und den ESXi-Hosts auf Version 7.0 Update 3 oder höher durch.

vSphere-CSI-VolumeSnapshot nicht bereit, maximale Anzahl von Snapshots pro Volume

Dieses Problem tritt auf, wenn die Anzahl der Snapshots pro Volume den Maximalwert für den vSphere Container Storage-Treiber erreicht. Der Standardwert ist drei.

Die Ausgabe von kubectl describe volumesnapshot enthält Fehler wie im folgenden Beispiel:

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

Führen Sie die folgenden Schritte aus, um die maximale Anzahl von Snapshots pro Volume zu aktualisieren, um dieses Problem zu beheben:

  1. Rufen Sie den Namen des Secrets ab, das dem vSphere-CSI-Controller die vSphere-Konfiguration bereitstellt:

    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'
    

    Ersetzen Sie Folgendes:

    • ADMIN_KUBECONFIG: Pfad der Datei "kubeconfig" Ihres Administratorclusters
    • USER_CLUSTER_NAME: der Name Ihres Nutzerclusters
  2. Rufen Sie den Wert von data.config aus dem Secret ab, decodieren Sie ihn mit base64 und speichern Sie ihn in einer Datei mit dem Namen 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
    

    Ersetzen Sie SECRET_NAME durch den Namen des Secrets aus dem vorherigen Schritt.

  3. Öffnen Sie config.txt zum Bearbeiten:

    Bearbeiten Sie das Feld global-max-snapshots-per-block-volume im Abschnitt [Snapshot] oder fügen Sie es hinzu, wie im folgenden Beispiel gezeigt:

    [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. Löschen Sie das Secret und erstellen Sie es neu:

    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. Starten Sie das Deployment vsphere-csi-controller neu:

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

Nächste Schritte

Wenn Sie weitere Unterstützung benötigen, wenden Sie sich an den Cloud Customer Care.