0 Голосов

Kubevirt Запуск виртуальных машин в кластере Kubernetes

Редактировал(а) Сергей Коршунов 2024/10/09 20:39

Kubevirt Запуск виртуальных машин в кластере Kubernetes

Kubevirt позволяет разработчикам легко контейнеризировать приложения и использовать Kubernetes для запуска виртуальных машин. Узнайте больше о Kubevirt и о том, как он используетсяKubevirt виртуальные машины kubernetes

Kubevirt виртуальные машины kubernetes

Кажется, что мы прошли полный круг, поскольку Kubernetes повзрослел и значительно расширился за последние несколько лет, чтобы делать некоторые действительно удивительные вещи. Одна из удивительных вещей, которые вы можете делать сейчас с Kubernetes, — это запускать виртуальные машины. Kubevirt делает это возможным. В этой статье давайте рассмотрим Kubevirt и эту функциональность.

Оглавление

Что такое Кубевирт?

Давайте поговорим о Kubevirt и о том, что это такое. Kubevirt — это решение с открытым исходным кодом, которое позволяет кластерам Kubernetes запускать и управлять виртуальными машинами, включая Linux и Windows, а также собственными рабочими нагрузками контейнеров Kubernetes (pods) и позволяет разработчикам быстро контейнеризировать приложения. Предприятия ищут способы стандартизации своей инфраструктуры и использования согласованного инструментария. Использование Kubernetes для контейнеров и виртуальных машин помогает в этом.Kubevirt позволяет запускать виртуальные машины в кластере Kubernetes

Kubevirt позволяет запускать виртуальные машины в кластере Kubernetes

Kubevirt предоставляет API виртуализации, позволяя API Kubernetes управлять как контейнерами, так и несколькими виртуальными машинами , предоставляя единую унифицированную платформу разработки для обоих. Kubevirt является частью облачного вычислительного фонда и имеет много участников из сообщества.

Почему разработчикам может быть интересно использовать Kubevirt?

Для команд разработчиков, переходящих на инфраструктуру Kubernetes и облачные вычисления , особенно тех, у кого есть существующие рабочие нагрузки на основе виртуальных машин (ВМ) с гостевыми установками операционной системы, которые нелегко контейнеризировать. KubeVirt заполняет пробел между традиционными конфигурациями ВМ и современными контейнеризированными средами для рабочих процессов разработки и производства. С Kubevirt вам больше не нужна отдельная среда гипервизора для запуска рабочих нагрузок виртуальных машин . Он также позволяет взаимодействовать с вашими ресурсами Kubernetes с помощью стандартных инструментов, таких как  kubectl.

Технология Kubevirt обеспечивает более плавный и быстрый переход для команд с рабочими процессами на основе виртуальных машин для быстрой контейнеризации виртуализированных рабочих нагрузок. Она позволяет командам использовать существующие виртуальные машины VM для приложений, пока они работают над стратегией развертывания приложений, находящихся в архитектурах на основе контейнеров.

Архитектура Кубеврита

Пользователи, взаимодействующие со службами виртуализации, общаются через API виртуализации для организации желаемых экземпляров виртуальных машин (VMI). С Kubevirt Kubernetes отвечает за управление планированием, сетевым взаимодействием и хранением данных для ваших виртуальных машин.Слои стека kubevirt

Слои стека kubevirt

Ниже представлена ​​упрощенная схема, показывающая основы того, как дополнительные контроллеры и демоны взаимодействуют с Kubernetes и где хранятся дополнительные типы. Архитектура Kubevirt интегрируется с существующими кластерами Kubernetes, используя оставшиеся виртуализированные компоненты. Эта интеграция становится возможной благодаря Kubevirt Operator и Custom Resource Definitions (CRD), которые расширяют возможности Kubernetes.Упрощенная схема архитектуры kubevirt

Упрощенная схема архитектуры kubevirt

Как можно использовать Кубевирт?

