跳至內容

如何使用 Amazon EBS Multi-Attach 將同一個磁碟區掛載到 Amazon EKS 中的多個工作負載?

3 分的閱讀內容
0

我想要使用 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

將 Kubernetes 磁碟區儲存體與 Amazon EBS 搭配使用

什麼是 Amazon Elastic File System?