Amazon EBS 다중 연결을 사용하여 Amazon EKS의 여러 워크로드에 동일한 볼륨을 연결하려면 어떻게 해야 하나요?
Amazon Elastic Kubernetes Service(Amazon EKS)에서 여러 클러스터의 여러 워크로드에 Amazon Elastic Block Store(Amazon EBS) 다중 연결을 사용하고 싶습니다.
간략한 설명
Amazon EBS 스토리지를 사용하여 Amazon EKS에서 영구 워크로드를 생성할 때 기본 볼륨 유형은 gp2입니다. Amazon EBS 다중 연결을 사용하면 단일 프로비저닝된 IOPS SSD (io1 또는 io2) 볼륨을 동일한 가용 영역의 여러 인스턴스에 연결할 수 있습니다.
Amazon EBS 다중 연결은 gp2 및 gp3와 같은 범용 SSD 볼륨에서는 지원되지 않습니다. Amazon EBS CSI 드라이버는 동일한 클러스터의 여러 노드에서 실행되는 워크로드에 대한 다중 연결 볼륨을 지원하지 않습니다.
동일한 Amazon EBS 영구 스토리지를 여러 클러스터의 여러 워크로드에 다중 연결하려면 프로비저닝된 IOPS SSD 볼륨을 사용하세요. 클러스터 전체에서 동일한 가용 영역(AZ)에 있는 워커 노드에서 포드가 실행되는지 확인합니다.
참고: 워크로드가 동일하거나 다른 클러스터의 여러 가용 영역에 있는 경우 Amazon Elastic File System(Amazon EFS)을 사용합니다. 자세한 내용은 GitHub 웹 사이트에서 Amazon EKS용 Amazon EFS 파일 시스템 생성을 참조하세요.
해결 방법
시작하기 전에 Amazon EBS CSI 드라이버가 필수 Amazon EKS 클러스터에 설치되어 있는지 확인합니다.
참고: 다중 연결이 활성화된 볼륨은 동일한 가용 영역에 있는 Nitro System에 구축된 최대 16개의 Linux 인스턴스에 연결할 수 있습니다.
Amazon EBS 다중 연결을 사용하여 동일한 볼륨을 여러 클러스터의 여러 워크로드에 연결하려면 다음 단계를 완료하세요.
Amazon EBS 볼륨 프로비저닝
Amazon EBS 볼륨을 프로비저닝하려면 다음을 실행하세요.
- 볼륨을 정적으로 프로비저닝합니다.
참고: 을(를)<example-region> 필요한 AWS 리전으로 변경합니다. 을(를)<example-az> 필요한 가용 영역으로 변경합니다.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}]'
- gp2 또는 gp3 볼륨이 포함된 기존 워크로드가 있는 경우 먼저 볼륨의 스냅샷을 생성합니다. 그런 다음 해당 스냅샷에서 io2 볼륨을 생성합니다.
참고: io1 볼륨이 생성된 후에는 Amazon EBS 다중 연결을 켤 수 없습니다. io2 볼륨이 생성된 후 인스턴스에 연결되지 않은 경우 Amazon EBS 다중 연결을 켤 수 있습니다. Amazon EKS의 io2 동적 스토리지 프로비저닝의 경우 Immediate 모드를 지정하여 스토리지 클래스를 생성할 포드 없이 볼륨을 프로비저닝합니다. 포드를 생성하기 전에 Amazon EBS 다중 연결을 켜야 합니다.
볼륨 ID 검색
워크로드에 프로비저닝된 볼륨 ID를 검색합니다.
aws ec2 describe-volumes --filters "Name=tag:Name,Values=multi-attach-eks*" --query "Volumes[*].{ID:VolumeId}" --region <example-region>
참고: example-region을 필요한 AWS 리전으로 변경합니다.
이전 볼륨 ID를 사용하여 기존 클러스터에서 영구 워크로드를 프로비저닝합니다.
-
이름이 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>
참고: 다음 명령의 모든 예제 문자열을 필요한 값으로 변경합니다. storageClassName 매개 변수 값이 "" 문자열로 설정되어 있는지 확인합니다.
-
kubectl 컨텍스트를 클러스터 A로 전환한 다음 워크로드를 배포합니다.
kubectl config use-context <example-clusterA-context> kubectl apply -f workloadA.yml
위의 볼륨 ID를 사용하여 다른 클러스터에 다른 워크로드를 생성합니다.
-
이름이 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
참고: 모든 예제 문자열을 필요한 값으로 변경합니다. storageClassName 매개 변수 값이 "" 문자열로 설정되어 있는지 확인합니다.
-
kubectl 컨텍스트를 클러스터 B로 전환한 다음 워크로드를 배포합니다.
kubectl config use-context <example-clusterB-context> kubectl apply -f workloadB.ym
참고: example-clusterB-context를 사용자 컨텍스트로 바꿉니다.
포드가 실행 중이고 콘텐츠가 동일한지 확인
-
여러 클러스터에서 인증하고 다음 명령을 실행합니다.
kubectl get pods
클러스터 A에 대한 예제 출력:
NAME READY STATUS RESTARTS AGE example-pod-a 1/1 Running 0 18m
클러스터 B에 대한 예제 출력:
NAME READY STATUS RESTARTS AGE example-pod-b 1/1 Running 0 3m13s
-
example-pod-a의 경우 다음 명령을 실행하여 스토리지에 기록된 콘텐츠를 확인합니다.
kubectl exec -it <example-pod-a> -- cat /data/out.txt
출력 예시:
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
-
example-pod-b의 경우 다음 명령을 실행하여 example-pod-a와 동일한 스토리지에 기록된 콘텐츠를 읽습니다.
kubectl logs -f <example-pod-b>
출력 예시:
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
참고: XFS 및 EXT4와 같은 표준 파일 시스템은 여러 서버에서 동시에 액세스할 수 없습니다. 자세한 내용은 고려 사항 및 제한 사항을 참조하세요.
관련 정보
관련 콘텐츠
- 질문됨 10달 전lg...
- 질문됨 7달 전lg...
- 질문됨 7년 전lg...
- AWS 공식업데이트됨 2년 전
- AWS 공식업데이트됨 2년 전
- AWS 공식업데이트됨 2년 전