TheKoguryo's 기술 블로그

 Version 2024.04.01

1.2.3.4 Kubernetes Volume Clone 만들기

운영에 영향 없이 Volume 복제본을 만들어 테스트가 필요한 경우처럼, 사용중인 Persistent Volume을 복제하여 사용할 필요가 있을 때 사용할 수 있습니다.

Block Volume Clone 사용 전제조건
  • OKE 클러스터 Control Plane의 쿠버네티스 버전은 1.25 이상
  • Worker Node가 AMD 또는 Arm 기반이어야 함
  • Worker Node는 Oracle Linux 7 또는 Oracle Linux 8
  • CSI volume plugin(여, oct-bv StorageClass)를 사용하여 이미 OCI Block Volume과 바인딩된 Persistent Volume이 있어야 함
테스트 환경 준비
  1. 1.2.3.1 Block Volume 사용하기에서 Block Volume을 사용하여, Persistent Volume을 구성한 예제를 그대로 사용합니다.

  2. 현재 상태를 조회하면 다음과 같습니다.

    • CSI Volume Plugin을 통해 제공하는 기능으로 반드시 oci-bv StorageClass를 사용하는 Persistent Volume 이어야 합니다.
    • /usr/share/nginx/html 폴더가 PV를 마운트하고 있습니다.
    • 마운트된 폴더에 파일 쓰기를 한 상태로 이후 실습에서 해당내용이 복구되는 지 확인할 예정
    $ kubectl get pvc
    NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    csi-bvs-pvc   Bound    csi-5385a65d-0cb8-4c65-9f6e-c65e70b997d3   50Gi       RWO            oci-bv         98s
    $ kubectl get pod
    NAME                             READY   STATUS    RESTARTS   AGE
    nginx-bvs-pvc-549db9449b-gbnf8   1/1     Running   0          95s
    $ kubectl exec -it nginx-bvs-pvc-549db9449b-gbnf8 -- cat /usr/share/nginx/html/hello_world.txt
    Hello PV
    
기존 Block Volume을 복제하는 새 PVC 만들기
  1. 아래와 같이 PV 요청 yaml을 사용하여 요청합니다. dataSource에서 기존 PVC를 지정합니다.

    # my-clone-pvc.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-clone-pvc
    spec:
      storageClassName: "oci-bv"
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 50Gi
      dataSource:
        kind: PersistentVolumeClaim
        name: csi-bvs-pvc      
    
    • dataSource.kind: PersistentVolumeClaim
    • dataSource.name: 복제할 원본 PVC 이름을 입력
  2. PVC를 생성합니다.

    kubectl apply -f my-clone-pvc.yaml
    
  3. 테스트 앱 복구용 YAML 작성

    • 테스트앱에서 persistentVolumeClaim.claimName을 my-clone-pvc로 지정합니다.
    # nginx-deployment-bvs-pvc-from-clone-pvc.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx-bvs-from-clone-pvc
      name: nginx-bvs-from-clone-pvc
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx-bvs-from-clone-pvc
      template:
        metadata:
          labels:
            app: nginx-bvs-from-clone-pvc
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            volumeMounts:
            - name: data
              mountPath: /usr/share/nginx/html
          volumes:
          - name: data
            persistentVolumeClaim:
              claimName: my-clone-pvc
    
  4. 테스트앱 배포

    • 테스트 앱에 배포되면, 앞선 PVC에 바인딩되는 Persistent Volume이 만들어 지면서 새 OCI Block Volume이 생성됩니다.
    kubectl apply -f nginx-deployment-bvs-pvc-from-clone-pvc.yaml
    
  5. 복제된 PVC, PV가 생성되었습니다.

    $ kubectl get pvc
    NAME           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    csi-bvs-pvc    Bound    csi-5385a65d-0cb8-4c65-9f6e-c65e70b997d3   50Gi       RWO            oci-bv         21m
    my-clone-pvc   Bound    csi-efe229e2-02a2-402f-b422-fdde520146c4   50Gi       RWO            oci-bv         13m
    $ kubectl get pv
    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                  STORAGECLASS   REASON   AGE
    csi-5385a65d-0cb8-4c65-9f6e-c65e70b997d3   50Gi       RWO            Delete           Bound    default/csi-bvs-pvc    oci-bv                  21m
    csi-efe229e2-02a2-402f-b422-fdde520146c4   50Gi       RWO            Delete           Bound    default/my-clone-pvc   oci-bv                  3m35s
    
  6. 복제된 PV를 사용하는 앱에서 파일 내용을 확인합니다. 복제가 잘 된 것을 알 수 있습니다.

    $ kubectl get pod
    NAME                                        READY   STATUS    RESTARTS   AGE
    nginx-bvs-from-clone-pvc-7f6fd8dfbb-mr88f   1/1     Running   0          4m42s
    nginx-bvs-pvc-549db9449b-gbnf8              1/1     Running   0          22m
    donghee_le@cloudshell:tmp (ap-chuncheon-1)$ kubectl exec -it nginx-bvs-from-clone-pvc-7f6fd8dfbb-mr88f -- cat /usr/share/nginx/html/hello_world.txt
    Hello PV
    


이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.

Last updated on 13 Oct 2023