Ir para o conteúdo

Como uso o Amazon EBS Multi-Attach para anexar o mesmo volume a várias workloads no Amazon EKS?

5 minuto de leitura
0

Quero usar o Amazon Elastic Block Store (Amazon EBS) Multi-Attach para várias workloads em vários clusters no Amazon Elastic Kubernetes Service (Amazon EKS).

Breve descrição

O Amazon EBS Multi-Attach permite que você anexe um único volume de SSD de IOPS provisionadas (io1 ou io2) a várias instâncias na mesma zona de disponibilidade. Você pode usar o Multi-Attach para compartilhar armazenamento persistente em várias workloads em diferentes clusters do Amazon EKS.

Resolução

Observação: Se você receber mensagens de erro ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Importante: Sistemas de arquivos padrão, como XFS e EXT4, não foram projetados para serem acessados simultaneamente por vários servidores. Use um sistema de arquivos em cluster para garantir a resiliência e a confiabilidade dos dados em suas workloads de produção.

Antes de começar, certifique-se de que o driver CSI do Amazon EBS esteja instalado nos clusters necessários do Amazon EKS.

Para obter mais informações sobre a instalação do driver CSI do Amazon EBS, consulte Usar armazenamento de volumes do Kubernetes com o Amazon EBS.

Observação: Os volumes habilitados do Multi-Attach podem ser anexados a até 16 instâncias Linux criadas no Nitro System que estão na mesma zona de disponibilidade.

Para usar o Amazon EBS Multi-Attach para anexar o mesmo volume a várias workloads em vários clusters, conclua as seguintes etapas:

Provisionar um volume do Amazon EBS

Execute o seguinte comando create-volume da 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}]'

Observação: Substitua example-region pela sua região necessária da AWS. Substitua example-az pela sua zona de disponibilidade necessária.

Importante: O Amazon EBS Multi-Attach pode ser ativado para volumes io2 após sua criação, caso não estejam anexados às instâncias. O Amazon EBS Multi-Attach não pode ser ativado para volumes io1 após sua criação.

Recuperar o ID do volume

Execute o seguinte comando describe-volumes da AWS CLI:

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

Observação: Substitua example-region pela região necessária da AWS.

Criar uma classe de armazenamento

Crie um manifesto da classe de armazenamento com a seguinte configuração:

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

Aplique a classe de armazenamento:

kubectl apply -f storageclass.yaml

Provisionar uma workload persistente no cluster A

Crie o seguinte manifesto 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

Observação: Substitua todas as strings de exemplo no manifesto pelos valores necessários.

Use o mesmo ID de volume para criar outra workload no cluster B

Crie o seguinte manifesto 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

Observação: Substitua todas as strings de exemplo pelos valores necessários.

Mude o contexto do kubectl para o cluster B e implante a workload:

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

Observação: Substitua example-clusterB-context pelo contexto do seu cluster B.

Verificar se os pods estão em execução e se têm o mesmo conteúdo

Autentique-se nos diferentes clusters e execute o seguinte comando:

kubectl get pods

Exemplo de saída de cluster A:

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

Exemplo de saída do cluster B:

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

Em example-pod-a, execute o seguinte comando para visualizar o conteúdo gravado no armazenamento:

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

Exemplo de saída:

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

Em example-pod-b, execute o seguinte comando para ler o conteúdo gravado no mesmo armazenamento de example-pod-a:

kubectl logs -f example-pod-b

Exemplo de saída:

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

Informações relacionadas

Attach an EBS volume to multiple EC2 instances using Multi-Attach

Enable Multi-Attach for an Amazon EBS volume

Usar armazenamento de volumes do Kubernetes com o Amazon EBS

What is Amazon Elastic File System?