Ongoing service disruptions
For the most recent update on ongoing service disruptions affecting the AWS Middle East (UAE) Region (ME-CENTRAL-1), refer to the AWS Health Dashboard. For information on AWS Service migration, see How do I migrate my services to another region?
Como uso o Amazon EBS Multi-Attach para conectar o mesmo volume a vários workloads no Amazon EKS?
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:
- Provisione um volume estaticamente:
Observação: Substitua <example-region> pela sua região da AWS necessária. Substitua <example-az> pela sua Zona de disponibilidade necessária.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}]' - 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
-
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.
-
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
-
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-azObservaçã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.
-
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.ymObservação: Substitua example-clusterB-context pelo seu contexto.
Verifique se os pods estão em execução e têm o mesmo conteúdo
-
Autentique-se nos diferentes clusters e execute o seguinte comando:
kubectl get podsExemplo de saída para o cluster A:
NAME READY STATUS RESTARTS AGE example-pod-a 1/1 Running 0 18mExemplo de saída para o 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.txtExemplo 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 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
- Tópicos
- StorageContainers
- Idioma
- Português

Conteúdo relevante
- feita há 8 meses
AWS OFICIALAtualizada há 6 meses
AWS OFICIALAtualizada há um ano