如何對 Amazon EKS 中 EBS 磁碟區掛載的問題進行疑難排解?

上次更新日期:2022 年 3 月 24 日

在 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集中掛載 Amazon Elastic Block Store (Amazon EBS) 磁碟區時,我的 Pod 中收到以下錯誤:

「磁碟區等待連接或掛載 Pod 的逾時過期」

如何對此問題進行疑難排解?

解決方案

在開始執行以下疑難排解步驟之前,請確認您具有以下內容:

  • 您的 "ebs-csi-controller-sa" 服務帳戶 IAM 角色所需的 AWS Identity and Access Management (IAM) 許可
  • 在與 Pod 相同的命名空間中存在有效的 PersistentVolumeClaim (PVC)。
  • 使用樹狀結構內佈建程式 "kubernetes.io/aws-ebs" 或 Amazon EBS Container Storage Interface (CSI) 驅動程式佈建程式 "ebs.csi.aws.com" 的有效 EBS 儲存類別定義。

確認 Amazon EBS CSI 驅動程式控制器和節點 Pod 是否正在執行

Amazon EBS CSI 驅動程式由作為部署執行的控制器 Pod 和作為常駐程式集執行的節點 Pod 組成。執行以下命令以確認這些 Pod 是否在您的叢集中執行:

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

注意:Amazon EBS CSI 驅動程式在 Windows 工作節點或 EKS Fargate 上不受支援。

確保安裝的 Amazon EBS CSI 驅動程式版本與您叢集的 Kubernetes 版本相容

確認 PVC 在繫結至 EBS 永續磁碟區時是否遇到問題

若要確認 PVC 是否遇到問題,請執行以下命令檢視事件。在以下範例命令中,將 pvc-namenamespace 取代為您環境的正確值。

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

如果您使用的是動態磁碟區佈建,則請檢閱傳回的事件,以確定磁碟區佈建是成功還是失敗。您還可以看到 PVC 繫結之相應的永續磁碟區名稱,如以下範例所示:

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

如果佈建失敗,請在事件中尋找錯誤訊息。

檢閱 Amazon EBS CSI 控制器 Pod 的日誌

檢查控制器 Pod 日誌以了解掛載失敗的原因。如果磁碟區在建立過程中出現故障,請參閲 ebs-plugin 和 csi-provisioner 日誌。執行以下命令來擷取 ebs-plugin 容器日誌:

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

執行以下命令以擷取 csi-provisioner 容器日誌:

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

如果 EBS 磁碟區無法連接到 Pod,則請檢閱 csi-attacher 日誌以了解原因。執行以下命令以擷取 csi-attacher 容器日誌:

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

確認 Amazon EBS CSI 驅動程式控制器服務帳戶是否已使用正確的 IAM 角色註釋,以及 IAM 角色是否具有所需的許可

您的 PVC 事件或 ebs-csi-controller 日誌中未授權的錯誤是由以下原因造成的:

1.    執行以下命令以確定 ebs-csi-controller Pod 使用的服務帳戶是否具有正確的註釋:

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

確認是否存在以下註釋:

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

2.    確認是否為叢集建立了 IAM OIDC 提供商,以及 IAM 角色是否具有執行 EBS API 呼叫所需的許可。此外,請確認 IAM 角色的信任政策是否信任服務帳戶 ebs-csi-controller-sa

3.    檢閱您帳戶的 AWS CloudTrail 日誌,以確認是否正在呼叫 CreateVolume、AttachVolume 和 DetachVolume。同時檢閱 CloudTrail 日誌以確定哪個主體進行了呼叫。此資訊可協助您確定是控制器還是工作節點 IAM 角色正在使用服務帳戶 IAM 角色。

確認永續磁碟區的節點親和性

所建立的每個永續磁碟區都具有節點親和性,限制將永續磁碟區連接至單一可用區域內的節點。這是因為 EBS 磁碟區只能連接至在其所建立之同一可用區域中執行的容器或節點。如果排定至一個可用區域中節點的 Pod 嘗試使用不同可用區域中的 EBS 永續磁碟區,則您會收到類似於以下內容的錯誤:

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

為避免這種情況,請使用 StatefulSets 而不是 Deployment,以便在與 Pod 相同的可用區域中為 StatefulSets 的每個 Pod 建立唯一的 EBS 磁碟區。

您可以透過執行以下命令來確認永續磁碟區的節點親和性。在以下範例命令中,將 persistent-volume-name 取代為磁碟區的名稱。

kubectl describe pv <persistent-volume-name>

注意:請記住,您無法將 EBS 磁碟區掛載到在兩個不同工作節點上執行的兩個不同 Pod 上。EBS 磁碟區可以連接到一個節點上執行的 Pod,但不能同時連接到另一個節點。如果您嘗試將 EBS 磁碟區連接到不同工作節點上的兩個不同的 Pod,則該 Pod 將失敗,並且您會收到類似於以下內容的錯誤:

"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"

確保您的 EBS 控制器 Pod 具有與 EC2 API 的連線

如果您在 EBS-CSI-Controller 日誌中看到指示連線逾時的錯誤,則 EBS CSI 控制器可能未連接到 EC2 API。如果控制器 Pod 存在與 EC2 API 的連線問題,則在建立 PVC 時會見到類似於以下內容的錯誤:

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

若要更正此錯誤,請確認 EBS 控制器 Pod 的子網路是否連線至 EC2 API。如果您正在使用 HTTP/HTTPS 代理執行私有叢集,則請確認您的 EBS CSI 控制器 Pod 已設定為使用 HTTP/HTTPS 代理。EBS CSI 驅動程式的 Helm 安裝支援 HTTP/HTTPS 代理設定。


此文章是否有幫助?


您是否需要帳單或技術支援?