Находится в процессе активного развития. Функциональность может существенно измениться.

Получение списка доступных образов

Deckhouse поставляется уже с несколькими базовыми образами, которые вы можете использовать для создания виртуальных машин. Для того чтобы получить их список, выполните:

kubectl get cvmi

Пример вывода:

NAME           AGE
alpine-3.16    30d
centos-7       30d
centos-8       30d
debian-9       30d
debian-10      30d
fedora-36      30d
rocky-9        30d
ubuntu-16.04   30d
ubuntu-18.04   30d
ubuntu-20.04   30d
ubuntu-22.04   30d

Создание виртуальной машины

Минимальный ресурс для создания виртуальной машины выглядит так:

apiVersion: deckhouse.io/v1alpha1
kind: VirtualMachine
metadata:
  name: vm100
  namespace: default
spec:
  running: true
  resources:
    memory: 512M
    cpu: "1"
  userName: ubuntu
  sshPublicKey: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAEQClLFf8t6raygWlAQ7wJqon"
  bootDisk:
    source:
      kind: ClusterVirtualMachineImage
      name: ubuntu-22.04
    size: 10Gi
    storageClassName: linstor-thindata-r2
    autoDelete: true

В параметре bootDisk, можно указать и имя существующего диска виртуальной машины. В этом случае он будет подключен к ней напрямую без выполнения операции клонирования. Этот параметр также определяет имя создаваемого диска. Если он не указан, то по умолчанию используется шаблон <vm_name>-boot.

Пример:

bootDisk:
  name: "myos"
  size: 10Gi
  autoDelete: false

Параметр autoDelete позволяет указать, должен ли диск быть удалён после удаления виртуальной машины.

Работа с IP-адресами

Для каждой виртуальной машины назначается отдельный IP-адрес, который она использует на протяжении всей своей жизни.
Для этого используется механизм IPAM (IP Address Management), который представляет собой два ресурса: VirtualMachineIPAddressClaim и VirtualMachineIPAddressLease.

Ресурс VirtualMachineIPAddressLease является кластерным и отражает сам факт выданного для виртуальной машины адреса. Ресурс VirtualMachineIPAddressClaim является пользовательским ресурсом и используется для запроса такого адреса. Создав VirtualMachineIPAddressClaim вы можете запросить желаемый IP-адрес для виртуальной машины.

Пример:

apiVersion: deckhouse.io/v1alpha1
kind: VirtualMachineIPAddressClaim
metadata:
  name: vm100
  namespace: default
spec:
  address: 10.10.10.10
  static: true

Желаемый IP-адрес должен находиться в диапазоне сетей, определенных в параметре vmCIDRs конфигурации модуля, и не должен быть занят какой-либо другой виртуальной машиной.

В случае если VirtualMachineIPAddressClaim не был создан пользователем заранее, то он создастся автоматически при создании виртуальной машины. В этом случае будет назначен следующий свободный IP-адрес из диапазона vmCIDRs.

При удалении виртуальной машины удалится также и связанный с ней VirtualMachineIPAddressClaim. Для того чтобы этого не происходило нужно пометить такой IP-адрес как статический. Для этого нужно отредактировать созданный VirtualMachineIPAddressClaim и установить в нём поле static: true. После удаления виртуальной машины, статический IP-адрес остаётся зарезервированным в пространстве имен.

Чтобы посмотреть список всех выданных IP-адресов, выполните следующую команду:

kubectl get vmip

Пример вывода команды:

NAME    ADDRESS       STATIC   STATUS   VM      AGE
vm1     10.10.10.0    false    Bound    vm1     9d
vm100   10.10.10.10   true     Bound    vm100   172m

Для того чтобы освободить IP-адрес, просто удалите ресурс VirtualMachineIPAddressClaim:

kubectl delete vmip vm100

VirtualMachineIPAddressClaim по умолчанию называются так же как и виртуальная машина, но можно использовать произвольное имя, указав его в параметре ipAddressClaimName.

Создание дисков для хранения персистентных данных

Дополнительные диски необходимо создавать вручную.

Пример:

apiVersion: deckhouse.io/v1alpha1
kind: VirtualMachineDisk
metadata:
  name: mydata
spec:
  storageClassName: linstor-data
  size: 10Gi

Имеется возможность создать диск из существующего образа, для этого достаточно указать данные соответствующего ресурса ClusterVirtualMachineImage в параметре source.

Пример:

source:
  kind: ClusterVirtualMachineImage
  name: centos-7

Подключение дополнительных дисков выполняется с помощью параметра diskAttachments.

Пример:

apiVersion: deckhouse.io/v1alpha1
kind: VirtualMachine
metadata:
  name: vm100
  namespace: default
spec:
  running: true
  resources:
    memory: 512M
    cpu: "1"
  userName: admin
  sshPublicKey: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAEQClLFf8t6raygWlAQ7wJqon"
  bootDisk:
    source:
      kind: ClusterVirtualMachineImage
      name: ubuntu-22.04
    size: 10Gi
    storageClassName: linstor-fast
    autoDelete: true
  diskAttachments:
  - name: mydata
    bus: virtio

Использование cloud-init

При необходимости вы можете передать конфигурацию cloud-init в параметре cloud-init.

Пример:

apiVersion: deckhouse.io/v1alpha1
kind: VirtualMachine
metadata:
  name: vm1
  namespace: default
spec:
  running: true
  resources:
    memory: 512M
    cpu: "1"
  userName: admin
  sshPublicKey: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAEQClLFf8t6raygWlAQ7wJqon"
  bootDisk:
    source:
      kind: ClusterVirtualMachineImage
      name: ubuntu-22.04
    size: 10Gi
  cloudInit:
    userData: |-
      password: hackme
      chpasswd: { expire: False }

Конфигурацию cloud-init можно также хранить в Secret’е и передать виртуальной машине следующим образом:

cloudInit:
  secretRef:
    name: my-vmi-secret