Wie kann ich Probleme mit meinen EBS-Volume-Bindungsbereitstellungen in Amazon EKS beheben?

Letzte Aktualisierung: 22.08.2022

Beim Mounten von Amazon Elastic Block Store (Amazon EBS)-Volumes in meinem Amazon Elastic Kubernetes Service (Amazon EKS)-Cluster erhalte ich in meinen Pods die folgende Fehlermeldung: „Zeitüberschreitung beim Warten auf das Anhängen oder Einhängen von Datenträgern für den Pod abgelaufen“

Lösung

Bevor Sie mit den folgenden Schritten zur Fehlerbehebung beginnen, stellen Sie sicher, dass Sie über Folgendes verfügen:

  • Die erforderlichen AWS-Identity-and-Access-Management (IAM)-Berechtigungen für Ihre IAM-Rolle des Servicekontos „ebs-csi-controller sa“.
  • Ein gültiger PersistentVolumeClaim (PVC) ist im selben Namespace wie der Pod vorhanden.
  • Eine gültige EBS-Speicherklassendefinition mit dem In-Tree-Provisioner „kubernetes.io/aws-ebs“ oder dem Amazon EBS Container Storage Interface (CSI)-Treiber-Provisioner „ebs.csi.aws.com“.

Stellen Sie sicher, dass der Treibercontroller von Amazon EBS CSI und die Knoten-Pods ausgeführt werden

Der Amazon-EBS-CSI-Treiber besteht aus Controller-Pods, die als Bereitstellung ausgeführt werden und Knoten-Pods, die als Daemon-Satz ausgeführt werden. Führen Sie die folgenden Befehle aus, um zu überprüfen, ob diese Pods in Ihrem Cluster ausgeführt werden:

kubectl get all -l app.kubernetes.io/name=aws-ebs-csi-driver -n kube-system

Hinweis: Der Amazon-EBS-CSI-Treiber wird auf Windows-Worker-Knoten oder EKS Fargate nicht unterstützt.

Stellen Sie sicher, dass die installierte Amazon-EBS-CSI-Treiberversion mit der Kubernetes-Version Ihres Clusters kompatibel ist.

Prüfen Sie, ob beim Binden an das persistente EBS-Volume Probleme mit dem PVC gibt

Um zu überprüfen, ob beim PVC Probleme aufgetreten sind, führen Sie den folgenden Befehl aus, um Ereignisse anzuzeigen. Ersetzen Sie im folgenden Beispielbefehl pvc-name und namespace durch die richtigen Werte für Ihre Umgebung.

kubectl describe pvc <pvc-name> -n <namespace>

Wenn Sie die dynamische Volume-Bereitstellung verwenden, überprüfen Sie die zurückgegebenen Ereignisse, um festzustellen, ob die Volume-Bereitstellung erfolgreich war oder fehlgeschlagen ist. Sie können auch den entsprechenden persistenten Volume-Namen sehen, an den das PVC gebunden ist, wie im folgenden Beispiel gezeigt:

Name:          ebs-claim
Namespace:     default
StorageClass:  ebs-sc
Status:        Bound
Volume:        pvc-5cbd76de-6f15-41e4-9948-2bba2574e205
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
               volume.beta.kubernetes.io/storage-provisioner: ebs.csi.aws.com
               volume.kubernetes.io/selected-node: ip-10-0-2-57.ec2.internal
. . . . .
. . . . . 
Events:
  Type    Reason                 Age                    From                                                                                      Message
  ----    ------                 ----                   ----                                                                                      -------
. . . . .
  Normal  Provisioning           5m22s                  ebs.csi.aws.com_ebs-csi-controller-57d4cbb9cc-dr9cd_8f0373e8-4e58-4dd0-b83c-da6f9ad5d5ce  External provisioner is provisioning volume for claim "default/ebs-claim"
  Normal  ProvisioningSucceeded  5m18s                  ebs.csi.aws.com_ebs-csi-controller-57d4cbb9cc-dr9cd_8f0373e8-4e58-4dd0-b83c-da6f9ad5d5ce  Successfully provisioned volume pvc-5cbd76de-6f15-41e4-9948-2bba2574e205

Wenn die Bereitstellung fehlgeschlagen ist, suchen Sie die Fehlermeldung in Ereignissen.

Überprüfen Sie die Protokolle der Amazon-EBS-CSI-Controller-Pods

Überprüfen Sie die Controller-Pod-Protokolle, um die Ursache der Bindungsbereitstellungs-Fehler zu ermitteln. Falls das Volume während der Erstellung ausfällt, lesen Sie das EBS-Plug-In und die csi-Provisioner-Protokolle. Führen Sie die folgenden Befehle aus, um die Container-Protokolle des EBS-Plug-Ins abzurufen:

kubectl logs deployment/ebs-csi-controller -n kube-system -c ebs-plugin
kubectl logs daemonset/ebs-csi-node -n kube-system -c ebs-plugin

Führen Sie den folgenden Befehl aus, um die CSI-Provisioner-Containerprotokolle abzurufen:

kubectl logs deployment/ebs-csi-controller -n kube-system -c csi-provisioner

Wenn die EBS-Volumes nicht an den Pod angefügt werden können, lesen Sie die Protokolle „csi-attacher“, um zu verstehen, warum. Führen Sie den folgenden Befehl aus, um die Container-Protokolle „csi-attacher“ abzurufen:

