Virtual Machine Clone

Virtual machine cloning refers to creating a replica of a virtual machine at a specific point in time. The cloned virtual machine contains all the configurations, operating systems, applications, and data of the original virtual machine.

Prerequisites

  • To use the virtual machine cloning functionality, its disk must utilize a storage class that supports snapshot features. Virtual machine snapshots save the current state of the virtual machine, which can be used to restore the virtual machine to that point in time in the event of an unexpected failure.

  • The jq package must be installed on the node where the script is to be executed. jq is a lightweight command-line JSON processing tool used for parsing and processing JSON data.

Steps to Operate

Note: All operations below must be performed on the master node of the cluster where the virtual machine resides.

  1. Open the CLI tool.

  2. Execute the following command to create and open the vm-clone.sh file.

    vi vm-clone.sh
  3. Press i and copy the following content into the vm-clone.sh file.

    #!/bin/bash vm_clone() { NAMESPACE=$1 VM_NAME=$2 VM_CLONE_NAME=$3 cat <<EOF | kubectl create -f - kind: VirtualMachineClone apiVersion: clone.kubevirt.io/v1alpha1 metadata: name: clone-$VM_NAME namespace: $NAMESPACE spec: source: apiGroup: kubevirt.io kind: VirtualMachine name: $VM_NAME target: apiGroup: kubevirt.io kind: VirtualMachine name: $VM_CLONE_NAME labelFilters: - "*" - "!ovn.kubernetes.io/*" annotationFilters: - "*" - "!ovn.kubernetes.io/*" template: labelFilters: - "*" - "!ovn.kubernetes.io/*" annotationFilters: - "*" - "!ovn.kubernetes.io/*" EOF if [ $? -eq 0 ]; then echo "Create vmclone resource Succeeded" else echo "Create vmclone resource failed" exit 1 fi echo "Waiting for vm clone completion" while true; do phase=$(kubectl -n $NAMESPACE get vmclone clone-$VM_NAME -o jsonpath='{.status.phase}') if [ "$phase" == "Succeeded" ]; then break elif [ "$phase" == "Failed" ]; then echo "VirtualMachineClone resource phase is Failed" exit 1 fi sleep 5 done echo "vm clone completion" dvList=$(kubectl -n $NAMESPACE get vm $VM_CLONE_NAME -o jsonpath='{.spec.template.spec.volumes}' | jq . | grep restore- | grep name | awk '{print $2}') for dv in $dvList; do kubectl -n $NAMESPACE label --overwrite dv $(echo $dv | sed 's/"//g') vm.cpaas.io/used-by=$VM_CLONE_NAME if [ $? -ne 0 ]; then echo "update DV label failed" exit 1 fi done pvcList=$(kubectl -n $NAMESPACE get vm $VM_CLONE_NAME -o jsonpath='{.spec.template.spec.volumes}' | jq . | grep restore- | grep claimName | awk '{print $2}') for pvc in $pvcList; do kubectl -n $NAMESPACE label --overwrite pvc $(echo $pvc | sed 's/"//g') vm.cpaas.io/used-by=$VM_CLONE_NAME if [ $? -ne 0 ]; then echo "update PVC label failed" exit 1 fi done } if [ $# -ne 3 ]; then echo "error: parameters error" echo "Usage: ./vm-clone.sh NAMESPACE VM_NAME VM_CLONE_NAME" exit 1 fi # exec vm clone vm_clone "$1" "$2" "$3"
  4. Press shift+:wq to save the file.

  5. Execute the following command to add execution permissions to the vm-clone.sh file.

    chmod +x vm-clone.sh
  6. Execute the following command to run the script file.{#clone}

    ./vm-clone.sh <NAMESPACE> <VM_NAME> <VM_CLONE_NAME>

    Parameter Description:

    • NAMESPACE: Specify the namespace of the virtual machine to be cloned, replacing the <NAMESPACE> part with this namespace.
    • VM_NAME: Specify the name of the virtual machine to be cloned, replacing the <VM_NAME> part with this name.
    • VM_CLONE_NAME: Specify the name of the cloned virtual machine, replacing the <VM_CLONE_NAME> part with this name.
  7. When a message similar to the following appears, it indicates that the cloning is complete.

    virtualmachineclone.clone.kubevirt.io/clone-k1 created Create vmclone resource Succeeded Waiting for vm clone completion vm clone completion datavolume.cdi.kubevirt.io/restore-e8ff0e7b-dc7e-4140-aec7-8556cfcf4533-rootfs labeled datavolume.cdi.kubevirt.io/restore-e8ff0e7b-dc7e-4140-aec7-8556cfcf4533-1 labeled

View and Start the Cloned Virtual Machine

  1. Go to Platform Management.

  2. In the left navigation bar, click Virtualization Management > Virtual Machine Images.

  3. You will see the cloned virtual machine with the specified name from the Run Script step; the default state of the cloned virtual machine is Stopped.

  4. Click on the name of this virtual machine, and the page will redirect to the virtual machine detail page in the Container Platform.

  5. Click Start to successfully start the virtual machine.