내용으로 건너뛰기

Amazon EBS 다중 연결을 사용하여 Amazon EKS의 여러 워크로드에 동일한 볼륨을 연결하려면 어떻게 해야 합니까?

4분 분량
0

Amazon Elastic Kubernetes Service(Amazon EKS)에서 여러 클러스터의 여러 워크로드에 Amazon Elastic Block Store(Amazon EBS) 다중 연결을 사용하고 싶습니다.

간략한 설명

Amazon EBS 다중 연결을 사용하면 단일 프로비저닝된 IOPS SSD(io1 또는 io2) 볼륨을 동일한 가용 영역의 여러 인스턴스에 연결할 수 있습니다. 다중 연결을 사용하여 여러 Amazon EKS 클러스터의 여러 워크로드에서 영구 스토리지를 공유할 수 있습니다.

해결 방법

중요: XFS 및 EXT4와 같은 표준 파일 시스템은 여러 서버에서 동시에 액세스할 수 있도록 설계되지 않았습니다. 프로덕션 워크로드의 데이터 복원력과 신뢰성을 보장하려면 클러스터링된 파일 시스템을 사용하십시오.

시작하기 전에 Amazon EBS CSI 드라이버가 필수 Amazon EKS 클러스터에 설치되어 있는지 확인합니다.

Amazon EBS CSI 드라이버 설치에 대한 자세한 내용은 Amazon EBS와 함께 Kubernetes 볼륨 스토리지 사용을 참조하십시오.

참고: 다중 연결이 활성화된 볼륨은 동일한 가용 영역에 있는 Nitro System에 구축된 최대 16개의 Linux 인스턴스에 연결할 수 있습니다.

Amazon EBS 다중 연결을 사용하여 동일한 볼륨을 여러 클러스터의 여러 워크로드에 연결하려면 다음 단계를 완료하십시오.

Amazon EBS 볼륨 프로비저닝

다음 create-volume 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}]'

참고: example-region을 필요한 AWS 리전으로 바꾸십시오. example-az를 필요한 가용 영역으로 바꾸십시오.

중요: io2 볼륨이 생성된 후 인스턴스에 연결되지 않은 경우 Amazon EBS 다중 연결을 켤 수 있습니다. io1 볼륨이 생성된 후에는 Amazon EBS 다중 연결을 켤 수 없습니다.

볼륨 ID 검색

다음과 같은 describe-volumes AWS CLI 명령을 실행합니다.

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

참고: example-region을 필요한 AWS 리전으로 바꾸십시오.

스토리지 클래스 만들기

다음 구성을 사용하여 스토리지 클래스 매니페스트를 만듭니다.

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

스토리지 클래스를 적용합니다.

kubectl apply -f storageclass.yaml

클러스터 A에서 영구 워크로드 프로비저닝

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

참고: 매니페스트의 모든 예시 문자열을 필요한 값으로 바꾸십시오.

동일한 볼륨 ID를 사용하여 클러스터 B에 다른 워크로드 만들기

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

참고: 모든 example 문자열을 필요한 값으로 바꾸십시오.

kubectl 컨텍스트를 클러스터 B로 전환한 다음 워크로드를 배포합니다.

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

참고: example-clusterB-context를 클러스터 B 컨텍스트로 바꾸십시오.

포드가 실행 중이고 콘텐츠가 동일한지 확인

여러 클러스터에서 인증하고 다음 명령을 실행합니다.

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

관련 정보

다중 연결을 사용하여 EBS 볼륨을 여러 EC2 인스턴스에 연결

Amazon EBS 볼륨의 다중 연결 활성화

Amazon EBS와 함께 Kubernetes 볼륨 스토리지 사용

Amazon Elastic File System이란?