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, ein einzelnes Provisioned 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
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 nach der Erstellung aktiviert werden, wenn 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 3 Jahren
AWS OFFICIALAktualisiert vor 8 Monaten