Ir para o conteúdo

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

6 minuto de leitura
0

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

Breve descrição

Quando você cria um workload persistente no Amazon EKS com armazenamento do Amazon EBS, o tipo de volume padrão é gp2. 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.

O Amazon EBS Multi-Attach não é suportado em volumes SSD de uso geral, como gp2 e gp3. O driver CSI do Amazon EBS não oferece suporte à anexação de vários volumes a workloads executadas em nós diferentes no mesmo cluster.

Para anexar várias vezes o mesmo armazenamento persistente do Amazon EBS a vários workloads em clusters diferentes, use volumes SSD de IOPS provisionadas. Certifique-se de que os pods sejam executados em nós de processamento que estejam na mesma Zona de disponibilidade (AZ) em todos os clusters.

Observação: Se seus workloads estiverem em várias Zonas de disponibilidade no mesmo cluster ou em clusters diferentes, use o Amazon Elastic File System (Amazon EFS). Para obter mais informações, consulte Create an Amazon EFS file system for Amazon EKS (Criar um sistema de arquivos do Amazon EFS para o Amazon EKS) no site do GitHub.

Resolução

Antes de começar, certifique-se de que o driver CSI do Amazon EBS esteja instalado nos clusters do Amazon EKS necessários.
Observação: Os volumes habilitados para vários anexos 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ários workloads em vários clusters, conclua as etapas a seguir.

Provisionar um volume do Amazon EBS

Para provisionar um volume do Amazon EBS, faça o seguinte:

  1. Provisione um volume estaticamente:
    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 da AWS necessária. Substitua <example-az> pela sua Zona de disponibilidade necessária.
  2. Se você tiver um workload existente com um volume de gp2 ou gp3, primeiro crie um snapshot do volume. Em seguida, crie um volume io2 a partir desse snapshot. 
    Observação: O Amazon EBS Multi-Attach não pode ser ativado para volumes io1 após sua criação. O Amazon EBS Multi-Attach pode ser ativado para volumes io2 após sua criação, caso não estejam anexados às instâncias. Para o provisionamento dinâmico de armazenamento io2 no Amazon EKS, especifique o modo Imediato para provisionar o volume sem o pod para criar a classe de armazenamento. Certifique-se de ativar o Amazon EBS Multi-Attach antes de criar o pod.

Recupere o ID do volume

Recupere o ID do volume que foi provisionado para o workload:

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 da AWS necessária.

Provisione um workload persistente em um cluster existente usando o ID do volume anterior

  1. Crie o seguinte manifesto chamado workloadA.yml:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: <example-pv-claim-name-a>
    spec:
      storageClassName: ""
      volumeName: <example-pv-name-a>
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: <example-pod-a>
    spec:
      containers:
      - name: <example-pod-container-name>
        image: centos
        command: ["/bin/sh"]
        args: ["-c", "while true; do echo $(date -u) on pod A >> /data/out.txt; sleep 15; done"]
        volumeMounts:
        - name: <example-volume-mount-name>
          mountPath: /data
      volumes:
      - name: <example-volume-mount-name>
        persistentVolumeClaim:
          claimName: <example-pv-claim-name-a>
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: <example-pv-name-a>
    spec:
      accessModes:
      - ReadWriteOnce
      capacity:
        storage: 5Gi
      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 example no comando a seguir pelos valores necessários. Certifique-se de que o valor do parâmetro storageClassName esteja definido como strings ****"" vazias.

  2. Mude o contexto kubectl para o cluster A e implante o workload:

    kubectl config use-context <example-clusterA-context>  
    kubectl apply -f workloadA.yml

Use o ID do volume anterior para criar outro workload em outro cluster

  1. Crie e implante o seguinte manifesto chamado workloadB.yml:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: <example-pv-claim-name-b>
    spec:
      storageClassName: ""
      volumeName: <example-pv-name-b>
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: <example-pod-b>
    spec:
      containers:
      - name: <example-pod-container-name>
        image: centos
        command: ["/bin/sh"]
        args: ["-c", "tail -f /data/out.txt"]
        volumeMounts:
        - name: <example-volume-mount-name>
          mountPath: /data
      volumes:
      - name: <example-volume-mount-name>
        persistentVolumeClaim:
          claimName: <example-pv-claim-name-b>
    
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: <example-pv-name-b>
    spec:
      accessModes:
      - ReadWriteOnce
      capacity:
        storage: 5Gi
      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 example pelos valores necessários. Certifique-se de que o valor do parâmetro storageClassName esteja definido como strings ****"" vazias.

  2. Mude o contexto kubectl para o cluster B e, em seguida, implante o workload:

    kubectl config use-context <example-clusterB-context>
    kubectl apply -f workloadB.ym

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

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

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

    kubectl get pods

    Exemplo de saída para o cluster A:

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

    Exemplo de saída para o cluster B:

    NAME                          READY   STATUS    RESTARTS   AGE
    example-pod-b                 1/1     Running   0          3m13s
  2. 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
  3. Em example-pod-b, execute o comando a seguir 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

Observação: Sistemas de arquivos padrão, como XFS e EXT4, não podem ser acessados ao mesmo tempo em vários servidores. Para obter mais informações, consulte Considerações e limitações.

Informações relacionadas

O que é o Amazon Elastic File System?