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/
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
위 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
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 이 안되는 환경에서 백업 용도로 적합 할 것 같다.
감사합니다.
'쿠버네티스 일반' 카테고리의 다른 글
Kubernetes 컨설팅/구축 서비스 (0) | 2021.07.30 |
---|---|
Gitlab Helm Install on On-Prem (0) | 2021.07.30 |
Kube snapshot scheduler (0) | 2021.07.22 |
[kubectl df-pv] Kube PV 사용량 확인 Tool (0) | 2021.07.21 |
Kubernetes Snapshot 백업/복구 (0) | 2021.07.16 |