AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
如何使用 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 年前