Salta al contenuto

Come posso utilizzare Amazon EBS Multi-Attach per collegare lo stesso volume a più carichi di lavoro in Amazon EKS?

5 minuti di lettura
0

Desidero utilizzare Amazon Elastic Block Store (Amazon EBS) Multi-Attach per più carichi di lavoro su più cluster in Amazon Elastic Kubernetes Service (Amazon EKS).

Breve descrizione

Amazon EBS Multi-Attach ti consente di collegare un singolo volume SSD a capacità di IOPS allocata (io1 o io2) a più istanze nella stessa zona di disponibilità. Puoi utilizzare Multi-Attach per condividere lo storage persistente tra più carichi di lavoro in diversi cluster Amazon EKS.

Risoluzione

Nota: Se ricevi errori quando esegui i comandi dell’Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Importante: I file system standard come XFS ed EXT4 non sono progettati per essere accessibili contemporaneamente da più server. Utilizza un file system in cluster per garantire la resilienza e l’affidabilità dei dati per i carichi di lavoro di produzione.

Prima di iniziare, assicurati che il driver CSI di Amazon EBS sia installato nei cluster Amazon EKS richiesti.

Per ulteriori informazioni sull’installazione del driver CSI di Amazon EBS, consulta Utilizzare il volume di archiviazione Kubernetes con Amazon EBS.

Nota: I volumi con Multi-Attach abilitato possono essere collegati a un massimo di 16 istanze Linux basate su Nitro System che si trovano nella stessa zona di disponibilità.

Per utilizzare Amazon EBS Multi-Attach per collegare lo stesso volume a più carichi di lavoro in più cluster, completa i passaggi seguenti:

Effettua il provisioning di un volume Amazon EBS

Esegui questo comando AWS CLI create-volume:

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

Nota: Sostituisci example-region con la Regione AWS richiesta. Sostituisci example-az con la zona di disponibilità richiesta.

Importante: Puoi attivare Amazon EBS Multi-Attach per i volumi io2 dopo averli creati, purché non siano collegati a istanze. Non puoi attivare Amazon EBS Multi-Attach per i volumi io1 dopo averli creati.

Recupera l’ID del volume

Esegui questo comando AWS CLI describe-volumes:

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

Nota: Sostituisci example-region con la Regione AWS richiesta.

Crea una classe di archiviazione

Crea un manifesto della classe di archiviazione con la seguente configurazione:

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

Applica la classe di archiviazione:

kubectl apply -f storageclass.yaml

Effettua il provisioning di un carico di lavoro persistente nel cluster A

Crea il seguente manifesto denominato 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

Nota: Sostituisci tutte le stringhe di esempio nel manifesto con i valori richiesti.

Utilizza lo stesso ID di volume per creare un altro carico di lavoro nel cluster B

Crea il seguente manifesto denominato 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

Nota: Sostituisci tutte le stringhe di esempio con i valori richiesti.

Passa il contesto kubectl al cluster B, quindi distribuisci il carico di lavoro:

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

Nota: Sostituisci example-clusterB-context con il contesto del cluster B.

Verifica che i pod siano in esecuzione e abbiano lo stesso contenuto

Effettua l’autenticazione nei diversi cluster ed esegui questo comando:

kubectl get pods

Esempio di output per il cluster A:

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

Esempio di output per il cluster B:

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

Per example-pod-a, visualizza il contenuto scritto nello spazio di archiviazione eseguendo questo comando:

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

Esempio di output:

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

Per example-pod-b, leggi il contenuto scritto nello stesso spazio di archiviazione di example-pod-a eseguendo questo comando:

kubectl logs -f example-pod-b

Esempio di output:

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

Informazioni correlate

Collega un volume EBS a più istanze EC2 utilizzando Multi-Attach

Abilita Multi-Attach per un volume Amazon EBS

Utilizzare il volume di archiviazione Kubernetes con Amazon EBS

Cos’è Amazon Elastic File System?