如何在 Amazon EKS 中建立使用 EBS CSI 驅動程式的拓撲感知磁碟區佈建並對其進行疑難排解?

3 分的閱讀內容
0

我想要在使用 Amazon Elastic Block Store (Amazon EBS) 元件的 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集中佈建拓撲感知磁碟區。

簡短描述

若要在使用 Amazon EBS 元件的 Amazon EKS 中設定和疑難排解使用 Amazon EBS 元件的雲端基礎設施拓撲,請完成以下步驟:

  1. 檢查 EBS CSI 附加元件是否已正確設定。
  2. 設定具有拓撲感知實作的儲存區類別。
  3. 建立 Pod 和工作負載,然後測試拓撲感知案例。
  4. 疑難排解 EBS CSI 控制器錯誤。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確定您使用的是最新的 AWS CLI 版本

檢查 EBS CSI 附加元件是否已正確設定

**注意:**最佳作法是使用 EBS CSI 佈建程式 ebs.csi.aws.com 進行 EBS 磁碟區佈建。此外,在實作拓撲感知磁碟區時,請使用 EBS CSI 佈建程式,而非樹狀 Kubernete 佈建程式 kubernetes.io/aws-ebs

若要檢查 EBS CSI 附加元件是否已正確設定,請完成下列步驟:

1.    檢查是否已安裝 CSI 驅動程式。如果尚未安裝,請參閱 Amazon EBS CSI 驅動程式以安裝 CSI 驅動程式。

2.    檢查服務帳戶上的 AWS 身分和存取管理 (IAM) 角色是否具有最低 EBS 磁碟區動作權限。

**注意:**您必須使用服務帳戶的 IAM 角色 (IRSA) 為服務帳戶加上註解。如果您未使用 IRSA 為服務帳戶註釋,則依預設,Amazon EBS CSI 驅動程式會在工作者節點上擔任 IAM 角色。如果 CSI 驅動程式預設為工作者節點上的 IAM 角色,請在 AWS 管理主控台中設定所需的 IAM 角色權限。

設定具有拓撲感知實作的儲存區類別

1.    執行下列命令以部署儲存區類別。根據您的特定部署需求,視需要編輯清單檔案。

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/storageclass/manifests/storageclass.yaml

範例清單檔案:

**注意:**將清單檔案中的屬性取代為特定於您的用例的屬性。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ebs-sc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
  csi.storage.k8s.io/fstype: xfs
  type: io1
  iopsPerGB: "50"
  encrypted: "true"
allowedTopologies:
- matchLabelExpressions:
  - key: topology.ebs.csi.aws.com/zone
    values:
    - us-east-2c

**注意:**對於拓撲感知實作,請務必設定 allowedTopologies 選項。刪除此選項會導致推斷正確的可用區域,而 Amazon EBS CSI 控制器會建立排定 Pod 的磁碟區。

2.    使用下列其中一個選項來建立 pv-claim:

(選項 1) 建立 pv-claim,要求具有已部署儲存區類別清單檔案中指定之設定檔類型的磁碟區:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/storageclass/manifests/claim.yaml

(選項 2) 建立使用持續性磁碟區清單檔案中指定的可用 EBS 磁碟區的 pv-claim。請務必將選項 storageClassname: 修改為空字串 **、「」和 **,並視需要修改 nodeAffinity block

kubectl apply -f https://github.com/kubernetes-sigs/aws-ebs-csi-driver/tree/master/examples/kubernetes/static-provisioning/manifests

**注意:**對於選項 1 或選項 2,如果磁碟區的可用區域中無法使用節點,則部署會失敗。這是因為排程器無法動態調整為拓撲限制。

建立 Pod 和工作負載,並測試拓撲感知案例

建立 Pod

1.    建立使用先前 pv-claim 的測試 Pod :

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/examples/kubernetes/storageclass/manifests/pod.yaml

注意:當您在儲存區類別或持續性磁碟區內的 allowedTopologies 中使用 topology.ebs.csi.aws.com/zone 區域時, Pod 會放置在組態清單檔案中指定的可用區域中。如果該可用區域中沒有可用的節點,則 Pod 會停在擱置狀態。

2.    執行下列 get 和 describe Pod 命令,以檢查部署的狀態:

kubectl get pod,pvc,pv
kubectl describe pod <EXAMPLE_POD_NAME>