Существует несколько дистрибутивов Kubernetes, которые вы можете использовать для тестирования Kubevirt и предоставления отзывов о решениях. Обратите внимание на следующие руководства по быстрому старту, предоставленные Kubevirt.io:

Rancher Harvester: легкий Кубевирт

Кроме того, если вам нужно выделенное решение для простого тестирования Kubevirt, Rancher Harvester — это решение с открытым исходным кодом, содержащее все пакеты, необходимые для запуска программного обеспечения Kubevirt, которое позволяет вам устанавливать Harvester на физических серверах или вложенных виртуальных машинах. Оно обеспечивает управление виртуальными машинами, а также запуск собственных модулей Kubernetes и извлечение образов контейнеров из реестра контейнеров.

Используя Kubevirt с Harvester, вы можете запускать свои виртуальные машины с конструкциями масштабируемости, безопасности, rbac и производительности для вашей рабочей среды, так же, как вы можете это делать с вашими контейнерными pod. Вы можете ознакомиться с проектом Harvester и документацией здесь:  Harvester – гиперконвергентная инфраструктура с открытым исходным кодом (harvesterhci.io) . Вы также можете ознакомиться с официальными репозиториями и релизами здесь:  GitHub – harvester/harvester: программное обеспечение гиперконвергентной инфраструктуры с открытым исходным кодом (HCI) .

Ниже я загрузил ISO-образ Harvester и создал новый кластер Harvester на ваших узлах.Создать новый кластер харвестера

Создать новый кластер харвестера

После установки Rancher Harvester и ожидания готовности кластера Harvester и IP-адреса управления.Кластерный агрегат готов к работе

Кластерный агрегат готов к работе

Вход в Harvester.Вход в комбайн

Вход в комбайн

Ниже я создал новую виртуальную машину Ubuntu 22.04 и загрузил VM для установки с помощью Kubevirt в Harvester. Очень круто! Опыт управления в Harvester отличный.Установка виртуальной машины с помощью kubevirt и harvester

Установка виртуальной машины с помощью kubevirt и harvester

Конфигурация файла YAML для виртуальной машины Kubevirt

Одной из действительно крутых вещей в использовании Kubevirt для создания виртуальных машин является возможность описывать их в файле YAML. Создавая виртуальную машину Ubuntu 22.04 LTS в Harvester, я использовал следующий код YAML для манифеста виртуальной машины в качестве примера в приведенной выше демонстрации:

apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  annotations:
    harvesterhci.io/vmRunStrategy: RerunOnFailure
    harvesterhci.io/volumeClaimTemplates: >-
      [{"metadata":{"name":"ubuntu-01-disk-0-fhsec","annotations":{"harvesterhci.io/imageId":"default/image-675pg"}},"spec":{"accessModes":["ReadWriteMany"],"resources":{"requests":{"storage":"20Gi"}},"volumeMode":"Block","storageClassName":"longhorn-image-675pg"}}]
    kubevirt.io/latest-observed-api-version: v1
    kubevirt.io/storage-observed-api-version: v1alpha3
    network.harvesterhci.io/ips: '[]'
  creationTimestamp: '2024-01-21T14:45:14Z'
  finalizers:
    - harvesterhci.io/VMController.UnsetOwnerOfPVCs
  generation: 2
  labels:
    harvesterhci.io/creator: harvester
    harvesterhci.io/os: ubuntu
  managedFields:
    - apiVersion: kubevirt.io/v1alpha3
      fieldsType: FieldsV1
      fieldsV1:
        f:metadata:
          f:annotations:
            f:kubevirt.io/latest-observed-api-version: {}
            f:kubevirt.io/storage-observed-api-version: {}
      manager: Go-http-client
      operation: Update
      time: '2024-01-21T14:45:15Z'
    - apiVersion: kubevirt.io/v1
      fieldsType: FieldsV1
      fieldsV1:
        f:metadata:
          f:annotations:
            .: {}
            f:harvesterhci.io/vmRunStrategy: {}
            f:harvesterhci.io/volumeClaimTemplates: {}
            f:network.harvesterhci.io/ips: {}
          f:finalizers:
            .: {}
            v:"harvesterhci.io/VMController.UnsetOwnerOfPVCs": {}
          f:labels:
            .: {}
            f:harvesterhci.io/creator: {}
            f:harvesterhci.io/os: {}
        f:spec:
          .: {}
          f:runStrategy: {}
          f:template:
            .: {}
            f:metadata:
              .: {}
              f:annotations:
                .: {}
                f:harvesterhci.io/sshNames: {}
              f:labels:
                .: {}
                f:harvesterhci.io/vmName: {}
            f:spec:
              .: {}
              f:accessCredentials: {}
              f:affinity: {}
              f:domain:
                .: {}
                f:cpu:
                  .: {}
                  f:cores: {}
                  f:sockets: {}
                  f:threads: {}
                f:devices:
                  .: {}
                  f:disks: {}
                  f:inputs: {}
                  f:interfaces: {}
                f:features:
                  .: {}
                  f:acpi:
                    .: {}
                    f:enabled: {}
                f:machine:
                  .: {}
                  f:type: {}
                f:resources:
                  .: {}
                  f:limits:
                    .: {}
                    f:cpu: {}
                    f:memory: {}
              f:evictionStrategy: {}
              f:hostname: {}
              f:networks: {}
              f:terminationGracePeriodSeconds: {}
              f:volumes: {}
      manager: harvester
      operation: Update
      time: '2024-01-21T14:45:36Z'
    - apiVersion: kubevirt.io/v1alpha3
      fieldsType: FieldsV1
      fieldsV1:
        f:status:
          .: {}
          f:conditions: {}
          f:created: {}
          f:printableStatus: {}
          f:ready: {}
          f:volumeSnapshotStatuses: {}
      manager: Go-http-client
      operation: Update
      subresource: status
      time: '2024-01-21T15:03:12Z'
  name: ubuntu-01
  namespace: default
  resourceVersion: '538511'
  uid: 3e3f0426-a70b-427b-8aba-113b3fa2a5e7
spec:
  runStrategy: RerunOnFailure
  template:
    metadata:
      annotations:
        harvesterhci.io/sshNames: '[]'
      creationTimestamp: null
      labels:
        harvesterhci.io/vmName: ubuntu-01
    spec:
      affinity: {}
      domain:
        cpu:
          cores: 2
          sockets: 1
          threads: 1
        devices:
          disks:
            - bootOrder: 1
              cdrom:
                bus: sata
              name: disk-0
            - disk:
                bus: virtio
              name: cloudinitdisk
          inputs:
            - bus: usb
              name: tablet
              type: tablet
          interfaces:
            - macAddress: 52:54:00:de:68:02
              masquerade: {}
              model: virtio
              name: default
        features:
          acpi:
            enabled: true
        machine:
          type: q35
        memory:
          guest: 1948Mi
        resources:
          limits:
            cpu: '2'
            memory: 2Gi
          requests:
            cpu: 125m
            memory: 1365Mi
      evictionStrategy: LiveMigrate
      hostname: ubuntu-01
      networks:
        - name: default
          pod: {}
      terminationGracePeriodSeconds: 120
      volumes:
        - name: disk-0
          persistentVolumeClaim:
            claimName: ubuntu-01-disk-0-fhsec
        - cloudInitNoCloud:
            networkDataSecretRef:
              name: ubuntu-01-ixwie
            secretRef:
              name: ubuntu-01-ixwie
          name: cloudinitdisk
