跳转至

3.DataVolume克隆

克隆DataVolume

克隆DataVolume 到目标PV,即将镜像从现有的(文件系统或块)DV/PVC克隆到目标PV。 目标PV可以是块(Block),也可以是文件系统(Filesystem)。源可以是PVC(DV),也可以是卷快照(VolumeSnapshot)。

目标PV是Block类型

参考官档 1. 先决条件 - k8s集群就绪,已完成CDI安装,有可用的PersistentVolume来存储磁盘镜像。 - 从文件系统(File system)克隆到块(Block)时,源端和目标端内容类型(contentType)都必须为kubevirt(默认,可通过describe dv查看contentType),并且使用主机辅助(host-assisted)克隆。

先准备一个要被克隆的PVC,此处使用已经存在的名称为img-cirros-0.5.1的PVC,可参考 从一个URL中导入

apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
  name: cloned-dv1
  namespace: test
  annotations:
    # 这个注解是调试用,表示在dv填充好pvc之后,仍然保留传输的pod,参考debug.md
    cdi.kubevirt.io/storage.pod.retainAfterCompletion: "true"
spec:
  source:
    pvc:
      namespace: default
      name: img-cirros-0.5.1
  pvc:
    storageClassName: "ceph-hdd-block"
    # 指定volumeMode
    volumeMode: Block
    accessModes:
      - ReadWriteMany
    # 目标是PVC,所以需要指定存储大小,不能小于源pvc大小
    resources:
      requests:
        storage: 1Gi
# kubectl create ns test
# kubectl apply -f cloned-dv1.yaml
# kubectl get pods
NAME                                              READY   STATUS      RESTARTS   AGE
18ad6ca6-ff09-4559-8299-cd2c73fbd58f-source-pod   0/1     Completed   0          27s
# kubectl get pods -n test
NAME                    READY   STATUS      RESTARTS   AGE
cdi-upload-cloned-dv2   0/1     Completed   0          39s

apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
  name: cloned-dv2
  namespace: test
  annotations:
    cdi.kubevirt.io/storage.pod.retainAfterCompletion: "true"
spec:
  source:
    pvc:
      namespace: default
      name: img-cirros-0.5.1
  storage:
    # 这里目标是storage,可以不用指定大小
    # 指定了volumeMode
    volumeMode: "Block"
    storageClassName: "ceph-hdd-block"
    accessModes:
      - ReadWriteMany
# kubectl apply -f cloned-dv1.yaml
# kubectl get pods 
NAME                                              READY   STATUS      RESTARTS   AGE
f99e0997-7eb6-4b44-8242-e5da7a2cb15e-source-pod   0/1     Completed   0          40s
# kubectl get pods -n test
NAME                    READY   STATUS      RESTARTS   AGE
cdi-upload-cloned-dv1   0/1     Completed   0          56s

克隆DV会生成2个pod,源和目标,源是cdi-cloner,目标是cdi-uploadserver 源块PV上存在的镜像将被复制到目标块PV上。

目标PV是Filesystem类型

参考官档

apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
  name: cloned-dv3
  namespace: test
  annotations:
    cdi.kubevirt.io/storage.pod.retainAfterCompletion: "true"
spec:
  source:
    pvc:
      namespace: default
      name: img-cirros-0.5.1
  pvc:
    # 跨SC,且存储类指定为Filesystem类型
    storageClassName: "cephfs-hdd"
    # 不指定
    # volumeMode: Block
    accessModes:
      - ReadWriteMany
    # 需要指定存储大小,不能小于源pv大小
    resources:
      requests:
        storage: 1Gi
# kubectl get pods
NAME                                              READY   STATUS      RESTARTS   AGE
13fa795b-99e9-432e-a035-fda7cc36fdef-source-pod   0/1     Completed   0          117s
[root@ceph01 images]# kubectl get pods -n test
NAME                    READY   STATUS      RESTARTS   AGE
cdi-upload-cloned-dv3   0/1     Completed   0          2m3s

apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
  name: cloned-dv4
  namespace: test
  annotations:
    cdi.kubevirt.io/storage.pod.retainAfterCompletion: "true"
spec:
  source:
    pvc:
      namespace: default
      name: img-cirros-0.5.1
  storage:
    storageClassName: "cephfs-hdd"
    # 不指定
    # volumeMode: Block
    accessModes:
      - ReadWriteMany
# kubectl get pods
NAME                                              READY   STATUS      RESTARTS   AGE
92aded85-5a62-4bd7-a8b8-3108035ddc8a-source-pod   0/1     Completed   0          85s
# kubectl get pods -n test
NAME                    READY   STATUS      RESTARTS   AGE
cdi-upload-cloned-dv4   0/1     Completed   0          90s
# kubectl get dv -n test
NAME         PHASE       PROGRESS   RESTARTS   AGE
cloned-dv4   Succeeded   100.0%                94s

# kubectl logs 92aded85-5a62-4bd7-a8b8-3108035ddc8a-source-pod 
VOLUME_MODE=block
MOUNT_POINT=/dev/cdi-block-volume
UPLOAD_BYTES=1073741824
I1015 10:38:18.155656       7 clone-source.go:220] content-type is "blockdevice-clone"
I1015 10:38:18.155732       7 clone-source.go:221] mount is "/dev/cdi-block-volume"
I1015 10:38:18.155737       7 clone-source.go:222] upload-bytes is 1073741824
I1015 10:38:18.155746       7 clone-source.go:239] Starting cloner target
I1015 10:38:18.589006       7 clone-source.go:251] Set header to blockdevice-clone
I1015 10:38:19.164808       7 prometheus.go:75] 15.78
I1015 10:38:20.165210       7 prometheus.go:75] 52.03
I1015 10:38:21.166704       7 prometheus.go:75] 75.85
I1015 10:38:22.166961       7 prometheus.go:75] 78.50
I1015 10:38:23.167298       7 prometheus.go:75] 97.75
I1015 10:38:23.255123       7 clone-source.go:127] Wrote 1073741824 bytes
I1015 10:38:24.009322       7 clone-source.go:269] Response body:
I1015 10:38:24.009367       7 clone-source.go:271] clone complete


# kubectl logs -n test cdi-upload-cloned-dv4 
I1015 10:38:05.890232       1 uploadserver.go:74] Running server on 0.0.0.0:8443
I1015 10:38:18.601278       1 uploadserver.go:389] Content type header is "blockdevice-clone"
I1015 10:38:18.601353       1 data-processor.go:356] Calculating available size
I1015 10:38:18.601382       1 data-processor.go:368] Checking out file system volume size.
I1015 10:38:18.606367       1 data-processor.go:376] Request image size not empty.
I1015 10:38:18.606422       1 data-processor.go:381] Target size 1136234735.
I1015 10:38:18.606577       1 data-processor.go:255] New phase: TransferDataFile
I1015 10:38:18.614099       1 util.go:194] Writing data...
I1015 10:38:23.994902       1 data-processor.go:255] New phase: Resize
E1015 10:38:24.002114       1 prlimit.go:155] failed to kill the process; os: process already finished
W1015 10:38:24.002257       1 data-processor.go:338] Available space less than requested size, resizing image to available space 1073741824.
I1015 10:38:24.002284       1 data-processor.go:341] No need to resize image. Requested size: 1136234735, Image size: 1073741824.
I1015 10:38:24.002297       1 data-processor.go:261] Validating image
E1015 10:38:24.008940       1 prlimit.go:155] failed to kill the process; os: process already finished
I1015 10:38:24.009040       1 data-processor.go:255] New phase: Complete
I1015 10:38:24.009060       1 uploadserver.go:416] Wrote data to /data/disk.img
I1015 10:38:24.009159       1 uploadserver.go:203] Shutting down http server after successful upload
I1015 10:38:24.009699       1 uploadserver.go:103] UploadServer successfully exited

