본문 바로가기

HS/Round A Round

Round A Round - 6 - Containerized-Data-Importer

구글 번역기 감사해요

CDI(Containerized-Data-Importer)는 Kubernetes를 위한 persistent storage management add-on이다. 놀랍게도 Kubevirt 빼고는 사용해 본적 없다. Kubevirt의 디스크 이미지를 구축하는데 중점을 두고 있으며 주로 외부 환경에서 Kubernetes Volume으로 데이터를 가져오는데 사용된다.

 한 줄 요 약 : CDI는 PVC에 다른 데이터를 채워줌 !! 원래는 어케 만들었죠? 그냥 생성했습니돠 ㅋ

 

 모든 add-on이 그렇듯 CRD를 가지고 있는데 CDI는 DataVolume이라는 친구를 가지고 있다.

 

DataVolume

- 데이터를 사용하여 PVC를 생성하고 PVC에 데이터를 채워준다. 데이터가 채워지면 DV는 사용할 수 있는 상태가 됨!

 

- 상태 (내 블로그니까 내가 본 상태만 적어 봄)

Pending 스케줄링 대기 중
PVCBound 작업과 관련된 PVC가 바운드 됨
Import/Clone/UploadScheduled 작업이 잡힘
Import/Clone/UploadInProgress 작업 중
Succeeded 성공
Failed 실패

 

- 기본 예제

 

apiVersion: cdi.kubevirt.io/v1alpha1
kind: DataVolume
metadata:
  name: "example-import-dv"
spec:
  source:
      registry:
         url: docker://주소
  pvc:
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: "10240Mi"
    storageClassName: default

 

- 생성하면 import라는 pod가 생성되고 아래와 같은 작업을 수행한다.

 

[root@c1 test]# kubectl logs -f importer-example-import-dv-nv6jw
I0407 09:30:51.076464       1 importer.go:51] Starting importer
I0407 09:30:51.077791       1 importer.go:107] begin import process
I0407 09:30:51.092376       1 data-processor.go:253] Calculating available size
I0407 09:30:51.327485       1 data-processor.go:261] Checking out file system volume size.
I0407 09:30:51.328341       1 data-processor.go:265] Request image size not empty.
I0407 09:30:51.328358       1 data-processor.go:270] Target size 10Gi.
I0407 09:30:51.329943       1 data-processor.go:183] New phase: TransferScratch
I0407 09:30:51.330504       1 registry-datasource.go:80] Copying registry image to scratch space.
I0407 09:30:51.330524       1 skopeo.go:74] Disabling TLS verification for URL docker://
I0407 09:31:05.888770       1 skopeo.go:120] extracting image layers to "/scratch"
I0407 09:31:05.889867       1 util.go:182] begin untar to /scratch...
E0407 09:31:08.862176       1 util.go:202] exit status 2
I0407 09:31:08.867752       1 util.go:182] begin untar to /scratch...
E0407 09:31:08.987955       1 util.go:202] exit status 2
I0407 09:31:08.988958       1 util.go:182] begin untar to /scratch...
E0407 09:31:08.991194       1 util.go:202] exit status 2
I0407 09:31:08.992456       1 util.go:182] begin untar to /scratch...
I0407 09:31:35.150222       1 data-processor.go:183] New phase: Process
I0407 09:31:35.170416       1 registry-datasource.go:148] VM disk image filename is CentOS-7-x86_64-GenericCloud-1901.qcow2
I0407 09:31:35.170455       1 data-processor.go:183] New phase: Convert
I0407 09:31:35.170464       1 data-processor.go:189] Validating image
I0407 09:32:08.034346       1 data-processor.go:183] New phase: Resize
I0407 09:32:09.828765       1 data-processor.go:246] Expanding image size to: 10Gi
I0407 09:32:09.943410       1 data-processor.go:183] New phase: Complete
I0407 09:32:09.944839       1 util.go:37] deleting file: /scratch/disk
I0407 09:32:10.124580       1 importer.go:160] Import complete

 

import 포드가 사라진 뒤 describe dv를 하면 아래와 같은 이벤트가 보이고 pvc가 조회된다.

 

Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  ImportScheduled   3m40s  datavolume-controller  Import into example-import-dv scheduled
  Normal  ImportInProgress  3m18s  datavolume-controller  Import into example-import-dv in progress
  Normal  ImportSucceeded   117s   datavolume-controller  Successfully imported into PVC example-import-dv
  
[root@c1 test]# kubectl get pvc
NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
example-import-dv   Bound    pvc-366f4e0c-9719-4599-abfd-a6fe7f93da47   10Gi       RWO            default        3m53s

 

여기서 놓친 부분이 있다. 바로 scratch이다.

 

[root@c1 test]# kubectl get pvc
NAME                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
example-import-dv           Bound    pvc-0893f7c0-9ceb-4c35-9d23-b3b85e9e7f80   10Gi       RWO            csi-cephfs     4s
example-import-dv-scratch   Bound    pvc-1a3d032e-24bd-419d-9bdf-1d2b7a5aed5e   10Gi       RWO            csi-cephfs     4s

dv 생성 이후 잽싸게 pvc를 조회해보면 만드려는 dv의 scratch를 볼 수 있다. 얘는 CDI의 작업을 진행하기 위한 공간인데 대충 아무데서나 가져올 수 있지만 스토리지의 사용량을 분명히 하기 위해서 공간을 만들어주었다. DV와 동일한 크기를 할당받으며 작업 종료 이후에는 scratch도 사라진다.

 

 그렇다면 flow가 어떠케 되느냐?

1.사용자는 CDI Controller에게 생성 요청

2.인증이 필요할 경우 secret를 생성

3.PVC를 생성하고 생성된 PVC는 Storage를 지정하여 PV를 생성

4.PV는 실제 영구볼륨을 생성

5.이미지에 볼륨을 매핑

6.importer Pod를 통해 PVC를 마운트

7.데이터 저장소에서 이미지 복사, 이후에는 importer Pod 종료

 

그리고 이제 VM은 데이터가 들어있는 PVC를 쓰면 된다~~~~~~이 정도로 이해하고 끝내야겠다. 더 깊이 들어가면.. 시간이 부족햇