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
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。