Вступление
KubeVirt — это проект с открытым исходным кодом, который предлагает вам вариант виртуализации на основе виртуальной машины поверх любого кластера Kubernetes. За последние пару лет в этой области было проделано много работы, и Кубевирт достиг стадии зрелости, чтобы стать готовым к производству. В этой статье мы рассмотрим, как развернуть это в Openshift Container Platform (OCP) 4.2 и получить первую виртуальную машину Windows, работающую внутри OCP.
Предпосылки
- Запуск и запуск кластера OCP 4.2.
- KubeVirt V0.24.0.
- Windows 2012 R2 ISO скачать.
- Оператор Containerize Data Importer (CDI) для загрузки образа ISO.
- virtctl для работы на ВМ.
Шаги высокого уровня
Для запуска виртуальной машины на базе Windows с использованием файла Windows ISO необходимо выполнить следующие 8 шагов:
-
Настройте CDI. -
Настройте KubeVirt. -
Загрузка изображений с использованием
Virtctl. -
Создайте PV для
hardisk,
который будет держать установку Windows. -
Создайте виртуальную
машину
Windows, используя пример файла yaml . -
Запустите виртуальную
машину, используя virtctl. -
Подключитесь к ВМ, используя VNC. -
Установите Windows.
Подробные шаги
1. Настройте CDI
CDI требуется для загрузки изображения на ПВХ. CDI можно настроить, выполнив следующие команды:
Оболочка
xxxxxxxxxx
1
export VERSION=$(curl -s https://github.com/kubevirt/containerized-data-importer/releases/latest | grep -o "v[0-9]\.[0-9]*\.[0-9]*")
2
3
echo $VERSION
4
5
oc create -f https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-operator.yaml
6
7
oc create -f https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-cr.yaml
2. Настроить KubeVirt
Выберите подходящую версию. V0.24.0 приведен в качестве примера, так как это последняя версия. Измените это на последнюю версию во время использования:
Оболочка
xxxxxxxxxx
1
oc create namespace kubevirt
2
3
oc apply -f https://github.com/kubevirt/kubevirt/releases/download/v0.24.0/kubevirt-operator.yaml
4
5
oc apply -f https://github.com/kubevirt/kubevirt/releases/download/v0.24.0/kubevirt-cr.yaml
Применить кубевирт scc для openshift:
Простой текст
xxxxxxxxxx
1
---
2
allowHostDirVolumePlugin: true
3
allowHostIPC: true
4
allowHostNetwork: true
5
allowHostPID: true
6
allowHostPorts: true
7
allowPrivilegeEscalation: true
8
allowPrivilegedContainer: true
9
allowedCapabilities:
10
- '*'
11
allowedUnsafeSysctls:
12
- '*'
13
apiVersion: security.openshift.io/v1
14
defaultAddCapabilities: []
15
fsGroup:
16
type: RunAsAny
17
groups:
18
- system:cluster-admins
19
- system:nodes
20
- system:masters
21
kind: SecurityContextConstraints
22
metadata:
23
name: privileged
24
priority: 10
25
readOnlyRootFilesystem: false
26
requiredDropCapabilities: []
27
runAsUser:
28
type: RunAsAny
29
seLinuxContext:
30
type: RunAsAny
31
seccompProfiles:
32
- '*'
33
supplementalGroups:
34
type: RunAsAny
35
users:
36
- system:admin
37
- system:serviceaccount:openshift-infra:build-controller
38
- system:serviceaccount:kubevirt:kubevirt-operator
39
- system:serviceaccount:kubevirt:kubevirt-handler
40
- system:serviceaccount:kubevirt:kubevirt-apiserver
41
- system:serviceaccount:kubevirt:kubevirt-controller
42
volumes:
43
- '*'
Если у вас есть rook-ceph, примените также следующий файл:
https://github.com/rook/rook/blob/master/cluster/examples/kubernetes/ceph/upgrade-from-v1.2-apply.yaml
3. Загрузка изображения с помощью Virtctl
Установите virtctl с помощью следующих команд. Еще раз, используйте последнюю версию:
Оболочка
xxxxxxxxxx
1
curl -L -o virtctl https://github.com/kubevirt/kubevirt/releases/download/v0.26.0/virtctl-v0.26.0-linux-amd64
2
3
chmod +x virtctl
Теперь загрузите это изображение, используя следующую команду. Укажите IP прокси для загрузки, который вы получили
Оболочка
xxxxxxxxxx
1
oc get svc –n kubevirt
вывод команды.
Не забудьте запустить эту команду с главного узла.
Оболочка
xxxxxxxxxx
1
[root@mycluster-master-0 tmp]# ./virtctl image-upload --uploadproxy-url=https://x.x.x.x:443 --pvc-name=iso-win2k12-pvc --access-mode=ReadOnlyMany --pvc-size=25Gi --image-path=/tmp/Win2k12R2.ISO --insecure --wait-secs=180
Эта команда создаст 2 PVC, win2k12-pvc и win2k12-pvc-scratch одинакового размера (25Gi), как указано в следующей команде. Царапина PVC временная, и она будет автоматически удалена после успешной загрузки изображения.
4. Создайте PV для Hardisk, который будет держать установку Windows
Поместите следующий код в один файл .yaml и примените его, используя oc apply –f <filename>
.
Простой текст
xxxxxxxxxx
1
apiVersion: v1
2
kind: PersistentVolumeClaim
3
metadata:
4
name: windowshd
5
spec:
6
accessModes:
7
- ReadWriteOnce
8
resources:
9
requests:
10
storage: 25Gi
11
storageClassName: rook-filesystem
Не забудьте обновить storageClassName
до соответствующего значения. Вы можете обновить это на основе выходных oc get storageclass
данных. rook-filesystem
следует использовать, если rook-ceph
он на месте.
5. Создайте виртуальную машину Windows, используя пример файла YAML
Теперь пришло время создать виртуальную машину с использованием образа ISO, который был загружен ранее. Перед этим шагом необходимо подключить драйвер virtio в качестве компакт-диска. Вы можете сделать это с помощью podman / docker с помощью следующей команды:
podman pull kubevirt/virtio-container-disk
Проверьте это с помощью команды podman images. После выполнения вышеуказанного шага вы можете запустить файл create vm yaml. Образец приведен ниже:
Простой текст
xxxxxxxxxx
1
apiVersion: kubevirt.io/v1alpha3
2
kind: VirtualMachine
3
metadata:
4
name: samplevm
5
spec:
6
running: false
7
template:
8
metadata:
9
labels:
10
kubevirt.io/domain: samplevm
11
spec:
12
domain:
13
cpu:
14
cores: 4
15
devices:
16
disks:
17
- bootOrder: 1
18
cdrom:
19
bus: sata
20
name: cdromiso
21
- disk:
22
bus: virtio
23
name: harddrive
24
- cdrom:
25
bus: sata
26
name: virtiocontainerdisk
27
machine:
28
type: q35
29
resources:
30
requests:
31
memory: 8G
32
volumes:
33
- name: cdromiso
34
persistentVolumeClaim:
35
claimName: win2k12-pvc
36
- name: harddrive
37
persistentVolumeClaim:
38
claimName: windowshd
39
- containerDisk:
40
image: kubevirt/virtio-container-disk
41
name: virtiocontainerdisk
Сохраните приведенный выше код в файле yaml, а затем запустите его с помощью следующей команды:
oc create –f <filename.yaml>
6. Запустите ВМ, используя virtctl
По умолчанию VM находится в режиме выключения, поэтому первое, что вам нужно сделать, это запустить его.
Оболочка
xxxxxxxxxx
1
[root@paeprod-master-0 tmp]# oc get vms
2
3
NAME AGE RUNNING VOLUME
4
5
samplevm 3m false
6
7
[root@mycluster-master-0 tmp]# ./virtctl start vm samplevm
8
9
VM samplevm was scheduled to start
10
11
[root@mycluster-master-0 tmp]# oc get vm
12
13
NAME AGE RUNNING VOLUME
14
15
samplevm 76s true
Эта виртуальная машина создаст VMI, и вы увидите, что VMI будет запущен через несколько минут.
Оболочка
xxxxxxxxxx
1
[root@mycluster-master-0 tmp]# oc get vmi
2
3
NAME AGE PHASE IP NODENAME
4
5
samplevm 5m Running 10.x.x.x worker-1
7. Подключитесь к ВМ, используя VNC
Теперь пришло время подключиться к виртуальной машине с помощью VNC. Эту команду необходимо выполнить с хоста, который способен отображать дисплей. Вы можете использовать MobaXTerm или любое другое подобное программное обеспечение.
[root@localhost tmp]# ./virtctl vnc samplevm
Если произойдет сбой с ошибкой, такой как «remote_viewer not present», то установите remote_viewer с помощью следующей команды. Если нет, то вы увидите экран установки Windows, как показано ниже:
[root@localhost tmp]# yum install virt-viewer
8. Установите Windows
Завершите установку Windows, следуя этому видео . Он охватывает шаги, необходимые для использования драйверов virtio.
Помните, что указатель мыши не будет работать на большинстве экранов, поэтому вам нужно использовать такие клавиши, как, вкладка (для переключения между параметрами), пробел (для выбора флажка), ввод (для выбора), клавиша со стрелкой вправо (для расширения), и т.п.
Поздравляем !!! Ваша виртуальная машина Windows запущена и работает.
Резюме
Запуск виртуальных машин в одной и той же контейнерной среде на основе Kubernetes обеспечивает несколько преимуществ, таких как единое стекло для виртуальных машин и контейнеров, промежуточная платформа для возможной контейнеризации и платформа для размещения приложений на основе виртуальных машин, которые не могут быть преобразованы в микросервисы. Функция Openshift, называемая контейнерной собственной виртуализацией (CNV), находится в техническом предварительном просмотре, и эта функция автоматизирует весь процесс, который вы можете запустить из консоли Openshift. После GA этой функции хостинг рабочей нагрузки на базе VM в Openshift станет намного проще.
Помещение виртуальной машины в POD приводит к вложенной виртуализации, поэтому у нее есть некоторые потери производительности. В настоящее время несколько функций находятся в стадии разработки. Например, вы не можете увеличить CPU / Memory на лету, но довольно скоро все такие ограничения / проблемы уйдут в прошлое.
Отказ от ответственности: — Это мои личные взгляды, не связанные с мнением моего работодателя по этому вопросу.