10.20. 克隆虚拟机
10.20.1. 启用用户权限跨命名空间克隆数据卷
命名空间的隔离性质意味着用户默认无法在命名空间之间克隆资源。
要让用户将虚拟机克隆到另一个命名空间,具有 cluster-admin
角色的用户必须创建新的集群角色。将此集群角色绑定到用户,以便其将虚拟机克隆到目标命名空间。
10.20.1.1. 先决条件
-
只有具有
cluster-admin
角色的用户才能创建集群角色。
10.20.1.2. 关于数据卷
DataVolume
对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。您可以将数据卷创建为独立资源,也可以使用虚拟机 (VM) 规格中的 dataVolumeTemplate
字段。
-
使用独立数据卷准备的虚拟机磁盘 PVC,维护虚拟机的独立生命周期。如果您使用虚拟机规格中的
dataVolumeTemplate
字段准备 PVC,PVC 会共享与虚拟机相同的生命周期。
10.20.1.3. 创建用于克隆数据卷的 RBAC 资源
创建一个新的集群角色,为 datavolumes
资源的所有操作启用权限。
流程
创建
ClusterRole
清单:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: <datavolume-cloner> 1 rules: - apiGroups: ["cdi.kubevirt.io"] resources: ["datavolumes/source"] verbs: ["*"]
- 1
- 集群角色的唯一名称。
在集群中创建集群角色:
$ oc create -f <datavolume-cloner.yaml> 1
- 1
- 上一步中创建的
ClusterRole
清单的文件名。
创建应用于源和目标命名空间的
RoleBinding
清单,并引用上一步中创建的集群角色。apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: <allow-clone-to-user> 1 namespace: <Source namespace> 2 subjects: - kind: ServiceAccount name: default namespace: <Destination namespace> 3 roleRef: kind: ClusterRole name: datavolume-cloner 4 apiGroup: rbac.authorization.k8s.io
在集群中创建角色绑定:
$ oc create -f <datavolume-cloner.yaml> 1
- 1
- 上一步中创建的
RoleBinding
清单的文件名。
10.20.2. 将虚拟机磁盘克隆到新数据卷中
您可以通过引用数据卷配置文件中的源 PVC 来将虚拟机磁盘的持久性卷声明(PVC)克隆到新数据卷中。
支持在不同卷模式间克隆操作,比如从带有 volumeMode: Block
的持久性卷(PV)克隆到带有 volumeMode: Filesystem
的 PV。
但是,只有在不同的卷模式中存在contentType: kubevirt
时才可以克隆它们。
当您全局启用预分配或单个数据卷时,Containerized Data Importer(CDI)会在克隆过程中预分配磁盘空间。预分配可提高写入性能。如需更多信息,请参阅对数据卷使用预分配。
10.20.2.1. 先决条件
- 用户需要额外权限才能将虚拟机磁盘的 PVC 克隆到另一个命名空间中。
10.20.2.2. 关于数据卷
DataVolume
对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。您可以将数据卷创建为独立资源,也可以使用虚拟机 (VM) 规格中的 dataVolumeTemplate
字段。
-
使用独立数据卷准备的虚拟机磁盘 PVC,维护虚拟机的独立生命周期。如果您使用虚拟机规格中的
dataVolumeTemplate
字段准备 PVC,PVC 会共享与虚拟机相同的生命周期。
10.20.2.3. 将虚拟机磁盘的持久性卷声明克隆到新数据卷中
您可以将现有虚拟机磁盘的持久性卷声明(PVC)克隆到新数据卷中。新的数据卷可用于新虚拟机。
当独立于虚拟机创建数据卷时,数据卷的生命周期与虚拟机是独立的。如果删除了虚拟机,数据卷及其相关 PVC 都不会被删除。
先决条件
- 确定要使用的现有虚拟机磁盘的 PVC。克隆之前,必须关闭与 PVC 关联的虚拟机。
-
安装 OpenShift CLI(
oc
)。
流程
- 检查您要克隆的虚拟机磁盘,以识别关联 PVC 的名称和命名空间。
为数据卷创建一个 YAML 文件,用于指定新数据卷的名称、源 PVC 的名称和命名空间,以及新数据卷的大小。
例如:
apiVersion: cdi.kubevirt.io/v1beta1 kind: DataVolume metadata: name: <cloner-datavolume> 1 spec: source: pvc: namespace: "<source-namespace>" 2 name: "<my-favorite-vm-disk>" 3 pvc: accessModes: - ReadWriteOnce resources: requests: storage: <2Gi> 4
通过创建数据卷开始克隆 PVC:
$ oc create -f <cloner-datavolume>.yaml
注意在 PVC 就绪前,DataVolume 会阻止虚拟机启动,以便您可以在 PVC 克隆期间创建引用新数据卷的虚拟机。
10.20.2.4. CDI 支持的操作列表
此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。
内容类型 | HTTP | HTTPS | HTTP 基本身份验证 | Registry | 上传 |
---|---|---|---|---|---|
KubeVirt (QCOW2) |
✓ QCOW2 |
✓ QCOW2** |
✓ QCOW2 |
✓ QCOW2* |
✓ QCOW2* |
KubeVirt (RAW) |
✓ RAW |
✓ RAW |
✓ RAW |
✓ RAW* |
✓ RAW* |
✓ 支持的操作
□ 不支持的操作
* 需要涂销空间
** 如果需要自定义证书颁发机构,则需要涂销空间
10.20.3. 使用数据卷模板克隆虚拟机
您可以通过克隆现有虚拟机的持久性卷声明(PVC)来创建新虚拟机。在虚拟机配置文件中包括 dataVolumeTemplate
,即可从原始 PVC 创建新数据卷。
支持在不同卷模式间克隆操作,比如从带有 volumeMode: Block
的持久性卷(PV)克隆到带有 volumeMode: Filesystem
的 PV。
但是,只有在不同的卷模式中存在contentType: kubevirt
时才可以克隆它们。
当您全局启用预分配或单个数据卷时,Containerized Data Importer(CDI)会在克隆过程中预分配磁盘空间。预分配可提高写入性能。如需更多信息,请参阅对数据卷使用预分配。
10.20.3.1. 先决条件
- 用户需要额外权限才能将虚拟机磁盘的 PVC 克隆到另一个命名空间中。
10.20.3.2. 关于数据卷
DataVolume
对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。您可以将数据卷创建为独立资源,也可以使用虚拟机 (VM) 规格中的 dataVolumeTemplate
字段。
-
使用独立数据卷准备的虚拟机磁盘 PVC,维护虚拟机的独立生命周期。如果您使用虚拟机规格中的
dataVolumeTemplate
字段准备 PVC,PVC 会共享与虚拟机相同的生命周期。
10.20.3.3. 使用数据卷模板从克隆的持久性卷声明创建新虚拟机
您可以创建一个虚拟机,将现有虚拟机的持久性卷声明(PVC)克隆到数据卷中。在虚拟机清单中引用 dataVolumeTemplate
,并将源
PVC 克隆到数据卷中,然后自动用于创建虚拟机。
当作为虚拟机的数据卷模板创建数据卷时,数据卷的生命周期依赖于虚拟机。如果删除了虚拟机,数据卷和相关 PVC 也会被删除。
先决条件
- 确定要使用的现有虚拟机磁盘的 PVC。克隆之前,必须关闭与 PVC 关联的虚拟机。
-
安装 OpenShift CLI(
oc
)。
流程
- 检查您要克隆的虚拟机,以识别关联 PVC 的名称和命名空间。
为
VirtualMachine
对象创建 YAML 文件。以下虚拟机示例克隆my-favorite-vm-disk
,该磁盘位于source-name
命名空间中。从my-favorite-vm-disk
创建的名为favorite-clone
的2Gi
数据卷 。例如:
apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: labels: kubevirt.io/vm: vm-dv-clone name: vm-dv-clone 1 spec: running: false template: metadata: labels: kubevirt.io/vm: vm-dv-clone spec: domain: devices: disks: - disk: bus: virtio name: root-disk resources: requests: memory: 64M volumes: - dataVolume: name: favorite-clone name: root-disk dataVolumeTemplates: - metadata: name: favorite-clone spec: storage: accessModes: - ReadWriteOnce resources: requests: storage: 2Gi source: pvc: namespace: "source-namespace" name: "my-favorite-vm-disk"
- 1
- 要创建的虚拟机。
使用 PVC 克隆的数据卷创建虚拟机:
$ oc create -f <vm-clone-datavolumetemplate>.yaml
10.20.3.4. CDI 支持的操作列表
此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。
内容类型 | HTTP | HTTPS | HTTP 基本身份验证 | Registry | 上传 |
---|---|---|---|---|---|
KubeVirt (QCOW2) |
✓ QCOW2 |
✓ QCOW2** |
✓ QCOW2 |
✓ QCOW2* |
✓ QCOW2* |
KubeVirt (RAW) |
✓ RAW |
✓ RAW |
✓ RAW |
✓ RAW* |
✓ RAW* |
✓ 支持的操作
□ 不支持的操作
* 需要涂销空间
** 如果需要自定义证书颁发机构,则需要涂销空间
10.20.4. 将虚拟机磁盘克隆到新块存储数据卷中
您可以通过引用数据卷配置文件中的源 PVC 来将虚拟机磁盘的持久性卷声明(PVC)克隆到新的块数据卷中。
支持在不同卷模式间克隆操作,比如从带有 volumeMode: Block
的持久性卷(PV)克隆到带有 volumeMode: Filesystem
的 PV。
但是,只有在不同的卷模式中存在contentType: kubevirt
时才可以克隆它们。
当您全局启用预分配或单个数据卷时,Containerized Data Importer(CDI)会在克隆过程中预分配磁盘空间。预分配可提高写入性能。如需更多信息,请参阅对数据卷使用预分配。
10.20.4.1. 先决条件
- 用户需要额外权限才能将虚拟机磁盘的 PVC 克隆到另一个命名空间中。
10.20.4.2. 关于数据卷
DataVolume
对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层持久性卷声明(PVC)关联的导入、克隆和上传操作。您可以将数据卷创建为独立资源,也可以使用虚拟机 (VM) 规格中的 dataVolumeTemplate
字段。
-
使用独立数据卷准备的虚拟机磁盘 PVC,维护虚拟机的独立生命周期。如果您使用虚拟机规格中的
dataVolumeTemplate
字段准备 PVC,PVC 会共享与虚拟机相同的生命周期。
10.20.4.3. 关于块持久性卷
块持久性卷(PV)是一个受原始块设备支持的 PV。这些卷没有文件系统,可以通过降低开销来为虚拟机提供性能优势。
原始块卷可以通过在 PV 和持久性卷声明(PVC)规格中指定 volumeMode: Block
来置备。
10.20.4.4. 创建本地块持久性卷
通过填充文件并将其挂载为循环设备,在节点上创建本地块持久性卷(PV)。然后,您可以在 PV 清单中将该循环设备作为 Block(块)
卷引用,并将其用作虚拟机镜像的块设备。
流程
-
以
root
身份登录节点,在其上创建本地 PV。本流程以node01
为例。 创建一个文件并用空字符填充,以便可将其用作块设备。以下示例创建
loop10
文件,大小为 2Gb(20,100 Mb 块):$ dd if=/dev/zero of=<loop10> bs=100M count=20
将
loop10
文件挂载为 loop 设备。$ losetup </dev/loop10>d3 <loop10> 1 2
创建引用所挂载 loop 设备的
PersistentVolume
清单。kind: PersistentVolume apiVersion: v1 metadata: name: <local-block-pv10> annotations: spec: local: path: </dev/loop10> 1 capacity: storage: <2Gi> volumeMode: Block 2 storageClassName: local 3 accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Delete nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - <node01> 4
创建块 PV。
# oc create -f <local-block-pv10.yaml>1
- 1
- 上一步中创建的持久性卷的文件名。
10.20.4.5. 将虚拟机磁盘的持久性卷声明克隆到新数据卷中
您可以将现有虚拟机磁盘的持久性卷声明(PVC)克隆到新数据卷中。新的数据卷可用于新虚拟机。
当独立于虚拟机创建数据卷时,数据卷的生命周期与虚拟机是独立的。如果删除了虚拟机,数据卷及其相关 PVC 都不会被删除。
先决条件
- 确定要使用的现有虚拟机磁盘的 PVC。克隆之前,必须关闭与 PVC 关联的虚拟机。
-
安装 OpenShift CLI(
oc
)。 - 至少一个可用块持久性卷(PV)大小不低于源 PVC。
流程
- 检查您要克隆的虚拟机磁盘,以识别关联 PVC 的名称和命名空间。
为数据卷创建一个 YAML 文件,用于指定新数据卷的名称、源 PVC 的名称和命名空间、
volumeMode: Block
,以便使用可用块 PV,以及新数据卷的大小。例如:
apiVersion: cdi.kubevirt.io/v1beta1 kind: DataVolume metadata: name: <cloner-datavolume> 1 spec: source: pvc: namespace: "<source-namespace>" 2 name: "<my-favorite-vm-disk>" 3 pvc: accessModes: - ReadWriteOnce resources: requests: storage: <2Gi> 4 volumeMode: Block 5
通过创建数据卷开始克隆 PVC:
$ oc create -f <cloner-datavolume>.yaml
注意在 PVC 就绪前,DataVolume 会阻止虚拟机启动,以便您可以在 PVC 克隆期间创建引用新数据卷的虚拟机。
10.20.4.6. CDI 支持的操作列表
此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。
内容类型 | HTTP | HTTPS | HTTP 基本身份验证 | Registry | 上传 |
---|---|---|---|---|---|
KubeVirt (QCOW2) |
✓ QCOW2 |
✓ QCOW2** |
✓ QCOW2 |
✓ QCOW2* |
✓ QCOW2* |
KubeVirt (RAW) |
✓ RAW |
✓ RAW |
✓ RAW |
✓ RAW* |
✓ RAW* |
✓ 支持的操作
□ 不支持的操作
* 需要涂销空间
** 如果需要自定义证书颁发机构,则需要涂销空间