kubernetes

k8s pv 마이그레이션

misankim 2023. 3. 7. 00:46



# 설치

 

kubectl krew update

kubectl krew install pv-migrate



# 마이그레이션

 

## 동일 네임스페이스 간 마이그레이션

 

kubectl pv-migrate migrate old-pvc new-pvc

 

rsync --delete 플래그 추가
kubectl pv-migrate migrate --dest-delete-extraneous-files old-pvc new-pvc

 

파드에 마운트 중이어도 무시하고 sync 진행
kubectl pv-migrate migrate --ignore-mounted old-pvc new-pvc

 

## 네임스페이스 간 마이그레이션

 

kubectl pv-migrate migrate \
  --source-namespace source-ns \
  --dest-namespace dest-ns \
  old-pvc new-pvc

 

## 클러스터 간 마이그레이션

 

kubectl pv-migrate migrate \
  --source-kubeconfig /path/to/source/kubeconfig \
  --source-context some-context \
  --source-namespace source-ns \
  --dest-kubeconfig /path/to/dest/kubeconfig \
  --dest-context some-other-context \
  --dest-namespace dest-ns \
  --dest-delete-extraneous-files \
  old-pvc new-pvc

 

## 커스텀 컨테이너 이미지 사용하여 마이그레이션

 

kubectl pv-migrate migrate \
  --helm-set rsync.image.repository=mycustomrepo/rsync \
  --helm-set rsync.image.tag=v1.2.3 \
  --helm-set sshd.image.repository=mycustomrepo/sshd \
  --helm-set sshd.image.tag=v1.2.3 \
  old-pvc new-pvc

 

## k8s network policy 를 사용하는 경우 마이그레이션

 

kubectl pv-migrate migrate \
  --helm-set sshd.networkPolicy.enabled=true \
  --helm-set rsync.networkPolicy.enabled=true \
  --source-namespace source-ns \
  --dest-namespace dest-ns \
  old-pvc new-pvc



# PV 재사용하기

 

RECLAIM POLICY 을 기본값 Delete 에서 Retain 으로 변경하면 PVC 가 삭제되어도 PV 는 자동으로 삭제되지 않음

 

NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                                STORAGECLASS   REASON    AGE
pvc-5d2bdbbc-1c95-4828-9810-0c30af3556b0   1Gi        RWO            Retain           Released   wordpress/mysql-pv-claim             gp2                      16h

 

이 경우 PV 를 확인해보면 STATUS 가 Released 인 것을 확인할 수 있다.

 

하지만 새로운 PVC 를 만들어도 PVC 는 Pending 상태로 PV 와 바인딩되지 못하는 것을 확인할 수 있다.

 

이런 경우 PV 의 정보 중 기존 연결했던 PVC 의 정보를 제거해줘야 새로운 PVC 에 바인딩이 가능하다.

 

kubectl edit pv pvc-5d2bdbbc-1c95-4828-9810-0c30af3556b0

 

제거해야하는 블럭
 
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: mysql-pv-claim
    namespace: wordpress
    resourceVersion: "691553"
    uid: 7eed4305-052f-47f9-9d6e-269152e9b325

 

동일한 PVC 네임과 연결하려면 resourceVersion, uid 만 삭제하면 되고,
아예 새로운 PVC 와 연결하려면 claimRef 블럭 전체를 삭제하면 된다.

 

정상적으로 edit 한 경우 PV 의 STATUS 가 Available 로 변경된 것을 확인할 수 있다.

 

NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                                STORAGECLASS   REASON    AGE
pvc-5d2bdbbc-1c95-4828-9810-0c30af3556b0   1Gi        RWO            Retain           Available   wordpress/mysql-pv-claim             gp2                      16h

 

PVC 의 상태를 확인하여 바인딩이 정상적으로 되었는지 확인한 뒤, 포드를 생성한다.

 

kubectl get pvc -n wordpress

 

기존 데이터가 남아있는 것을 확인할 수 있다.



# 기존 pv 를 재사용하도록 pvc 생성

 

kind: PersistentVolumeClaim 
apiVersion: v1 
metadata: 
  name: nginx-pvc 
spec:
  accessModes: 
    - ReadWriteMany 
  resources: 
    requests: 
      storage: 3Gi
  storageClassName: nfs-client

 

-> 아래와 같이 특정 sc 의 pv 를 사용하도록 매니페스트를 수정해준다.

 

kind: PersistentVolumeClaim 
apiVersion: v1 
metadata: 
  name: nginx-pvc 
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 3Gi
  storageClassName: nfs-ent
  volumeMode: Filesystem
  volumeName: pvc-22f035ca-f1da-4f92-9e1f-87b08f3e866b