쿠버네티스 일반

Kubernetes PVC Replication

Jerry_이정훈 2021. 7. 28. 09:33
728x90

PVC Replication 테스트 내역 공유합니다.

 

테스트 내역

  • PVC Replication
  • POD 재기동 후 원본이 아닌 복제된 PVC로 마운트
  • Redis Application 이상 및 동일 데이터 유무 확인 

Why Kube Volume Replication

Kubevirt 환경에서 동일한 윈도우 이미지를 여러 사람이 사용하려면(예를 들어, 동일한 보안 설정이 적용된 Golden 이미지) 현재 사용 중인 PVC 볼륨을 복제해야 한다. 

 

Kube는 Volume Snapshot을 이용해서 PVC 복제가 가능하다. 하지만 Snapshot을 지원하지 않는 Storage Class도 있다. 이 경우에 PVC 복제 기능을 사용하면 된다. 

 

PVC Replication 참조

https://kubernetes.io/ko/docs/concepts/storage/volume-pvc-datasource/

 

CSI 볼륨 복제하기

이 문서에서는 쿠버네티스의 기존 CSI 볼륨 복제의 개념을 설명한다. 볼륨을 숙지하는 것을 추천한다. 소개 CSI 볼륨 복제 기능은 dataSource 필드에 기존 PVC를 지정하는 지원을 추가해서 사용자가

kubernetes.io

Kubevirt 사례 외에도 일반 VM 환경에서 볼륨 복제 하듯이 DB 용 볼륨을 하나 더 만들고 Test 또는 검색 용도의 DB를 만드는 용도로도 사용 가능하다.  

 

한가지 아쉬운 건 동일 namespace 및 storage class만 가능하다는 거다. VM 처럼 파일 기반이면 단순히 copy 해서 이리저리 마음대로 사용할 수 있는데, 이건 PVC 기반이라 제약이 있는 것 같다. Snapshot도 동일한 제약 사항이 있다. (이건 좀 더 확인이 필요 할 것 같다.)

 

예를 들어 현재 나의 PVC를 원격 스토리지(다른 NAS 스토리지 또는 aws s3 등)로 Migration 하고 싶은데, 이 때 Volume Replication 기능을 사용하지 못한다. 

 

상세 내역

먼저 테스트에 사용할 Kube Demo Application이다.

 

테스트에 사용한 Yelb Application Source Code

https://github.com/junghoon2/diamanti-k8s-bootcamp/tree/master/73.DemoPJT/04.yelb

 

GitHub - junghoon2/diamanti-k8s-bootcamp: DIAMANTI 시스템 운영을 위한 DIAMANTI & Kubernetes 실습 자료 입니다.

DIAMANTI 시스템 운영을 위한 DIAMANTI & Kubernetes 실습 자료 입니다. - GitHub - junghoon2/diamanti-k8s-bootcamp: DIAMANTI 시스템 운영을 위한 DIAMANTI & Kubernetes 실습 자료 입니다.

github.com

 

YELP 짝퉁이다

위 Yelb Application에서 사용한 Redis-PVC 대상 volume replication 할 예정이다.

[spkr@erdia22 ~ (ubuns:yelb)]$ k get pvc
NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
redis-pvc         Bound    pvc-1a212433-fb69-4d8f-bf60-bfffa64f343e   200Gi      RWO            rook-ceph-block   5d17h

Volume Replication YAML 파일은 아래처럼 굉장히 직관적이다. 기존 PVC YAML과 거의 동일하고 snapshot 복구처럼 dataSource 부문만 추가한다.

 

https://github.com/junghoon2/diamanti-k8s-bootcamp/blob/master/05.volume/clone-pvc.yml

 

GitHub - junghoon2/diamanti-k8s-bootcamp: DIAMANTI 시스템 운영을 위한 DIAMANTI & Kubernetes 실습 자료 입니다.

DIAMANTI 시스템 운영을 위한 DIAMANTI & Kubernetes 실습 자료 입니다. - GitHub - junghoon2/diamanti-k8s-bootcamp: DIAMANTI 시스템 운영을 위한 DIAMANTI & Kubernetes 실습 자료 입니다.

github.com

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
    name: clone-redis-pvc
    namespace: yelb
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: rook-ceph-block
  resources:
    requests:
      storage: 200Gi
  dataSource:
    kind: PersistentVolumeClaim
    name: redis-pvc
  • metadata.name: clone-redis-pvc
    : 원하는 임의의 이름을 지정한다. 
  • spec.storageClassName: rook-ceph-block
    : 기존 PVC에서 사용한 StorageClass 이름과 동일해야 한다.
  • spec.resources.requests.storage: 200Gi
    : 유의 사항으로 복제하려는 PVC와 동일한(또는 그보다 큰) 용량이 필요하다. 
  • spec.dataSource.kind: PersistentVolumeClaim, name: redis-pvc
    : 복제를 원하는 Target PVC 이름을 명시한다.

