Passer au contenu

Comment puis-je utiliser Amazon EBS Multi-Attach pour attacher le même volume sur plusieurs charges de travail dans Amazon EKS ?

Lecture de 5 minute(s)
0

Je souhaite utiliser Amazon Elastic Block Store (Amazon EBS) Multi-Attach en vue de gérer plusieurs charges de travail sur différents clusters dans Amazon Elastic Kubernetes Service (Amazon EKS).

Brève description

Amazon EBS Multi-Attach vous permet d’attacher un volume SSD IOPS provisionnés (io1 ou io2) sur plusieurs instances dans la même zone de disponibilité. Vous pouvez utiliser Multi-Attach pour partager le stockage persistant entre plusieurs charges de travail dans différents clusters Amazon EKS.

Résolution

Important : les systèmes de fichiers standard tels que XFS et EXT4 ne sont pas conçus pour être accessibles simultanément par plusieurs serveurs. Pour garantir la résilience et la fiabilité des données à vos charges de travail de production, utilisez des systèmes de fichiers en cluster.

Avant de commencer, assurez-vous que le pilote Amazon EBS CSI est installé dans les clusters Amazon EKS requis.

Pour plus d'informations sur l'installation du pilote Amazon EBS CSI, consultez la section Utiliser le stockage de volume Kubernetes avec Amazon EBS.

Remarque : les volumes compatibles Multi-Attach peuvent être attachés sur un maximum de 16 instances Linux créées sur le système Nitro et situées dans la même zone de disponibilité.

Pour utiliser Amazon EBS Multi-Attach afin d'attacher un volume sur plusieurs charges de travail dans plusieurs clusters, procédez comme suit :

Provisionner un volume Amazon EBS

Exécutez la commande create-volume de l’AWS CLI suivante :

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

Remarque : remplacez example-region par la région AWS requise. Remplacez example-az par la zone de disponibilité requise.

Important : Amazon EBS Multi-Attach peut être activé pour les volumes io2 après leur création s’ils ne sont pas attachés à des instances. Amazon EBS Multi-Attach ne peut pas être activé pour les volumes io1 une fois qu'ils ont été créés.

Récupérer l’ID du volume

Exécutez la commande describe-volumes de l’AWS CLI suivante :

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

Remarque : remplacez example-region par la région AWS requise.

Créer une classe de stockage

Créez un manifeste de classe de stockage avec la configuration suivante :

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

Appliquez la classe de stockage :

kubectl apply -f storageclass.yaml

Provisionner une charge de travail persistante dans le cluster A

Créez le manifeste suivant nommé 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

Remarque : remplacez tous les exemples de chaînes du manifeste par les valeurs requises.

Utiliser le même ID de volume pour créer une autre charge de travail dans le cluster B

Créez le manifeste suivant nommé workloadB.yml :

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

Remarque : veillez à remplacer tous les exemples de chaîne par les valeurs requises.

Changez le contexte kubectl en cluster B, puis lancez la charge de travail :

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

Remarque : remplacez example-clusterB-context par le contexte de cluster B.

Vérifier que les pods fonctionnent et ont le même contenu

Identifiez-vous sur les différents clusters et exécutez la commande suivante :

kubectl get pods

Exemple de sortie pour le cluster A :

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

Exemple de sortie pour le cluster B :

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

Pour exemple-pod-a, exécutez la commande suivante, afin d’afficher le contenu écrit dans le stockage :

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

Exemple de sortie :

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

Pour exemple-pod-b, exécutez la commande suivante, afin de lire le contenu écrit dans le même stockage que exemple-pod-a :

kubectl logs -f example-pod-b

Exemple de sortie :

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

Informations connexes

Attacher un volume EBS à plusieurs instances EC2 à l'aide de Multi-Attach

Activer le mode Multi-Attach pour un volume Amazon EBS

Utiliser le stockage de volume Kubernetes avec Amazon EBS

Qu’est-ce qu’Amazon Elastic File System ?