With the advent of microservices, people commonly ask, «Is it possible to run my legacy virtual machines in Kernel-based Virtual Machine (KVM) or VMware with my microservices on Kubernetes, or do I need to migrate them to containers?» One possible answer to that question is KubeVirt.
The KubeVirt project turns Kubernetes into an orchestration engine for application containers and VM workloads. It addresses the needs of development teams that have adopted or want to adopt Kubernetes but have existing VM-based workloads that they can’t easily put in containers. The technology provides a unified development platform in which developers can build, modify, and deploy applications that reside in both application containers and VMs in a common, shared environment.
Note: KubeVirt can be tested on external cloud providers like Oracle Cloud Infrastructure, but this setup is not meant for production yet!
Getting Started
Oracle Cloud Infrastructure Container Engine for Kubernetes (sometimes referred to as OKE) provides a reliable and scalable integrated workflow platform to build, test, deploy, and monitor your code in the cloud. Container Engine for Kubernetes helps you deploy, manage, and scale Kubernetes clusters in the cloud. With it, you can build dynamic containerized applications by incorporating Kubernetes with services running on Oracle Cloud Infrastructure.
KubeVirt can be deployed on Container Engine for Kubernetes worker nodes with bare metal or VM shapes. If your cluster worker nodes are provisioned with VM shapes, KubeVirt runs your legacy KVM or VMware VMs in nested mode.
Requirements
The Oracle Cloud Infrastructure command line interface (CLI) and the Container Engine for Kubernetes kubectl CLI must be installed and configured. For more information, see the Container Engine for Kubernetes documentation. You can also use Cloud Shell, a browser-based terminal accessible from the Oracle Cloud Infrastructure Console. The CLIs are preinstalled and configured in Cloud Shell.
Deployment
Follow these steps to deploy KubeVirt with Container Engine for Kubernetes.
Step 1: Deploy the KubeVirt Operator
-
Run the Container Engine for Kubernetes cluster and NodePool nodes.
-
Set the version environment variable to be used on commands:
Shell
xxxxxxxxxx
1
1export KUBEVIRT_VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases | grep tag_name | grep -v -- - | sort -V | tail -1 | awk -F':' '{print $2}' | sed 's/,//' | xargs)
234echo $KUBEVIRT_VERSION
-
Using the kubectl tool, deploy the KubeVirt operator:
Shell
xxxxxxxxxx
1
1kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-operator.yaml
-
Ensure that the KubeVirt operator is running:
Shell
xxxxxxxxxx
1
1[root@kvmvbox ~]# kubectl get pods -n kubevirt
2virt-operator-6b5455546b-56dvx 1/1 Running 0 39h
3virt-operator-6b5455546b-5pwdj 1/1 Running 0 39h
-
Check for the virtualization extensions. When you use Oracle Cloud Infrastructure VM shapes with Oracle Linux images, the shapes should have nested virtualization enabled by default, and the cpuinfo file should have the VMX flag. Check it with the egrep command.
Shell
xxxxxxxxxx
1
1egrep 'svm|vmx' /proc/cpuinfo
Step 2: Deploy KubeVirt
-
Deploy KubeVirt by creating a dedicated custom resource:
Shell
xxxxxxxxxx
1
1kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-cr.yaml
-
Проверьте развертывание:
Шаг 3: Установите virtctl
Другой двоичный файл обеспечивает быстрый доступ к последовательным и графическим портам виртуальной машины и обрабатывает операции запуска и остановки. Инструмент называется virtctl , и вы можете получить его со страницы релиза KubeVirt:
Оболочка
1
curl -L -o virtctl \
2
https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/virtctl-${KUBEVIRT_VERSION}-linux-amd64
3
chmod +x virtctl
Шаг 4: Тестирование KubeVirt
Теперь пришло время протестировать KubeVirt с Container Engine для Kubernetes, запустив устаревшие виртуальные машины KVM или VMware вместе с контейнерами. KubeVirt предоставляет некоторые лаборатории, которые позволяют вам протестировать его, прежде чем пытаться использовать устаревшие виртуальные машины KVM или VMware.
Первая лаборатория Use KubeVirt проведет вас через процесс создания экземпляра виртуальной машины в Kubernetes, а затем покажет, как использовать virtctl для взаимодействия с его консолью.
Во второй лабораторной работе « Эксперимент с импортером контейнерных данных» (CDI) показано, как использовать CDI для импорта образа виртуальной машины в заявку на постоянный том (PVC), а затем определить виртуальную машину для использования PVC.
Запуск виртуальных машин KVM и VMware в контейнере
Если вы планируете запускать виртуальную машину KVM или VMware в Container Engine для Kubernetes, сначала необходимо преобразовать диски в необработанный формат. В этом вам могут помочь две бесплатные утилиты: Oracle VirtualBox VBoxManage и утилита для создания образа диска QEMU.
-
VBoxManage - это CLI для Oracle VM VirtualBox. Вы можете использовать его для управления Oracle VM VirtualBox из командной строки вашей операционной системы. VBoxManage предоставляет все возможности механизма виртуализации и позволяет конвертировать диски в различные форматы.
Используйте следующую команду в CLI для преобразования дисков виртуальной машины в необработанный формат:
Оболочка
xxxxxxxxxx
1
1
VBoxManage clonehd --format RAW kvm_qcow2_OR_VMware_vmdk_disk disk-name.img
-
Утилита образа диска QEMU, известная как qemu-img, также позволяет конвертировать диски в другие форматы. Например, чтобы установить его на компьютере под управлением Oracle Linux, выполните следующую команду:
Оболочка
xxxxxxxxxx
1
1
sudo yum install qemu-img
Затем выполните эту команду, чтобы преобразовать диски VM в необработанный формат:
Оболочка
xxxxxxxxxx
1
1
qemu-img convert kvm_qcow2_OR_VMware_vmdk_disk -O raw disk-name.img
После преобразования дисков вы можете сделать их доступными для использования в Container Engine для Kubernetes. У вас есть несколько вариантов:
-
Загрузите диск в рабочие узлы и запустите его с hostpath.
-
Создайте образ необработанного диска в Docker и загрузите его в общедоступный реестр, например, Oracle Cloud Infrastructure Registry .
-
Клонируйте диск и создайте на нем постоянную заявку на том.
Все эти параметры описаны в репозитории KubeVirt GitHub и документации KubeVirt .
демонстрация
Вот краткий пример работы KubeVirt с Container Engine для Kubernetes. В этой демонстрации мы используем образ виртуальной машины Microsoft Windows 2012 KVM, который был преобразован в необработанный формат и загружен в рабочий узел. Теперь он работает с другими собственными контейнерами Nginx в той же CIDR подсети pod. Теперь ОС Windows может получить доступ к веб-странице Nginx с помощью внутреннего IP-адреса балансировщика нагрузки. Таким образом, виртуальная машина Windows KVM ведет себя как модуль Kubernetes, что позволяет ей изначально взаимодействовать с другим механизмом контейнера для служб Kubernetes.