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.
Wie verwende ich Amazon EBS Multi-Attach, um dasselbe Volume an mehrere Workloads in Amazon EKS anzuhängen?
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
- Themen
- StorageContainers
- Sprache
- Deutsch

Relevanter Inhalt
AWS OFFICIALAktualisiert vor 6 Monaten
AWS OFFICIALAktualisiert vor 6 Monaten