해당 YAML 파일을 Apply 하면 빠르게 복제된 PVC 볼륨이 생성된다.  

[spkr@erdia22 05.volume (ubuns:yelb)]$ ka(k apply -f) clone-pvc.yml 
persistentvolumeclaim/clone-redis-pvc created

[spkr@erdia22 05.volume (ubuns:yelb)]$ k get pvc
NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
clone-redis-pvc   Bound    pvc-aeebeb54-6ee1-4562-97d1-b0f80ceb886f   200Gi      RWO            rook-ceph-block   43s
redis-pvc         Bound    pvc-1a212433-fb69-4d8f-bf60-bfffa64f343e   200Gi      RWO            rook-ceph-block   5d17h

PV를 확인해 보면 기존 PV와 전혀 다른 별개의 볼륨이 생성된 걸 확인 할 수 있다. 별개의 볼륨이라 이 볼륨으로 작업을 해도 기존 볼륨에는 아무런 영향이 없다.

[spkr@erdia22 05.volume (ubuns:yelb)]$ k get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                         STORAGECLASS      REASON   AGE
pvc-1a212433-fb69-4d8f-bf60-bfffa64f343e   200Gi      RWO            Delete           Bound    yelb/redis-pvc                rook-ceph-block            5d17h
(생략)
pvc-aeebeb54-6ee1-4562-97d1-b0f80ceb886f   200Gi      RWO            Delete           Bound    yelb/clone-redis-pvc          rook-ceph-block            2m28s

이제 기존 Redis POD를 내리고 신규 생성한 PVC로 새로운 POD를 생성한다. 기존 yelb redis-appserver 의 볼륨 부분만 변경해서 apply 한다. 

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: yelb-appserver
  namespace: yelb

(생략)
     volumes:
        - name: cart-redis-data
          persistentVolumeClaim:
            # claimName: redis-pvc   
            claimName: clone-redis-pvc   
            # claimName: redis-pvc-from-snap

k apply -f 한다. 

[spkr@erdia22 04.yelb (ubuns:yelb)]$ ka yelb-all-in-one.yml
service/redis-server unchanged
service/yelb-db unchanged
service/yelb-appserver unchanged
service/yelb-ui unchanged
deployment.apps/yelb-ui unchanged
deployment.apps/redis-server unchanged
deployment.apps/yelb-db unchanged
deployment.apps/yelb-appserver configured
persistentvolumeclaim/redis-pvc unchanged

기존 Redis POD가 내려가고 신규 POD가 실행된다.

[spkr@erdia22 04.yelb (ubuns:yelb)]$ k get pod -w (kgpw)
NAME                              READY   STATUS        RESTARTS   AGE
redis-server-74556bbcb7-7nwjx     1/1     Running       0          5d18h
yelb-appserver-5c895ddb7f-mptlt   1/1     Terminating   0          22h
yelb-appserver-867f5b699f-5sx7z   1/1     Running       0          36s
yelb-db-694586cd78-tk5sd          1/1     Running       0          5d18h
yelb-ui-8f54fd88c-w7prr           1/1     Running       0          5d18h
yelb-appserver-5c895ddb7f-mptlt   1/1     Terminating   0          22h
yelb-appserver-5c895ddb7f-mptlt   0/1     Terminating   0          22h

POD PVC 정보를 확인하면 clone-redis-pvc 임을 알 수 있다.

[spkr@erdia22 04.yelb (ubuns:yelb)]$ k describe pod yelb-appserver-867f5b699f-5sx7z
(생략)


Volumes:
  cart-redis-data:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  clone-redis-pvc
    ReadOnly:   false

Web에서 확인하여도 정상적으로 확인되고 데이터도 기존과 동일하다. (16 Total) (물론 내가 Redis를 잘 아는 게 아니라서 Application 백업(예를들어 mysqldump) 사용하지 않고 단순히 Physical volume 단위의 백업이라 Application 진자 정상인지는 확인 할 수 없다. 더군다나 Redis는 in-memory 기반이다.)

이상 PVC Replication 검증 하였다. Snapshot 이 안되는 환경에서 백업 용도로 적합 할 것 같다. 

 

감사합니다.

반응형