如何使用 Amazon EBS Multi-Attach 將同一個磁碟區掛載到 Amazon EKS 中的多個工作負載?
我想要使用 Amazon Elastic Block Store (Amazon EBS) Multi-Attach 來處理 Amazon Elastic Kubernetes Service (Amazon EKS) 中跨多個叢集的多個工作負載。
簡短說明
Amazon EBS Multi-Attach 可讓您將單一佈建 IOPS SSD (io1 或 io2) 磁碟區連接至相同可用區域中的多個執行個體。您可以使用 Multi-Attach,在不同 Amazon EKS 叢集中的多個工作負載之間共用永續性儲存體。
解決方法
注意: 如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請務必使用最新版 AWS CLI。
重要: XFS 和 EXT4 等標準檔案系統不是為了讓多個伺服器同時存取而設計。請使用叢集式檔案系統,確保生產工作負載的資料恢復能力和可靠性。
在開始之前,請確認所需的 Amazon EKS 叢集中已安裝 Amazon EBS CSI 驅動程式。
如需安裝 Amazon EBS CSI 驅動程式的詳細資訊,請參閱將 Kubernetes 磁碟區儲存體與 Amazon EBS 搭配使用。
注意: 啟用 Multi-Attach 的磁碟區最多可掛載到同一可用區域內,以 Nitro 系統為基礎的 16 個 Linux 執行個體。
若要使用 Amazon EBS Multi-Attach,將相同磁碟區連接至多個叢集中的多個工作負載,請完成以下步驟:
佈建 Amazon EBS 磁碟區
執行以下 create-volume AWS CLI 命令:
aws ec2 create-volume --volume-type io2 --multi-attach-enabled --size 10 --iops 2000 --region example-region --availability-zone example-az --tag-specifications 'ResourceType=volume,Tags=[{Key=purpose,Value=prod},{Key=Name,Value=multi-attach-eks}]'
注意: 將 example-region 替換為所需的 AWS 區域。將 example-az 替換為所需的可用區域。
重要: 如果 io2 磁碟區未掛載到任何執行個體,則可在建立後啟用 Amazon EBS Multi-Attach。io1 磁碟區在建立後無法啟用 Amazon EBS Multi-Attach。
擷取磁碟區 ID
執行以下 describe-volumes AWS CLI 命令:
aws ec2 describe-volumes --filters "Name=tag:Name,Values=multi-attach-eks*" --query "Volumes[*].{ID:VolumeId}" --region example-region
注意: 將 example-region 替換為所需的 AWS 區域。
建立儲存類別
使用以下組態建立儲存類別資訊清單:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: io2 provisioner: ebs.csi.aws.com volumeBindingMode: WaitForFirstConsumer parameters: type: io2 iops: "2000"
套用儲存類別:
kubectl apply -f storageclass.yaml
在叢集 A 中佈建永續性工作負載
建立以下名為 workloadA.yaml 的資訊清單:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: example-pv-claim-name-a spec: storageClassName: io2 volumeName: example-pv-name-a accessModes: - ReadWriteMany volumeMode: Block resources: requests: storage: 10Gi --- apiVersion: v1 kind: Pod metadata: name: example-pod-a spec: containers: - name: <example-pod-container-name> image: centos:6.6 command: ["/bin/sh"] args: ["-c", "while true; do echo $(date -u) on pod A >> /data/out.txt; sleep 15; done"] volumeDevices: - name: example-volume-device-name devicePath: "/dev/xvda" volumes: - name: example-volume-device-name persistentVolumeClaim: claimName: example-pv-claim-name-a --- apiVersion: v1 kind: PersistentVolume metadata: name: example-pv-name-a spec: storageClassName: io2 volumeMode: Block accessModes: - ReadWriteMany capacity: storage: 10Gi csi: driver: ebs.csi.aws.com fsType: ext4 volumeHandle: example-preceding-volume-id nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.ebs.csi.aws.com/zone operator: In values: - example-az
注意: 將資訊清單中的所有範例字串替換為所需的值。
使用相同的磁碟區 ID 在叢集 B 中建立另一個工作負載
建立以下名為 workloadB.yaml 的資訊清單:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: example-pv-claim-name-b spec: storageClassName: io2 volumeName: example-pv-name-b accessModes: - ReadWriteMany volumeMode: Block resources: requests: storage: 10Gi --- apiVersion: v1 kind: Pod metadata: name: example-pod-b spec: containers: - name: example-pod-container-name image: centos:6.6 command: ["/bin/sh"] args: ["-c", "while true; do echo $(date -u) on pod B >> /data/out.txt; sleep 15; done"] volumeDevices: - name: example-volume-device-name devicePath: "/dev/xvda" volumes: - name: example-volume-device-name persistentVolumeClaim: claimName: example-pv-claim-name-b --- apiVersion: v1 kind: PersistentVolume metadata: name: example-pv-name-b spec: storageClassName: io2 volumeMode: Block accessModes: - ReadWriteMany capacity: storage: 10Gi csi: driver: ebs.csi.aws.com fsType: ext4 volumeHandle: example-preceding-volume-id nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.ebs.csi.aws.com/zone operator: In values: - example-az
注意: 將所有範例字串替換為所需的值。
將 kubectl 內容切換到叢集 B,然後部署工作負載:
kubectl config use-context example-clusterB-context kubectl apply -f workloadB.yaml
注意: 將 example-clusterB-context 替換為您的叢集 B 內容。
確認 Pod 正在執行,且具有相同內容
跨不同叢集驗證身分,然後執行以下命令:
kubectl get pods
叢集 A 的範例輸出:
NAME READY STATUS RESTARTS AGE example-pod-a 1/1 Running 0 18m
叢集 B 的範例輸出:
NAME READY STATUS RESTARTS AGE example-pod-b 1/1 Running 0 3m13s
對於 example-pod-a,請執行以下命令以檢視寫入儲存體的內容:
kubectl exec -it example-pod-a -- cat /data/out.txt
範例輸出:
Fri Sep 22 12:39:04 UTC 2024 on example-pod-a Fri Sep 22 12:39:19 UTC 2024 on example-pod-a Fri Sep 22 12:39:34 UTC 2024 on example-pod-a
對於 example-pod-b,請執行以下命令,以讀取寫入與 example-pod-a 相同儲存體中的內容:
kubectl logs -f example-pod-b
範例輸出:
Fri Sep 22 12:39:04 UTC 2024 on example-pod-b Fri Sep 22 12:39:19 UTC 2024 on example-pod-b Fri Sep 22 12:39:34 UTC 2024 on example-pod-b
相關資訊
使用 Multi-Attach 將 EBS 磁碟區連接至多個 EC2 執行個體
為 Amazon EBS 磁碟區啟用 Multi-Attach
- 語言
- 中文 (繁體)

相關內容
已提問 4 年前