如何對 Amazon EKS 中 EBS 磁碟區掛載的問題進行疑難排解?
在 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集中掛載 Amazon Elastic Block Store (Amazon EBS) 磁碟區時,我的 Pod 中收到以下錯誤:"Timeout expired waiting for volumes to attach or mount for 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-name 和 namespace 取代為您環境的正確值。
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 日誌中未授權的錯誤是由以下原因造成的:
- IAM 角色中缺少許可。
- 與服務帳戶關聯的 IAM 角色不正確。
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 代理設定。

相關內容
- 已提問 4 個月前lg...
- 已提問 4 個月前lg...
- 已提問 4 個月前lg...
- 已提問 4 個月前lg...
- 已提問 4 個月前lg...
- AWS 官方已更新 1 個月前
- AWS 官方已更新 10 個月前
- AWS 官方已更新 10 個月前
- AWS 官方已更新 2 個月前