status:
  conditions:
    - lastProbeTime: null
      lastTransitionTime: '2024-01-21T15:03:09Z'
      status: 'True'
      type: Ready
    - lastProbeTime: null
      lastTransitionTime: null
      status: 'True'
      type: LiveMigratable
  created: true
  printableStatus: Running
  ready: true
  volumeSnapshotStatuses:
    - enabled: false
      name: disk-0
      reason: 2 matching VolumeSnapshotClasses for longhorn-image-675pg
    - enabled: false
      name: cloudinitdisk
      reason: Snapshot is not supported for this volumeSource type [cloudinitdisk]

Использование интерфейса командной строки virtctl

Вы также можете взаимодействовать с вашими виртуальными машинами Kubevirt с помощью инструмента командной строки virtctl. Вам может потребоваться установить virtctl. Однако при работе с Harvester он устанавливается по умолчанию.

Обратите внимание на следующие команды:

  • addvolume  – добавить том к работающей виртуальной машине
  • автодополнение – сгенерировать скрипт автодополнения для указанной оболочки
  • консоль  – подключиться к консоли экземпляра виртуальной машины
  • expose  – предоставить экземпляр виртуальной машины, виртуальную машину или набор реплик экземпляра виртуальной машины в качестве новой службы
  • fslist  – возвращает полный список файловых систем, доступных на гостевой машине
  • guestfs  – запустить оболочку в модуле libguestfs 
  • guestosinfo  – возвращает информацию гостевого агента об операционной системе
  • помощь  – помощь по любой команде
  • image -upload – загрузить образ виртуальной машины в DataVolume/PersistentVolumeClaim
  • память – дамп  – дамп памяти работающей виртуальной машины в указанный pvc
  • migrate  – перенести виртуальную машину
  • миграция – отмена  – отмена миграции виртуальной машины
  • пауза  – приостановка виртуальной машины
  • разрешено – устройства  – список разрешенных устройств для vmis
  • порт – переслать  – переслать локальные порты на виртуальную машину или экземпляр виртуальной машины
  • removevolume  – удалить том из работающей виртуальной машины
  • перезапуск  – перезапуск виртуальной машины
  • scp  – файлы scp из/в экземпляр виртуальной машины
  • soft – reboot  – мягкая перезагрузка экземпляра виртуальной машины
  • s h – открыть SSH-соединение с экземпляром виртуальной машины
  • запуск  – запуск виртуальной машины
  • остановить  – остановить виртуальную машину
  • unpause  – снять с паузы виртуальную машину
  • usbredir  – перенаправить USB-устройство на экземпляр виртуальной машины
  • userlist  – возвращает полный список вошедших в систему пользователей на гостевой машине
  • версия  – распечатать информацию о версии клиента и сервера
  • vnc  – открыть vnc-соединение с экземпляром виртуальной машиныИнструмент командной строки virtctl для работы с kubevirt

Инструмент командной строки virtctl для работы с kubevirt

Подводя итоги, можно сказать, что Kubevirt — отличный инструмент в экосистеме Kubernetes.

В этом вводном блоге о Kubevirt мы увидели, что это интересный и мощный инструмент при запуске сред Kubernetes. Он позволяет компании использовать мощь современных приложений в подах Kubernetes и виртуальных машинах поверх кластерного узла Kubernetes для всех своих потребностей в виртуализации. Это делает Kubernetes не только средой для контейнеров, но и для виртуальных машин. 

Поскольку он использует API Kubernetes, разработчики и инженеры DevOps могут использовать мощные API Kubernetes для автоматизации многих аспектов среды, включая политики, и применять эти же конечные точки API для автоматизации операций своих виртуальных машин. Поскольку запуск Kubernetes становится все более интересным и используется организациями по всему миру, мне интересно, сколько из них заинтересованы в переходе от традиционных гипервизоров к использованию Kubernetes для всего. Если вы уже перенесли виртуальные машины в Kubernetes, какие результаты вы увидели и с какими проблемами столкнулись? Используете ли вы это или заинтересованы в использовании этого в ядре или на периферии? Есть ли какая-то функция, которой вам не хватает между Kubevirt и традиционными продуктами гипервизоров? Дайте мне знать в комментариях или на форумах.