**注意:**將 EXAMPLE_POD_NAME 取代為您的 Pod 名稱。

建立工作負載

1.    執行下列命令,以建立使用先前 pv-claim 的 statefulSet 工作負載:

kubectl apply -f https://gist.githubusercontent.com/AbeOwlu/b8641d2f58810789986ab775f00c7780/raw/9144ae5385dfd98d4739e99983346fbdd28eaa2d/statefulset.yaml

2.    執行下列 get 和 describe 命令,以檢查 statefulSet 工作負載的狀態:

kubectl get statefulset,pod,pvc,pv
kubectl describe pod <EXAMPLE_POD_NAME>

注意: statefulSet 控制器會建立一些 pv-claim,以滿足 AWS 區域 us-east-2b 和 us-east-2c 中的 Pod 磁碟區的磁碟區請求。 終止時的 StatefulSets 不保證清理持續性磁碟區,這可能會導致無法針對重新排程到另一個可用區域的 statefulSet Pod 重新佈建磁碟區的磁碟區。

測試拓撲感知案例

(選用) 若要測試如何處理另一個可用區域中的節點取代,請透過縮減指定可用區域中的節點來模擬節點重新排列。然後,縱向擴展另一個可用區域中的新節點。完成後,請參閱建立 Pod建立工作負載區段。

模擬部署問題的範例輸出:

from: default-scheduler : message: 0/4 nodes are available: 1 node(s) had volume node affinity conflict, 3 node(s) had taint {eks.amazonaws.com/compute-type: fargate}, that the pod didn't tolerate.

若要更正卡住的 Pod ,請再次縱向擴展指定可用區域中的節點,以解決磁碟區節點相似性衝突錯誤。

注意:在預期可用區域中縱向擴展新節點時,部署可能會因調解器執行失敗而失敗。如需疑難排解步驟,請參閱下一節疑難排解 EBS CSI 控制器錯誤

排解 EBS CSI 控制器錯誤

模擬 Pod 流失和節點回收的 EBS CSI 錯誤範例:

from: default-scheduler : message: 0/5 nodes are available: 1 node(s) didn't find available persistent volumes to bind, 1 node(s) didn't match Pod's node affinity/selector, 3 node(s) had taint {eks.amazonaws.com/compute-type: fargate}, that the pod didn't tolerate

1.    若要隔離問題,請描述 Pod ,並檢閱事件中的錯誤日誌項目。在上述錯誤範例中,訊息會顯示由於節點污染以及拓撲或相似性組態,無法排定五個節點中的四個。此外,在正確可用區域中執行的最後一個節點找不到要繫結的可用持續性磁碟區。

2.    若要隔離此問題,請檢查 pv-claim 繫結的狀態:

kubectl describe persistentvolumeclaim <PVC_NAME>

**注意:**pv-claim 的狀態是 waitingboundinvalid,或 not found。在下列範例中,pv-claim 正在等待驅動程式建立磁碟區。等待時,pv-claim 不會繫結到目標節點。

`from: ebs.csi.aws.com_ebs-csi-controller- : message:  failed to get target node: node "ip-10-0-60-85.ec2.internal" not found`  
`waiting for a volume to be created, either by external provisioner "ebs.csi.aws.com" or manually created by system administrator`

3.    檢查 ebs-csi-controller Pod 中的 csi-provisioner 控制器日誌:

kubectl logs ebs-csi-controller-<RANDOM_HASH> -c csi-provisioner -n kube-system

以下輸出是錯誤事件的範例:

Retrying syncing claim "claim-id", failure 343 error syncing claim "claim-id": failed to get target node: node "ip-10-0-60-85.ec2.internal" not found

注意:如果發生與上述訊息類似的錯誤事件,pv-claim 調解器無法找到選取的目標節點註釋。刪除此註釋,以便 pv-claim 可以成功同步。

4.    若要移除選取的目標節點註解,請執行下列命令。確保將輸出複製並保存到 pv-claim 清單檔案中,以刪除 selected-node 註釋。

kubectl edit  persistentvolumeclaims ebs-claim | grep -v "volume.kubernetes.io/selected-node:"

如果繼續的疑難排解步驟無法解決您的問題,請從隔離的容器工作負載收集日誌,並聯絡 AWS Support。您也可以在 GitHub 儲存庫中搜尋相關問題。

AWS 官方
AWS 官方已更新 10 個月前