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, 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

Kubernetes-Volume-Speicher mit Amazon EBS verwenden

Was ist Amazon Elastic File System?