kubectl logs deployment/ebs-csi-controller -n kube-system -c csi-attacher

Stellen Sie sicher, dass das Treiber-Controller-Servicekonto von Amazon EBS CSI mit der richtigen IAM-Rolle versehen ist und dass die IAM-Rolle über die erforderlichen Berechtigungen verfügt

Unautorisierte Fehler in Ihren PVC-Ereignissen oder in Ihren ebs-csi-Controller-Protokollen werden durch Folgendes verursacht:

1.    Führen Sie den folgenden Befehl aus, um festzustellen, ob das von ebs-csi-Controller-Pods verwendete Servicekonto die richtige Anmerkung hat:

kubectl describe sa ebs-csi-controller-sa -n kube-system

Stellen Sie sicher, dass die folgende Anmerkung vorhanden ist:

eks.amazonaws.com/role-arn = arn:aws:iam::111122223333:role/AmazonEKS_EBS_CSI_DriverRole

2.    Stellen Sie sicher, dass der IAM-OIDC-Anbieter für den Cluster erstellt wurde und dass die IAM-Rolle über die erforderlichen Berechtigungen zum Ausführen von EBS-API-Aufrufen verfügt. Stellen Sie außerdem sicher, dass die Vertrauensrichtlinie der IAM-Rolle dem Servicekonto ebs-csi-controller-sa vertraut.

3.    Überprüfen Sie die AWS-CloudTrail-Protokolle Ihres Kontos, um zu überprüfen, ob die Aufrufe CreateVolume, AttachVolume und DetachVolume getätigt werden. Überprüfen Sie auch die CloudTrail-Protokolle, um festzustellen, welcher Prinzipal die Aufrufe getätigt hat. Mithilfe dieser Informationen können Sie feststellen, ob die IAM-Rolle des Servicekontos vom Controller oder der IAM-Rolle des Worker-Knotens verwendet wird.

Überprüfen Sie die Knotenaffinität des persistenten Volume

Jedes persistente Volume wird mit einer Knotenaffinität erstellt, die das Anfügen persistenter Volumes an Knoten innerhalb einer einzelnen Availability Zone begrenzt. Dies liegt daran, dass EBS-Volumes nur an Pods oder Knoten angefügt werden können, die in derselben Availability Zone laufen, in der sie erstellt wurden. Wenn Pods, die auf Knoten in einer Availability Zone geplant sind, versuchen, das persistente EBS-Volume in einer anderen Availability Zone zu verwenden, wird ein Fehler ähnlich dem folgenden angezeigt:

FailedScheduling: 1 node(s) had volume node affinity conflict

Um dies zu vermeiden, verwenden Sie StatefulSets anstelle der Bereitstellung, sodass für jeden Pod der StatefulSets in derselben Availability Zone wie der Pod ein eindeutiges EBS-Volume erstellt wird.

Sie können die Knotenaffinität des persistenten Volume überprüfen, indem Sie den folgenden Befehl ausführen. Ersetzen Sie im folgenden Beispielbefehl Persistent-Volume-Name durch den Namen Ihres Volumes.

kubectl describe pv <persistent-volume-name>

Hinweis: Denken Sie daran, dass Sie die Bindungsbereitstellung von EBS-Volume nicht an zwei verschiedene Pods durchführen können, die auf zwei verschiedenen Worker-Knoten laufen. Das EBS-Volume kann an Pods angefügt werden, die auf einem Knoten laufen, aber nicht gleichzeitig an einen anderen Knoten angefügt werden. Wenn Sie versuchen, Ihr EBS-Volume an zwei verschiedene Pods auf verschiedenen Worker-Knoten anzuhängen, schlägt der Pod fehl und es wird ein Fehler ähnlich dem folgenden angezeigt:

Warning FailedAttachVolume 2m38s attachdetach-controller Multi-Attach error for volume "pvc-1cccsdfdc8-fsdf6-43d6-a1a9-ea837hf7h57fa" Volume is already exclusively attached to one node and can't be attached to another

Stellen Sie sicher, dass Ihre EBS-Controller-Pods Konnektivität zur EC2-API haben

Wenn in den EBS-CSI-Controller-Protokollen Fehler angezeigt werden, die auf Verbindungstimeouts hinweisen, ist der EBS-CSI-Controller möglicherweise nicht mit der EC2-API verbunden. Wenn die Controller-Pods Verbindungsprobleme mit der EC2-API haben, wird beim Erstellen Ihres PVC ein Fehler ähnlich dem folgenden angezeigt:

Warning   ProvisioningFailed       persistentvolumeclaim/storage-volume-1   failed to provision volume with StorageClass "ebs-sc": rpc error: code = DeadlineExceeded desc = context deadline exceeded

Um diesen Fehler zu beheben, überprüfen Sie, ob die Subnetze der EBS-Controller-Pods mit der EC2-API verbunden sind. Wenn Sie einen privaten Cluster mit einem HTTP/HTTPS-Proxy ausführen, stellen Sie sicher, dass Ihre EBS-CSI-Controller-Pods für die Verwendung des HTTP/HTTPS-Proxys konfiguriert sind. Die Helm-Installation des EBS-CSI-Treibers unterstützt die Einrichtung eines HTTP/HTTPS-Proxys.


War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?