KubeVirt#

KubeVirt — это инструмент, который обеспечивает возможность создания, развертывания и управления виртуальными машинами как контейнерами. Цель — обеспечить общую основу для решений виртуализации на базе DropApp.

KubeVirt функционально расширяет DropApp, добавляя дополнительные типы ресурсов виртуализации (тип VM) через API CRD kubernetes. Используя этот механизм, API kubernetes можно использовать для виртуальных машин наряду со всеми другими ресурсами, предоставляемыми DropApp.

Для запуска виртуальных машин необходимо добавить в кластер DropApp дополнительную функциональность и бизнес-логику. Эта функциональность добавляется не в kubernetes, а в кластер DropApp путем запуска дополнительных контроллеров и агентов в существующем кластере.

Необходимые контроллеры и агенты предоставляются KubeVirt.

KubeVirt используется в качестве декларативного инструмента для следующих целей:

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

  • планировки виртуальной машины в кластере DropApp;

  • запуск виртуальной машины;

  • остановка виртуальной машины;

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

В поставке DropApp содержатся следующие образы KubeVirt:

  • virtctl - предоставляет быстрый доступ к последовательным и графическим портам виртуальной машины, а также необходим для обработки операций запуска/остановки;

  • virt-launcher - предоставляет контрольные группы и namespace, которые будут использоваться для размещения виртуальных машин;

  • virt-operator - отвечает за функциональность виртуализации в масштабе кластера;

  • virt-controller - отслеживает обращение новых виртуальных машин на сервер API Kubernetes, создает pod, в котором будет работать виртуальная машина. Когда pod запланирован на определенном node, virt-controller обновляет объект VM с именем node и передает дальнейшие обязанности компоненту KubeVirt, специфичному для node;

  • virt-handler - отслеживает изменения объекта виртуальной машины и выполняет все необходимые операции для изменения виртуальной машины для соответствия требуемому состоянию. Virt-handler ссылается на спецификацию виртуальной машины и сигнализирует о создании соответствующего домена, используя экземпляр libvirtd в модуле виртуальной машины. Когда объект виртуальной машины удаляется, virt-handler наблюдает за удалением и отключает домен;

  • virt-api - обслуживает все запросы к API для ресурсов виртуализации.

Сценарий развертывания KubeVirt#

KubeVirt можно установить с помощью оператора, который управляет жизненным циклом всех основных компонентов.

Развертывание операторов:

  1. Для развертывания оператора KubeVirt введите команду:

    export VERSION=$(curl -s https://<repoexample.ru>/kubevirt-prow/release/kubevirt/kubevirt/stable.txt)
    
    echo $VERSION
    kubectl create -f https://<repoexample.ru>/download/${VERSION}/kubevirt-operator.yaml
    # Укажите актуальный путь до локального репозитория
    
  2. Для развертывания CRD KubeVirt введите команду:

    kubectl create -f https://<repoexample.ru>/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-cr.yaml
    # Укажите актуальный путь до локального репозитория
    
  3. Проверьте статус развертывания:

    kubectl get kubevirt.kubevirt.io/kubevirt -n kubevirt -o=jsonpath="{.status.phase}"
    

    Убедитесь, что KubeVirt развернул 7 модулей, 3 службы, 1 набор демонов, 3 приложения для развертывания, 3 набора реплик.

  4. Проверьте компоненты развертывания:

    kubectl get all -n kubevirt
    
  5. Установите Virtctl:

    curl -L -o virtctl https://<repoexample.ru>/kubevirt/kubevirt/releases/download/${VERSION}/virtctl-${VERSION}-${ARCH}  # Укажите актуальный путь до локального репозитория
    chmod +x virtctl
    sudo install virtctl /usr/local/bin
    

    После развертывания KubeVirt можно использовать для создания и развертывания виртуальных машин с помощью DropApp.

Сценарий создания виртуальной машины с использованием KubeVirt#

Для выполнения сценария создания виртуальной машины с использованием KubeVirt:

  1. Создайте манифест виртуальной машины:

    kubevirt.yaml
    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: testvm
    spec:
      running: false
      template:
        metadata:
          labels:
            kubevirt.io/size: small
            kubevirt.io/domain: testvm
        spec:
          domain:
            devices:
              disks:
                - name: containerdisk
                  disk:
                    bus: virtio
                - name: cloudinitdisk
                  disk:
                    bus: virtio
              interfaces:
              - name: default
                masquerade: {}
            resources:
              requests:
                memory: 64M
          networks:
          - name: default
            pod: {}
          volumes:
            - name: containerdisk
              containerDisk:
                image: quay.io/kubevirt/cirros-container-disk-demo
            - name: cloudinitdisk
              cloudInitNoCloud:
                userDataBase64: SGkuXG4=
    

    Обратите внимание, что в данном случае используется диск-контейнер, который не сохраняет данные. Для сохранения данных воспользуйтесь сторонним хранилищем, например LinStore (не входит в состав текущей версии DropApp).

  2. Примените манифест в DropApp:

    kubectl apply -f https://kubevirt.io/labs/manifests/vm.yaml
    virtualmachine.kubevirt.io "testvm" created
    virtualmachineinstancepreset.kubevirt.io "small" created
    
  3. Получите список существующих виртуальных машин:

    kubectl get vms
    kubectl get vms -o yaml testvm
    

    Статус running в выводе команды означает, что виртуальная машина работает.

  4. Для запуска виртуальной машины используйте команду:

    virtctl start testvm
    
  5. Подключитесь к последовательной консоли виртуальной машины Cirros. Нажмите return/enter несколько раз и войдите в систему, используя отображаемые имя пользователя и пароль:

    virtctl console testvm
    
  6. Отключитесь от консоли виртуальной машины командой ctrl+].

  7. Выключите виртуальную машину:

    virtctl stop testvm
    
  8. Удалите виртуальную машину:

    kubectl delete vm testvm