虚拟机克隆
克隆由 clone.kubevirt.io
组 API 资源来实现。当前版本为 v1alpha1
。
克隆依赖快照和恢复快照,所以使用克隆前需要保证 KubeVirt 的快照和恢复快照功能可用。
克隆 YAML 清单
apiVersion: "clone.kubevirt.io/v1alpha1"
kind: VirtualMachineClone
metadata:
name: testclone-my-vm
namespace: default
spec:
# source & target definitions
source:
apiGroup: kubevirt.io
kind: VirtualMachine
name: my-vm
target:
apiGroup: kubevirt.io
kind: VirtualMachine
name: vm-clone-my-vm
# labels & annotations definitions
labelFilters:
- "*"
- "!somekey/*"
annotationFilters:
- "anotherkey/*"
# template labels & annotations definitions
template:
labelFilters:
- "*"
- "!somekey/*"
annotationFilters:
- "anotherkey/*"
# other identity stripping specs:
newMacAddresses:
enp1s0: "00:50:56:35:1A:8C"
enp2s0: "00:50:56:27:B9:AC"
newSMBiosSerial: "my-vm-clone"
- 克隆的
source
和target
目前只支持VirtualMachine
(kubevirt.io
API 组)和VirtualMachineSnapshot
(snapshot.kubevirt.io
API 组)。 labelFilters
和annotationFilters
是可选的,使用有如下限制:- 支持通配符(
*
),通配符需要在过滤器末尾。 - 下述过滤器有效:
- "*"
- "some/key*"
- 下述过滤器无效:
- "some/*/key"
- "*/key"
- 否定字符 (!)可用于避免匹配某些键。否定只能用在过滤器的开头。
- 支持通配符(
template
用于将过滤某些组件附加的标签或注释,比方说某些网络 CNI(例如 Kube-OVN 或 OVN-Kubernetes)。newMacAddresses
用于设置新网卡的 MAC 地址,是可选的。(需要 kube-mac-pool,不过感觉没什么用,可以通过编辑VirtualMachine
添加macAddress
字段来设置 MAC 地址。)newSMBiosSerial
用于设置新虚拟机的序列号。
我这里
newMacAddresses
和newSMBiosSerial
设置都没生效,不知道为什么。
部署 kube-mac-pool
[root@base-k8s-master-1 kubemacpool]# wget https://raw.githubusercontent.com/k8snetworkplumbingwg/kubemacpool/master/config/release/kubemacpool.yaml
mac_oui=02:`openssl rand -hex 1`:`openssl rand -hex 1`--2025-03-22 21:25:40-- https://raw.githubusercontent.com/k8snetworkplumbingwg/kubemacpool/master/config/release/kubemacpool.yaml
sed -i "s/02:00:00:00:00:00/$mac_oui:00:00:00/" kubemacpool.yamlConnecting to 192.168.50.199:10809... connected.
sed -i "s/02:FF:FF:FF:FF:FF/$mac_oui:FF:FF:FF/" kubemacpool.yaml
kubectl apply -f ./kubemacpool.yamlProxy request sent, awaiting response... 200 OK
Length: 9883 (9.7K) [text/plain]
Saving to: ‘kubemacpool.yaml’
kubemacpool.yaml 100%[=================================================================================================================================>] 9.65K --.-KB/s in 0.002s
2025-03-22 21:25:40 (4.21 MB/s) - ‘kubemacpool.yaml’ saved [9883/9883]
[root@base-k8s-master-1 kubemacpool]# mac_oui=02:`openssl rand -hex 1`:`openssl rand -hex 1`
[root@base-k8s-master-1 kubevirt]# echo $mac_oui
02:0a:b6
[root@base-k8s-master-1 kubemacpool]# sed -i "s/02:00:00:00:00:00/$mac_oui:00:00:00/" kubemacpool.yaml
[root@base-k8s-master-1 kubemacpool]# sed -i "s/02:FF:FF:FF:FF:FF/$mac_oui:FF:FF:FF/" kubemacpool.yaml
[root@base-k8s-master-1 kubemacpool]# kubectl apply -f ./kubemacpool.yaml
namespace/kubemacpool-system created
serviceaccount/kubemacpool-sa created
clusterrole.rbac.authorization.k8s.io/kubemacpool-manager-role created
clusterrolebinding.rbac.authorization.k8s.io/kubemacpool-manager-rolebinding created
configmap/kubemacpool-mac-range-config created
service/kubemacpool-service created
deployment.apps/kubemacpool-cert-manager created
deployment.apps/kubemacpool-mac-controller-manager created
mutatingwebhookconfiguration.admissionregistration.k8s.io/kubemacpool-mutator created
创建克隆并测试
修改克隆 YAML 清单的 MAC 地址:
newMacAddresses:
enp1s0: "02:0A:B6:35:1A:8C"
enp2s0: "02:0A:B6:27:B9:AC"
克隆的虚拟机 MAC 地址没生效,有时间找找原因。
创建克隆:
[root@base-k8s-master-1 kubevirt]# kubectl apply -f vm-clone.yml
virtualmachineclone.clone.kubevirt.io/testclone-my-vm created
[root@base-k8s-master-1 kubevirt]# kubectl get vm
NAME AGE STATUS READY
my-vm 19d Running True
...output omitted...
vm-clone-my-vm 7s Stopped False
[root@base-k8s-master-1 kubevirt]# virtctl start vm-clone-my-vm
VM vm-clone-my-vm was scheduled to start
[root@base-k8s-master-1 kubevirt]# virtctl ssh fedora@vm-clone-my-vm
Last login: Sun Mar 23 12:14:38 2025 from 10.100.239.49
[fedora@vm-dv ~]$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 02:0a:b6:00:00:05 brd ff:ff:ff:ff:ff:ff
3: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 02:0a:b6:00:00:06 brd ff:ff:ff:ff:ff:ff
[fedora@vm-dv ~]$ ls /dev/disk/by-id
ata-QEMU_HARDDISK_QM00001 ata-QEMU_HARDDISK_QM00001-part2 ata-QEMU_HARDDISK_QM00001-part4
ata-QEMU_HARDDISK_QM00001-part1 ata-QEMU_HARDDISK_QM00001-part3 scsi-0QEMU_QEMU_HARDDISK_1234567890
检查克隆虚拟机的配置:
[root@base-k8s-master-1 kubevirt]# kubectl get vmi vm-clone-my-vm -o yaml
...output omitted...
- disk:
bus: scsi
name: dv-blank
serial: "1234567890"
interfaces:
- macAddress: 02:0a:b6:00:00:05
masquerade: {}
name: default
- bridge: {}
macAddress: 02:0a:b6:00:00:06
name: net1
...output omitted...