Клонируемые виртуальные машины
Чтобы создать клонируемую VM, вам потребуется создать VMDisk и VMInstance. В этом руководстве в качестве примера используется базовый образ ubuntu.
Создайте VMDisk
apiVersion: apps.cozystack.io/v1alpha1 kind: VMDisk metadata: name: ubuntu-source namespace: tenant-root spec: optical: false source: http: url: https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img storage: 20Gi storageClass: replicatedПоскольку расширение диска может быть сложной задачей, мы рекомендуем создавать его с запасом места для будущего роста.Создайте VMInstance
Поскольку пользовательский ресурс
VirtualMachineне предоставляет удобного способа работы с несколькими дисками, используйте вместо негоVMInstance.Создайте
VMInstance, используя следующий шаблон:apiVersion: apps.cozystack.io/v1alpha1 kind: VMInstance metadata: name: sourcevm namespace: tenant-root spec: externalMethod: PortList disks: - name: ubuntu-source externalPorts: - 22 instanceProfile: ubuntu instanceType: "" running: true sshKeys: - <paste your ssh public key here> external: true resources: cpu: "2" memory: 4GiПосле создания VM она получит внешний IP-адрес балансировщика нагрузки. Вы можете получить его с помощью:
kubectl get svc -n tenant-root vm-instance-sourcevmПодключитесь к VM по SSH
Теперь вы можете подключиться к VM по SSH, используя внешний IP-адрес. Пользователь по умолчанию для базового образа
ubuntu—ubuntu.ssh ubuntu@<external IP>Настройте виртуальную машину перед клонированием.
Удалите VMInstance
Данные на диске будут сохранены.
kubectl delete vminstance -n tenant-root sourcevmСоздайте образ диска
apiVersion: cdi.kubevirt.io/v1beta1 kind: DataVolume metadata: name: "vm-image-sourcevm" # prefix vm-image is necessary namespace: cozy-public # do not change annotations: cdi.kubevirt.io/storage.bind.immediate.requested: "true" spec: source: pvc: name: vm-disk-ubuntu-source namespace: tenant-root storage: resources: requests: storage: 20Gi storageClassName: replicatedЭто займёт некоторое время. Подождите, прежде чем продолжить. Вы можете проверить ход выполнения с помощью:
kubectl get datavolume -n cozy-public vm-image-sourcevmПример вывода, когда всё готово:
NAME PHASE PROGRESS RESTARTS AGE vm-image-sourcevm Succeeded 100.0% 7m32sСоздайте VMDisk из клонированного образа
apiVersion: apps.cozystack.io/v1alpha1 kind: VMDisk metadata: name: ubuntu-cloned-1 namespace: tenant-root spec: optical: false source: image: name: sourcevm # image name without prefix storage: 20Gi # size greater or equal to the disk image size storageClass: replicatedСоздайте VMInstance из клонированного диска
apiVersion: apps.cozystack.io/v1alpha1 kind: VMInstance metadata: name: cloned-vm namespace: tenant-root spec: external: true externalMethod: PortList cloudInit: "hostname: my-cloned-vm" cloudInitSeed: "1" disks: - name: ubuntu-cloned-1 externalPorts: - 22 instanceProfile: ubuntu running: trueЧтобы сетевые функции клонированной VM работали корректно, вы должны переопределить её
hostnameчерез.spec.cloudInitи указать уникальный.spec.cloudInitSeed, чтобы избежать конфликтов с исходной VM.