궁금한게 많은 개발자 노트

[ k8s ] StatefulSet 배포 시 복수의 Persistent Volume Dynamic Provisioning 본문

DevOps

[ k8s ] StatefulSet 배포 시 복수의 Persistent Volume Dynamic Provisioning

궁금한게 많은 개발자 2023. 6. 12. 16:50

기존에 작성한 kubernetes에서 Persistent Volume적용하기는 Pod의 데이터 지속성과 관련하여, Pod 생명 주기와 관계 없이 영구적으로 데이터를 관리하기 위해서는 Persistent Volume이 필요함을 설명하고 PV의 종류 중 하나인 AWS EBS Volume을 PV로 사용하기 위한 권한을 어떻게 부여하는 지 등에 대해 중점적으로 설명하였습니다.

https://ks1171-park.tistory.com/121

 

[ k8s ] Kubernetes Persistent Volume 적용하기

Kubernetes의 데이터 지속성 stateful application이 올바르게 실행되기 위해서는 데이터가 올바르게 저장되고 유지되어, 실행 중에 얻어질 수 있어야합니다. 하지만, stateful application이 kubernetes환경에서

ks1171-park.tistory.com

 

Pod에서 Storage(Persistent Volume)를 요청하고 사용하기 위해서는 Storage에 대한 정보를 기술하는 PVC(Persistent Volume Claim)를 Pod와 별개로 선언하고 관리해주어야 합니다.

이렇게 함으로써 PV와 PVC는 Storage 추상화를 제공하여 개발자는 k8s cluster내에서 application이 사용하는 Storage에 대한 세부 정보를 알 필요 없이, 요청한 자원에 대한 Storage를 mount하여 사용할 수 있습니다.

 

PVC는 PV에 대한 요청서 이므로, 일대일로 대응됨을 알 수 있습니다. 하지만 하나의 Pod를 Deployment할 때 Pod와 PVC가 항상 일대일로 매칭되는 것은 아닙니다. 이 점을 유의해야 합니다.

https://kubernetes.io/ko/docs/concepts/storage/persistent-volumes/#%EC%A0%91%EA%B7%BC-%EB%AA%A8%EB%93%9C

 

퍼시스턴트 볼륨

이 페이지에서는 쿠버네티스의 퍼시스턴트 볼륨 에 대해 설명한다. 볼륨에 대해 익숙해지는 것을 추천한다. 소개 스토리지 관리는 컴퓨트 인스턴스 관리와는 별개의 문제다. 퍼시스턴트볼륨 서

kubernetes.io

위에서 볼 수 있듯 PV는 AccessMode에 따라 접근 할 수 있는 Pod의 개수 및 읽기/쓰기 권한이 달라집니다.

  • ReadWriteOnce하나의 노드에서 해당 볼륨이 읽기-쓰기로 마운트 될 수 있다. ReadWriteOnce 접근 모드에서도 파드가 동일 노드에서 구동되는 경우에는 복수의 파드에서 볼륨에 접근할 수 있다.
  • ReadOnlyMany볼륨이 다수의 노드에서 읽기 전용으로 마운트 될 수 있다.
  • ReadWriteMany볼륨이 다수의 노드에서 읽기-쓰기로 마운트 될 수 있다.
  • ReadWriteOncePod볼륨이 단일 파드에서 읽기-쓰기로 마운트될 수 있다.
    전체 클러스터에서 단 하나의 파드만 해당 PVC를 읽거나 쓸 수 있어야하는 경우 ReadWriteOncePod 접근 모드를 사용한다.
    이 기능은 CSI 볼륨과 쿠버네티스 버전 1.22+ 에서만 지원된다.

 

만약, PV가 ReadWriteOnce모드로 생성되어 하나의 노드에서 생성된 Pod에 bound되는 경우에 해당 Pod를 생성시킨 Statefulset에서 Pod replicas를 복수로 설정했을 때는 PVC와 PV및 Pod의 관계는 어떻게 될까요???

 

우선, Statefulset에 의해 여러 Pod가 생성되며 동일한 PVC을 사용하여 PV에 접근하려 할 것입니다.

volumes:
  - name: elasticsearch-persistent-storage
    persistentVolumeClaim:
      claimName: elasticsearch-pvc

그렇게 된다면 다음과 같은 에러가 발생하게 됩니다. 

Warning FailedAttachVolume 13s attachdetach-controller Multi-Attach error for volume "pvc-####-8cf3-4656-a947-3db9c2c09aa4" Volume is already used by pod(s) elasticsearch

 

이것에 대한 문제로는 여러 Pod가 생성되더라도 각각의 Pod는 기술된 하나의 PVC에 의해 생성된 PV를 Mount하려 할 것이고, 해당 PV는 한 노드에서 생성된 Pod에서만 접근이 가능한 ReadWriteOnce모드를 가지고 있기에 서로 다른 노드에 Pod가 생성될 경우 문제가 됩니다.

 

replicas를 하나만 설정한다면 의도한 대로, Persistent Volume이 PVC에 의해 동적으로 생성되어 생성된 Pod에 Bound되겠지만, 복수의 replica 개수를 설정할 때는 해결 방법이 필요합니다. 여러 해결 방법이 있을 것 같습니다. 

  1. PV의 AccessMode를 ReadWriteOnce에서 다른 모드로 변경
  2. Pod가 여러 개 생길 때, PVC/PV도 Pod의 개수에 맞게 동적 할당되도록 수정

현재 저의 경우에는 Elasticsearch를 통해 저장되는 Log를 관리할 Persistent Volume이 필요한 상황으로 데이터 손실을 최소화하기 위해 높은 가용성을 보장하고자 2번으로 해결해보고자 하였습니다.

 

 

StatefulSet생성 시 volumeClaimTemplates 를 활용하여 설정한 Pod의 Replica개수에 맞게 PVC 및 PV도 동적으로 할당되도록 구현하였습니다.

volumeClaimTemplates:
  - metadata:
      name: elasticsearch-pvc
      namespace: sbc
      labels:
        app: elasticsearch

이렇게 배포되도록 설정하면, StatefulSet 배포 시에 설정한 Pod개수만큼 PVC가 생성되고, PVC에서 요청한 Volume의 크기 및 종류에 맞게 PV가 동적으로 Provisioning되게 되어 해당 문제를 해결할 수 있었습니다.

문제를 해결할 여러 방법이 있겠지만, 현재 상황과 요구 사항에 맞는 해결법을 적절하게 선택하는 것도 중요할 것 같습니다. 감사합니다. 😊✔

 

Comments