Kubevirt
Надстройка Kubernetes, добавляющая возможность оркестровки виртуальных машин, помимо контейнеров.
Содержание
Установка на KubernetesKubernetes.
1. Выбрать необходимую версию kubevirt. Например:
$ export RELEASE=RELEASE=$(curl https://storage.googleapis.com/kubevirt-prow/release/kubevirt/kubevirt/stable.txt)txt)
2. Развернуть компонент operator. Чтобы получить компонент, базирующийся на alt платформе или отличающейся от upstream, необходимо скачать конфиг upstream-компонента и указать путь к нужному образу компонента virt-operator в ALT-репозитории и нужной версии (а так же политику обновления образа imagePullPolicy: только если образа нет локально / всегда).
$ wget https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}RELEASE}/kubevirt-operator.yaml
$ vim kubevirt-operator.yaml
containers:containers:
- args:
- args:
- --port
- - "8443"
- - -v
- - "2"
command:
command:- - virt-operator
env:
env:- name: -VIRT_OPERATOR_IMAGE
name:value: VIRT_OPERATOR_IMAGE
value: registry.altlinux.org/sisyphus/virt-operator:1.3.1
- -name: name:WATCH_NAMESPACE
WATCH_NAMESPACEvalueFrom:
fieldRef:
valueFrom:fieldPath: fieldRef:
fieldPath: metadata.annotations['olm.targetNamespaces']
- -name: name:KUBEVIRT_VERSION
KUBEVIRT_VERSIONvalue: value: v1.3.1
image: image: registry.altlinux.org/sisyphus/virt-operator:1.3.1
imagePullPolicy: imagePullPolicy:IfNotPresent IfNotPresent#Always
#Alwaysname: name: virt-operator
Применить конфиг.
$ kubectl apply -f kubevirt-operator.yaml
3. Развернуть kubevirt-окружение с остальными компонентами. Скачать конфиг окружения и применить его.
$ wget https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}RELEASE}/kubevirt-cr.yaml
Дополнительно можно указать настройки для обновления компонентов (imagePullPolicy) и обновления ВМ (workloadUpdateStrategy). Почитать о настройке workloadUpdateStrategy тут.
apiVersion:apiVersion: kubevirt.io/v1
kind:kind: KubeVirt
metadata:metadata:
name: name:kubevirt
namespace: kubevirt
spec:
namespace:imagePullPolicy: kubevirtIfNotPresent spec:#Always
workloadUpdateStrategy:
imagePullPolicy:workloadUpdateMethods:
IfNotPresent- #AlwaysLiveMigrate
- workloadUpdateStrategy:Evict
batchEvictionSize: workloadUpdateMethods:10
batchEvictionInterval: - LiveMigrate
- Evict
batchEvictionSize: 10
batchEvictionInterval: "1m"
$ kubectl apply -f kubevirt-cr.yaml
4. Дождаться завершения настройки компонентов (первоначально занимает 2-3 мин). Для проверки готовности выполнить:
$ kubectl -n kubevirt wait kv kubevirt --for condition=condition=Available
5. Посмотреть окружение и статус всех компонентов:
$ kubectl get all -n kubevirt
NAME READY STATUS RESTARTS AGE
pod/virt-api-75bdb55bb8-2jkgn 1/1 Running 0 91s
pod/virt-api-75bdb55bb8-5g4gk 1/1 Running 0 91s
pod/virt-controller-6c496fff7b-7vvbk 1/1 Running 0 65s
pod/virt-controller-6c496fff7b-tbn42 1/1 Running 0 65s
pod/virt-handler-ff2tj 1/1 Running 0 65s
pod/virt-operator-5695c4f49f-b2kxd 1/1 Running 0 5m15s
pod/virt-operator-5695c4f49f-fwf29 1/1 Running 0 5m15s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubevirt-operator-webhook ClusterIP 10.102.104.70 <none> 443/TCP 93s
service/kubevirt-prometheus-metrics ClusterIP None <none> 443/TCP 93s
service/virt-api ClusterIP 10.102.200.98 <none> 443/TCP 93s
service/virt-exportproxy ClusterIP 10.96.168.30 <none> 443/TCP 93s
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/virt-handler 1 1 1 1 1 kubernetes.io/os=linux 65s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/virt-api 2/2 2 2 91s
deployment.apps/virt-controller 2/2 2 2 65s
deployment.apps/virt-operator 2/2 2 2 5m15s
NAME DESIRED CURRENT READY AGE
replicaset.apps/virt-api-75bdb55bb8 2 2 2 91s
replicaset.apps/virt-controller-6c496fff7b 2 2 2 65s
replicaset.apps/virt-operator-5695c4f49f 2 2 2 5m15s
NAME AGE PHASE
kubevirt.kubevirt.io/kubevirt 2m2s Deployed
В случае проблем на этапе развертывания
Если в полученном окружении не хватает каких-то компонентов после настроек выше или какой-то компонент не находится в статусе "запущен", необходимо изначально удостовериться в доступности всех образов компонентов по указанному пути в конфиге kubevirt-operator.yaml (они должны быть доступны по аналогичному пути, что и virt-operator, а так же иметь ту же версию). Список компонентов: virt-api virt-controller virt-exportproxy virt-exportserver virt-launcher virt-handler
Если доступность в норме, далее необходимо поэтапно проверить наличие ошибок в каждом компоненте. Сначала основные: virt-handler и virt-controller, далее virt-operator. Примеры команд для получения информации о компонентах:
$ kubectl get all -n kubevirt #посмотреть идентификаторы компонентов
$ kubectl logs --since "15m" -n kubevirt virt-handler-<id> | grep error #логи по времени
$ kubectl logs --tail 20 -n kubevirt virt-handler-<id> #логи по количеству
$ kubectl describe -n kubevirt pod virt-handler-<id> #информация о компоненте, в том числе логи этапов запуска
$ kubectl exec -it -n kubevirt virt-handler-<id> -- /bin/bash #подключиться к компоненту для отладки
Запуск виртуальной машины
$kubectl create secret generic kvm-key --from-file=file=ssh-publickey=publickey=/home/<user>/.ssh/<id_ed25519.pub>
Официальную документацию по доступу к созданной ВМ можно посмотреть тут
Пример Dockerfile для создания образа ВМ на базе alt для kubevirt:
FROM scratch
ADD --chown=107:107 http://ftp.altlinux.org/pub/distributions/ALTLinux/images/Sisyphus/cloud/x86_64/alt-sisyphus-cloud-x86_64.qcow2 /disk/
Ссылка на документацию по данному вопросу. Список ВМ на основе других дистрибутивов.
Официальную документацию по настройке ВМ, которая будет использовать пользовательское ядро/бинарный файл initrd и пользовательские аргументы во время процесса загрузки, можно посмотреть тут
metadata:metadata:
name: name: <name> #имя ВМ
annotations:
annotations:
kubevirt.io/keep-launcher-alive-after-failure:failure: "true" #настройка позволяющая сохранять компонент virt-launcher для отладки в случае падения запуска ВМ
labels:
labels:debugLogs: debugLogs: "true"
logVerbosity: logVerbosity: "6" #детализация ошибок
apiVersion:apiVersion: kubevirt.io/v1
kind:kind: VirtualMachineInstance
spec:spec:
domain:
domain:resources:
requests:
resources:memory: 1024M
requests:devices:
disks:
memory:- 1024Mname: containerdisk
devices:disk:
bus: disks:virtio
- name: cloudinitdisk
disk:
bus: virtio
terminationGracePeriodSeconds: 0
accessCredentials:
- name:sshPublicKey:
containerdisksource:
secret:
disk:secretName: bus: virtio
- name: cloudinitdisk
disk:
bus: virtio
terminationGracePeriodSeconds: 0
accessCredentials:
- sshPublicKey:
source:
secret:
secretName: kvm-key #ключ, добавленный ранее
propagationMethod:
propagationMethod:noCloud: noCloud: {}
volumes:
volumes:- name: -containerdisk
name:containerDisk:
containerdiskimage: containerDisk:
image: <example.ru/alt/vmidisks/rootfs-x86:latest> #путь к подготовленному образу ВМ
- -name: name:cloudinitdisk
cloudinitdiskcloudInitNoCloud:
userData: cloudInitNoCloud:
userData: |-
#cloud-config
password: <user> #юзер и пароль для подключения к ВМ
user: <pass>
chpasswd: { expire: False }
$ kubectl create -f vmi.yaml
$ kubectl get vmi
NAME AGE PHASE IP NODENAME READY
testvm 30m Running <127.0.0.15> test-s1 True
$ ssh -i /home/<user>/.ssh/<id_ed25519> <user>@<127.127.0.0.15>
Или с помощью virtctl:
$ virtctl ssh <user>@vmi/testvm
$ virtctl ssh -i /home/<user>/.ssh/<id_ed25519> <user>@vmi/testvm
Работа сетевой доступности ресурсов извне ВМ может потребовать дополнительных настроек в зависимости от конфигурации Kubernetes и используемого сетевого плагина.
$ kubectl delete -f vmi.yaml
В случае проблем с запуском ВМ
При запуске каждой виртуальном машины для нее разворачивается компонент virt-laucher, который также можно использовать для поиска и отладки проблем. Таким образом, в случае, если в течении нескольких минут ВМ не оказалась в статусе "Running", необходимо проверить логи laucher компонента.
$ kubectl get pod #получить имя launcher компонента
$ kubectl describe pod virt-launcher-<id> #проверить этапы запуска компонента
$ kubectl logs --since "15m" virt-launcher-<id> #проверить логи
$ kubectl describe vmi <имя ВМ> #проверить настроки ВМ
$ kubectl exec -it virt-launcher-<id> -- /bin/bash #подключиться к компоненту
Обновление компонетов kubevirt
Несколько вариантов:
apiVersion:apiVersion: kubevirt.io/v1
kind:kind: KubeVirt
metadata:metadata:
name: name:kubevirt
namespace: kubevirt
spec:
namespace:certificateRotateStrategy: kubevirt
spec:
certificateRotateStrategy: {}
configuration:
configuration:developerConfiguration:
featureGates: developerConfiguration:
featureGates: []
customizeComponents:
customizeComponents:patches:
- patches:resourceType: DaemonSet
-resourceName: resourceType: DaemonSet
resourceName: virt-handler
patch: patch: '{"spec":{"template":{"spec":{"containers":[{"imageID":"registry.altlinux.org/sisyphus/virt-handler@sha256:ce91b77c951712c48a9f1516b351c243f5526e5aa4b1c6e652833b4a1884b70d","name":"virt-handler"}]}}}}'
type: type:strategic
strategic- resourceType: -Deployment
resourceType:resourceName: Deployment
resourceName: virt-controller
patch: patch: '[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--launcher-image=registry.altlinux.org/sisyphus/virt-launcher@sha256:90c873b600a4581f447bbaaa5b5e5521675d7860f658b387bc3d8f1e2113ee5c"}]'
type: type:json
jsonimagePullPolicy: Always
imagePullPolicy:workloadUpdateStrategy: Always
workloadUpdateStrategy: {}
Применить конфиг.
Удалить kubevirt
Удалить ресурсы kubevirt можно, выполняя удаление установленных манифестов в обратном порядке. Также список основных шагов можно посмотреть в документации.
$ kubectl delete -n kubevirt kubevirt kubevirt --wait=wait=true
$ kubectl delete apiservices v1.subresources.kubevirt.io
$ kubectl delete mutatingwebhookconfigurations virt-api-mutator
$ kubectl delete validatingwebhookconfigurations virt-operator-validator
$ kubectl delete validatingwebhookconfigurations virt-api-validator
$ kubectl delete -f kubevirt-operator.yaml --wait=wait=false #отменить ранее применнуй конфиг
Особенности на ALt Оркестрации
Для различных сред развертывания необходимо убедиться, что доступна и включена функция виртуализации в bios, а для гипервизора параметр cpu установлен в значение host.