# kubectl describe dv -n test cloned-dv4 
Name:         cloned-dv4
Namespace:    test
Labels:       <none>
Annotations:  cdi.kubevirt.io/cloneType: copy
              cdi.kubevirt.io/storage.clone.token:
                eyJhbGciOiJQUzI1NiJ9.eyJleHAiOjE2OTczNjY1ODQsImlhdCI6MTY5NzM2NjI4NCwiaXNzIjoiY2RpLWFwaXNlcnZlciIsIm5hbWUiOiJpbWctY2lycm9zIiwibmFtZXNwYWNlI...
              cdi.kubevirt.io/storage.extended.clone.token:
                eyJhbGciOiJQUzI1NiJ9.eyJleHAiOjIwMTI3MjYyODQsImlhdCI6MTY5NzM2NjI4NCwiaXNzIjoiY2RpLWRlcGxveW1lbnQiLCJuYW1lIjoiaW1nLWNpcnJvcyIsIm5hbWVzcGFjZ...
              cdi.kubevirt.io/storage.pod.retainAfterCompletion: true
              cdi.kubevirt.io/storage.usePopulator: false
API Version:  cdi.kubevirt.io/v1beta1
Kind:         DataVolume
Metadata:
  Creation Timestamp:  2023-10-15T10:38:04Z
  Generation:          2
  Resource Version:    1894349
  UID:                 8c36ec90-38e1-4a7f-ac87-848c045eb754
Spec:
  Source:
    Pvc:
      Name:       img-cirros
      Namespace:  default
  Storage:
    Access Modes:
      ReadWriteMany
    Resources:
    Storage Class Name:  cephfs-hdd
Status:
  Claim Name:  cloned-dv4
  Conditions:
    Last Heartbeat Time:   2023-10-15T10:38:04Z
    Last Transition Time:  2023-10-15T10:38:04Z
    Message:               PVC cloned-dv4 Bound
    Reason:                Bound
    Status:                True
    Type:                  Bound
    Last Heartbeat Time:   2023-10-15T10:38:26Z
    Last Transition Time:  2023-10-15T10:38:26Z
    Status:                True
    Type:                  Ready
    Last Heartbeat Time:   2023-10-15T10:38:24Z
    Last Transition Time:  2023-10-15T10:38:24Z
    Message:               Clone Complete
    Reason:                Completed
    Status:                False
    Type:                  Running
  Phase:                   Succeeded
  Progress:                100.0%
Events:
  Type     Reason           Age    From                             Message
  ----     ------           ----   ----                             -------
  Normal   Pending          3m25s  datavolume-pvc-clone-controller  PVC cloned-dv4 Pending
  Normal   Bound            3m25s  datavolume-pvc-clone-controller  PVC cloned-dv4 Bound
  Normal   CloneInProgress  3m23s  datavolume-pvc-clone-controller  Cloning from default/img-cirros into test/cloned-dv4 in progress
  Warning  Completed        3m5s   datavolume-pvc-clone-controller  Clone Complete
  Normal   CloneSucceeded   3m3s   datavolume-pvc-clone-controller  Successfully cloned from default/img-cirros into test/cloned-dv4

PVC克隆,k8s官档描述叫CSI克隆卷 ,PVC克隆有诸多限制条件,比如源和目标PVC必须在相同的命名空间。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-cirros01-bootdisk
  namespace: default
spec:
  storageClassName: "ceph-hdd-block"
  volumeMode: Block
  accessModes:
    - ReadWriteMany
  dataSource:
    kind: PersistentVolumeClaim
    name: img-cirros  #pvc名,注意:名称空间一致,否则无法创建。
  resources:
    requests:
      storage: 2Gi

默认情况下,CDI将尝试最有效的克隆策略。参见智能克隆。对于主机辅助克隆,将生成两个克隆pod,源和目标,并且将源DV/PVC上存在的镜像复制到目标DV。