Kubevirt Запуск виртуальных машин в кластере Kubernetes
Kubevirt Запуск виртуальных машин в кластере Kubernetes
Kubevirt позволяет разработчикам легко контейнеризировать приложения и использовать Kubernetes для запуска виртуальных машин. Узнайте больше о Kubevirt и о том, как он используется
Kubevirt виртуальные машины kubernetes
Кажется, что мы прошли полный круг, поскольку Kubernetes повзрослел и значительно расширился за последние несколько лет, чтобы делать некоторые действительно удивительные вещи. Одна из удивительных вещей, которые вы можете делать сейчас с Kubernetes, — это запускать виртуальные машины. Kubevirt делает это возможным. В этой статье давайте рассмотрим Kubevirt и эту функциональность.
Оглавление
Что такое Кубевирт?
Давайте поговорим о Kubevirt и о том, что это такое. Kubevirt — это решение с открытым исходным кодом, которое позволяет кластерам Kubernetes запускать и управлять виртуальными машинами, включая Linux и Windows, а также собственными рабочими нагрузками контейнеров Kubernetes (pods) и позволяет разработчикам быстро контейнеризировать приложения. Предприятия ищут способы стандартизации своей инфраструктуры и использования согласованного инструментария. Использование Kubernetes для контейнеров и виртуальных машин помогает в этом.
Kubevirt позволяет запускать виртуальные машины в кластере Kubernetes
Kubevirt предоставляет API виртуализации, позволяя API Kubernetes управлять как контейнерами, так и несколькими виртуальными машинами , предоставляя единую унифицированную платформу разработки для обоих. Kubevirt является частью облачного вычислительного фонда и имеет много участников из сообщества.
Почему разработчикам может быть интересно использовать Kubevirt?
Для команд разработчиков, переходящих на инфраструктуру Kubernetes и облачные вычисления , особенно тех, у кого есть существующие рабочие нагрузки на основе виртуальных машин (ВМ) с гостевыми установками операционной системы, которые нелегко контейнеризировать. KubeVirt заполняет пробел между традиционными конфигурациями ВМ и современными контейнеризированными средами для рабочих процессов разработки и производства. С Kubevirt вам больше не нужна отдельная среда гипервизора для запуска рабочих нагрузок виртуальных машин . Он также позволяет взаимодействовать с вашими ресурсами Kubernetes с помощью стандартных инструментов, таких как kubectl.
Технология Kubevirt обеспечивает более плавный и быстрый переход для команд с рабочими процессами на основе виртуальных машин для быстрой контейнеризации виртуализированных рабочих нагрузок. Она позволяет командам использовать существующие виртуальные машины VM для приложений, пока они работают над стратегией развертывания приложений, находящихся в архитектурах на основе контейнеров.
Архитектура Кубеврита
Пользователи, взаимодействующие со службами виртуализации, общаются через API виртуализации для организации желаемых экземпляров виртуальных машин (VMI). С Kubevirt Kubernetes отвечает за управление планированием, сетевым взаимодействием и хранением данных для ваших виртуальных машин.
Слои стека kubevirt
Ниже представлена упрощенная схема, показывающая основы того, как дополнительные контроллеры и демоны взаимодействуют с Kubernetes и где хранятся дополнительные типы. Архитектура Kubevirt интегрируется с существующими кластерами Kubernetes, используя оставшиеся виртуализированные компоненты. Эта интеграция становится возможной благодаря Kubevirt Operator и Custom Resource Definitions (CRD), которые расширяют возможности Kubernetes.
Упрощенная схема архитектуры 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-адреса управления.
Кластерный агрегат готов к работе
Вход в комбайн
Ниже я создал новую виртуальную машину Ubuntu 22.04 и загрузил VM для установки с помощью Kubevirt в Harvester. Очень круто! Опыт управления в 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 s h – открыть SSH-соединение с экземпляром виртуальной машины
- запуск – запуск виртуальной машины
- остановить – остановить виртуальную машину
- unpause – снять с паузы виртуальную машину
- usbredir – перенаправить USB-устройство на экземпляр виртуальной машины
- userlist – возвращает полный список вошедших в систему пользователей на гостевой машине
- версия – распечатать информацию о версии клиента и сервера
- vnc – открыть vnc-соединение с экземпляром виртуальной машины

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