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?