Saltar al contenido

¿Cómo utilizo Amazon EBS Multi-Attach para adjuntar el mismo volumen a varias cargas de trabajo en Amazon EKS?

5 minutos de lectura
0

Quiero usar Amazon Elastic Block Store (Amazon EBS) Multi-Attach para varias cargas de trabajo en varios clústeres en Amazon Elastic Kubernetes Service (Amazon EKS).

Descripción corta

Amazon EBS Multi-Attach te permite adjuntar un único volumen SSD con E/S por segundo aprovisionadas (io1 o io2) a varias instancias de la misma zona de disponibilidad. Puedes usar Multi-Attach para compartir el almacenamiento persistente entre varias cargas de trabajo en diferentes clústeres de Amazon EKS.

Resolución

Importante: Los sistemas de archivos estándar, como XFS y EXT4, no están diseñados para que varios servidores accedan a ellos simultáneamente. Usa un sistema de archivos agrupado para garantizar la resiliencia y confiabilidad de los datos para tus cargas de trabajo de producción.

Antes de empezar, asegúrate de que el controlador CSI de Amazon EBS esté instalado en los clústeres de Amazon EKS necesarios.

Para obtener más información sobre la instalación del controlador CSI de Amazon EBS, consulta Uso del almacenamiento por volumen de Kubernetes con Amazon EBS.

Nota: Los volúmenes habilitados para Multi-Attach se pueden adjuntar a hasta 16 instancias de Linux creadas en Nitro System que se encuentren en la misma zona de disponibilidad.

Para usar Amazon EBS Multi-Attach para adjuntar el mismo volumen a varias cargas de trabajo en varios clústeres, sigue estos pasos:

Aprovisionamiento de un volumen de Amazon EBS

Ejecuta el siguiente comando create-volume de AWS CLI:

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: Sustituye example-region por la región de AWS correspondiente. Sustituye example-az por la zona de disponibilidad requerida.

Importante: Amazon EBS Multi-Attach se puede activar para los volúmenes io2 una vez creados si no están conectados a las instancias. Amazon EBS Multi-Attach no se puede activar para los volúmenes io1 una vez creados.

Recuperación del ID del volumen

Ejecuta el siguiente comando describe-volumes de la AWS CLI:

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

Nota: Sustituye example-region por la región de AWS correspondiente.

Creación de una clase de almacenamiento

Crea un manifiesto de clase de almacenamiento con la siguiente configuración:

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

Aplica la clase de almacenamiento:

kubectl apply -f storageclass.yaml

Aprovisiona una carga de trabajo persistente en el clúster A

Crea el siguiente manifiesto denominado 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: Sustituye todas las cadenas de ejemplo del manifiesto por los valores requeridos.

Uso del mismo ID de volumen para crear otra carga de trabajo en el clúster B

Crea el siguiente manifiesto denominado 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: Sustituye todas las cadenas de ejemplo por los valores requeridos.

Cambia el contexto de kubectl al clúster B y, a continuación, despliega la carga de trabajo:

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

Nota: Sustituye example-clusterB-context por tu contexto del clúster B.

Comprobación de que los pods estén funcionando y tengan el mismo contenido

Haz la autenticación en los distintos clústeres y ejecuta el siguiente comando:

kubectl get pods

Ejemplo de resultado para el clúster A:

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

Ejemplo de resultado para el clúster B:

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

Para example-pod-a, ejecuta el siguiente comando para ver el contenido escrito en el almacenamiento:

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

Resultado de ejemplo:

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

Para example-pod-b, ejecuta el siguiente comando para leer el contenido escrito en el mismo almacenamiento que example-pod-a:

kubectl logs -f example-pod-b

Resultado de ejemplo:

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

Información relacionada

Adjuntar un volumen de EBS a varias instancias EC2 mediante Multi-Attach

Habilitación de Multi-Attach para un volumen de Amazon EBS

Uso del almacenamiento por volumen de Kubernetes con Amazon EBS

¿Qué es Amazon Elastic File System?