Direkt zum Inhalt

Wie verwende ich Amazon EBS Multi-Attach, um dasselbe Volume an mehrere Workloads in Amazon EKS anzuhängen?

Lesedauer: 5 Minute
0

Ich möchte Amazon Elastic Block Store (Amazon EBS)-Multi-Attach für mehrere Workloads in mehreren Clustern in Amazon Elastic Kubernetes Service (Amazon EKS) verwenden.

Kurzbeschreibung

Amazon EBS Multi-Attach ermöglicht es dir, eine einzelne bereitgestellte IOPS SSD (io1 oder io2)-Volume an mehrere Instances in derselben Availability Zone anzuhängen. Du kannst Multi-Attach verwenden, um persistenten Speicher über mehrere Workloads in verschiedenen Amazon EKS-Clustern zu teilen.

Lösung

Hinweis: Wenn du beim Ausführen von Befehlen der AWS Command Line Interface (AWS CLI) Fehler erhältst, lies Beheben von Fehlern für die AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.

Wichtig: Standard-Dateisysteme wie XFS und EXT4 sind nicht dafür ausgelegt, gleichzeitig von mehreren Servern verwendet zu werden. Verwende ein Cluster-Dateisystem, um Datenresilienz und -zuverlässigkeit für deine Produktions-Workloads sicherzustellen.

Bevor du beginnst, stelle sicher, dass der Amazon EBS CSI-Treiber in den erforderlichen Amazon EKS-Clustern installiert ist.

Weitere Informationen zur Installation des Amazon EBS CSI-Treibers findest du unter Kubernetes-Volume-Speicher mit Amazon EBS verwenden.

Hinweis: Multi-Attach-fähige Volumes können an bis zu 16 Linux-Instances angehängt werden, die auf dem Nitro-System erstellt wurden und sich in derselben Availability Zone befinden.

Um Amazon EBS Multi-Attach zu verwenden, um dasselbe Volume an mehrere Workloads in mehreren Clustern anzuhängen, führe die folgenden Schritte aus:

Bereitstellen eines Amazon EBS-Volumes

Führe den folgenden AWS-CLI-Befehl create-volume aus:

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}]'

Hinweis: Ersetze example-region durch deine gewünschte AWS-Region. Ersetze example-az durch deine gewünschte Availability Zone.

Wichtig: Amazon EBS-Multi-Attach kann für io2-Volumes aktiviert werden, nachdem sie erstellt wurden, sofern sie nicht an Instances angehängt sind. Amazon EBS Multi-Attach kann für io1-Volumes nach der Erstellung nicht aktiviert werden.

Volume-ID abrufen

Führe den folgenden AWS-CLI-Befehl describe-volumes aus:

aws ec2 describe-volumes --filters "Name=tag:Name,Values=multi-attach-eks*" --query "Volumes[*].{ID:VolumeId}" --region example-region

Hinweis: Ersetze example-region durch die erforderliche AWS-Region.

Speicherklasse erstellen

Erstelle ein Speicherklassen-Manifest mit der folgenden Konfiguration:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: io2
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
  type: io2
  iops: "2000"

Wende die Speicherklasse an:

kubectl apply -f storageclass.yaml

Eine persistente Workload in Cluster A bereitstellen

Erstelle das folgende Manifest mit dem Namen 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

Hinweis: Ersetze alle Beispielzeichenfolgen im Manifest durch deine erforderlichen Werte.

Dieselbe Volume-ID verwenden, um eine weitere Workload in Cluster B zu erstellen

Erstelle das folgende Manifest mit dem Namen 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

Hinweis: Ersetze alle Beispielzeichenfolgen durch deine erforderlichen Werte.

Schalte den kubectl-Kontext auf Cluster B um und stelle dann die Workload bereit:

kubectl config use-context example-clusterB-context
kubectl apply -f workloadB.yaml

Hinweis: Ersetze example-clusterB-context durch deinen Cluster-B-Kontext.

Sicherstellen, dass die Pods ausgeführt werden und denselben Inhalt haben

Authentifiziere dich in den verschiedenen Clustern und führe den folgenden Befehl aus:

kubectl get pods

Beispielausgabe für Cluster A:

NAME                         READY   STATUS    RESTARTS   AGE
example-pod-a                1/1     Running   0          18m

Beispielausgabe für Cluster B:

NAME                         READY   STATUS    RESTARTS   AGE
example-pod-b                1/1     Running   0          3m13s

Führe für example-pod-a den folgenden Befehl aus, um den Inhalt anzuzeigen, der in den Speicher geschrieben wurde:

kubectl exec -it example-pod-a -- cat /data/out.txt

Beispielausgabe:

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

Führe für example-pod-b den folgenden Befehl aus, um den Inhalt zu lesen, der in denselben Speicher wie example-pod-a geschrieben wurde:

kubectl logs -f example-pod-b

Beispielausgabe:

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

Ähnliche Informationen

Ein EBS-Volume mit Multi-Attach an mehrere EC2-Instances anhängen

Multi-Attach für ein Amazon EBS-Volume aktivieren

Kubernetes-Volume-Speicher mit Amazon EBS verwenden

Was ist Amazon Elastic File System?