Kubevirt: различия между версиями
Fedor (обсуждение | вклад) Нет описания правки |
Fedor (обсуждение | вклад) (Fix) |
||
Строка 18: | Строка 18: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
2. Развернуть компонент operator. | 2. Развернуть компонент operator. | ||
Чтобы получить компонент, базирующийся на alt платформе или отличающейся от upstream, необходимо скачать конфиг upstream-компонента и указать путь к нужному образу компонента virt-operator в репозитории и нужной версии. | Чтобы получить компонент, базирующийся на alt платформе или отличающейся от upstream, необходимо скачать конфиг upstream-компонента и указать путь к нужному образу компонента virt-operator в репозитории и нужной версии (а так же политику обновления образа imagePullPolicy: только если образа нет локально / всегда). | ||
<syntaxhighlight lang="console"> | <syntaxhighlight lang="console"> | ||
$ wget https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-operator.yaml | $ wget https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-operator.yaml | ||
Строка 42: | Строка 42: | ||
value: v1.3.1 | value: v1.3.1 | ||
image: registry.altlinux.org/sisyphus/virt-operator:1.3.1 | image: registry.altlinux.org/sisyphus/virt-operator:1.3.1 | ||
imagePullPolicy: IfNotPresent | imagePullPolicy: IfNotPresent #Always | ||
name: virt-operator | name: virt-operator | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 53: | Строка 53: | ||
<syntaxhighlight lang="console"> | <syntaxhighlight lang="console"> | ||
$ wget https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-cr.yaml | $ wget https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-cr.yaml | ||
</syntaxhighlight> | |||
Дополнительно можно указать настройки для обновления компонентов (imagePullPolicy) и обновления ВМ (workloadUpdateStrategy). Почитать о настройке workloadUpdateStrategy [https://kubevirt.io/user-guide/cluster%20admin/updating%20and%20deletion/ тут]. | |||
<syntaxhighlight lang="yaml"> | |||
apiVersion: kubevirt.io/v1 | |||
kind: KubeVirt | |||
metadata: | |||
name: kubevirt | |||
namespace: kubevirt | |||
spec: | |||
imagePullPolicy: IfNotPresent #Always | |||
workloadUpdateStrategy: | |||
workloadUpdateMethods: | |||
- LiveMigrate | |||
- Evict | |||
batchEvictionSize: 10 | |||
batchEvictionInterval: "1m" | |||
</syntaxhighlight> | |||
<syntaxhighlight lang="console"> | |||
$ kubectl apply -f kubevirt-cr.yaml | $ kubectl apply -f kubevirt-cr.yaml | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 86: | Строка 104: | ||
<syntaxhighlight lang="yaml"> | <syntaxhighlight lang="yaml"> | ||
FROM scratch | FROM scratch | ||
ADD --chown=107:107 http://ftp.altlinux.org/pub/distributions/ALTLinux/images/Sisyphus/cloud/x86_64/alt-sisyphus-cloud- | ADD --chown=107:107 http://ftp.altlinux.org/pub/distributions/ALTLinux/images/Sisyphus/cloud/x86_64/alt-sisyphus-cloud-x86_64.qcow2 /disk/ | ||
</syntaxhighlight> | </syntaxhighlight> | ||
{{Note| | {{Note| | ||
Строка 148: | Строка 166: | ||
$ ssh -i kvm-key <user>@<127.0.0.15> | $ ssh -i kvm-key <user>@<127.0.0.15> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
* Удалить ВМ. | |||
<syntaxhighlight lang="console"> | |||
$ kubectl delete -f vmi.yaml | |||
</syntaxhighlight> | |||
== В случае проблем c запуском ВМ == | |||
При запуске каждой виртуальном машины для нее разворачивается компонент virt-laucher, который также моэно использовать для поиска и отладки проблем. Таким образом, в случа, если в течении нескольких минут ВМ не оказалась в статусе "Running", необходимо проверить логи laucher компонента. | |||
<syntaxhighlight lang="console"> | |||
$ 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 #подключиться к компоненту | |||
</syntaxhighlight> | |||
== Обновление == | |||
Несколько вариантов: | |||
1. В случае тривиального (предпочтительного) обновления версии kubevirt достаточно отредактировать kubevirt-operator.yaml, указав новую версию и обновив путь к образу operator компонента, после чего применить (kubectl apply) измененный конфиг. Применить конфиг kubevirt-cr.yaml. | |||
2. В случае, если в конфиге kubevirt-operator.yaml и kubevirt-cr.yaml указана политика обновления компонентов "imagePullPolicy: Always", то при необходимости обновления образов по контрольной сумме достаточно заново применить конфиги kubevirt-operator.yaml и kubevirt-cr.yaml. | |||
3. В случае необходимости обновления образов по контрольной сумме и установленной в конфигах настройке "imagePullPolicy: IfNotPresent", необходимо использовать workaround: указать в конфиге kubevirt-cr.yaml специфические пути образам с указанием sha. Пример конфига: | |||
<syntaxhighlight lang="yaml"> | |||
--- | |||
apiVersion: kubevirt.io/v1 | |||
kind: KubeVirt | |||
metadata: | |||
name: kubevirt | |||
namespace: kubevirt | |||
spec: | |||
certificateRotateStrategy: {} | |||
configuration: | |||
developerConfiguration: | |||
featureGates: [] | |||
customizeComponents: | |||
patches: | |||
- resourceType: DaemonSet | |||
resourceName: virt-handler | |||
patch: '{"spec":{"template":{"spec":{"containers":[{"imageID":"registry.altlinux.org/sisyphus/virt-handler@sha256:ce91b77c951712c48a9f1516b351c243f5526e5aa4b1c6e652833b4a1884b70d","name":"virt-handler"}]}}}}' | |||
type: strategic | |||
- resourceType: Deployment | |||
resourceName: virt-controller | |||
patch: '[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--launcher-image=registry.altlinux.org/sisyphus/virt-launcher@sha256:90c873b600a4581f447bbaaa5b5e5521675d7860f658b387bc3d8f1e2113ee5c"}]' | |||
type: json | |||
imagePullPolicy: Always | |||
workloadUpdateStrategy: {} | |||
</syntaxhighlight> | |||
Применить конфиг. | |||
== Удалить kubevirt == | |||
Список основных шагов можно посмотреть в [https://kubevirt.io/user-guide/cluster%20admin/updating%20and%20deletion/ документации]. | |||
<syntaxhighlight lang="console"> | |||
$ kubectl delete -n kubevirt kubevirt kubevirt --wait=true # --wait=true should anyway be default | |||
$ kubectl delete apiservices v1.subresources.kubevirt.io # this needs to be deleted to avoid stuck terminating namespaces | |||
$ kubectl delete mutatingwebhookconfigurations virt-api-mutator # not blocking but would be left over | |||
$ kubectl delete validatingwebhookconfigurations virt-operator-validator # not blocking but would be left over | |||
$ kubectl delete validatingwebhookconfigurations virt-api-validator # not blocking but would be left over | |||
$ kubectl delete -f kubevirt-operator.yaml --wait=false or $ kubectl delete -f https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-operator.yaml --wait=false #отменить ранее применнуй конфиг | |||
</syntaxhighlight> | |||
Дополнительно можно удалить из podman образы virt-конпонентов. |
Версия от 15:20, 28 октября 2024
Надстройка Kubernetes, добавляющая возможность оркестровки виртуальных машин, помимо контейнеров.
Установка
- Развернуть k8s кластер.
- На master ноде установить пакеты:
# apt-get install qemu-kvm podman
- Настроить podman rootless mode для пользователя, от которого далее будет настроен kubevirt. Например, admin.
- На slave ноде установить пакеты:
# apt-get install qemu-kvm
- Выполнить шаги развертывания kubevirt-компонентов под юзером admin.
1. Выбрать необходимую версию kubevirt. Например:
$ export RELEASE=$(curl https://storage.googleapis.com/kubevirt-prow/release/kubevirt/kubevirt/stable.txt)
2. Развернуть компонент operator. Чтобы получить компонент, базирующийся на alt платформе или отличающейся от upstream, необходимо скачать конфиг upstream-компонента и указать путь к нужному образу компонента virt-operator в репозитории и нужной версии (а так же политику обновления образа imagePullPolicy: только если образа нет локально / всегда).
$ wget https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-operator.yaml
$ vim kubevirt-operator.yaml
containers:
- args:
- --port
- "8443"
- -v
- "2"
command:
- virt-operator
env:
- name: VIRT_OPERATOR_IMAGE
value: registry.altlinux.org/sisyphus/virt-operator:1.3.1
- name: WATCH_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.annotations['olm.targetNamespaces']
- name: KUBEVIRT_VERSION
value: v1.3.1
image: registry.altlinux.org/sisyphus/virt-operator:1.3.1
imagePullPolicy: IfNotPresent #Always
name: virt-operator
Применить конфиг.
$ kubectl apply -f kubevirt-operator.yaml
3. Развернуть kubevirt-окружение с остальными компонентами. Скачать конфиг окружения и применить его.
$ wget https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-cr.yaml
Дополнительно можно указать настройки для обновления компонентов (imagePullPolicy) и обновления ВМ (workloadUpdateStrategy). Почитать о настройке workloadUpdateStrategy тут.
apiVersion: kubevirt.io/v1
kind: KubeVirt
metadata:
name: kubevirt
namespace: kubevirt
spec:
imagePullPolicy: IfNotPresent #Always
workloadUpdateStrategy:
workloadUpdateMethods:
- LiveMigrate
- Evict
batchEvictionSize: 10
batchEvictionInterval: "1m"
$ kubectl apply -f kubevirt-cr.yaml
- Дождаться завершения настройки компонентов (первоначально занимает 2-3 мин). Для проверки готовности выполнить:
$ kubectl -n kubevirt wait kv kubevirt --for condition=Available
- Посмотреть окружение и статус всех компонентов:
$ kubectl get all -n kubevirt
В случае проблем на этапе развертывания
Если в полученном окружении не хватает каких-то компонентов после настроек выше или какой-то компонент не находится в статусе "запущен", необходимо изначально удостовериться в доступности всех образов компонентов по указанному пути в конфиге 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 #подключиться к компоненту для отладки
Запуск виртуальной машины
- Создать ssh ключ для юзера admin, если его нет, и заригистрировать его в kubevirt-окружении для дальнейшего подлключения к виртуальной машине:
$kubectl create secret generic kvm-key --from-file=ssh-publickey=/home//.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/
- Создать kubevirt конфиг ВМ vmi.yaml:
metadata:
name: <name> #имя ВМ
annotations:
kubevirt.io/keep-launcher-alive-after-failure: "true" #настройка позволяющая сохранять компонент virt-launcher для отладки в случае падения запуска ВМ
labels:
debugLogs: "true"
logVerbosity: "6" #детализация ошибок
apiVersion: kubevirt.io/v1
kind: VirtualMachineInstance
spec:
domain:
resources:
requests:
memory: 1024M
devices:
disks:
- name: containerdisk
disk:
bus: virtio
- name: cloudinitdisk
disk:
bus: virtio
terminationGracePeriodSeconds: 0
accessCredentials:
- sshPublicKey:
source:
secret:
secretName: kvm-key #ключ, добавленный ранее
propagationMethod:
noCloud: {}
volumes:
- name: containerdisk
containerDisk:
image: <example.ru/alt/vmidisks/rootfs-x86:latest> #путь к подготовленному образу ВМ
- name: cloudinitdisk
cloudInitNoCloud:
userData: |-
#cloud-config
password: <user> #юзер и пароль для подключения к ВМ
user: <pass>
chpasswd: { expire: False }
- Применить конфиг.
$ kubectl create -f vmi.yaml
- Посмотреть список виртуальных машин, проверить статус и выделеный ip созданной ВМ:
$ kubectl get vmi
- Подключиться к ВМ, указать юзера из конфига ВМ, имя ранее настроенного ключа, ip ВМ из предыдущей команды:
$ ssh -i kvm-key <user>@<127.0.0.15>
- Удалить ВМ.
$ kubectl delete -f vmi.yaml
В случае проблем c запуском ВМ
При запуске каждой виртуальном машины для нее разворачивается компонент 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 #подключиться к компоненту
Обновление
Несколько вариантов: 1. В случае тривиального (предпочтительного) обновления версии kubevirt достаточно отредактировать kubevirt-operator.yaml, указав новую версию и обновив путь к образу operator компонента, после чего применить (kubectl apply) измененный конфиг. Применить конфиг kubevirt-cr.yaml. 2. В случае, если в конфиге kubevirt-operator.yaml и kubevirt-cr.yaml указана политика обновления компонентов "imagePullPolicy: Always", то при необходимости обновления образов по контрольной сумме достаточно заново применить конфиги kubevirt-operator.yaml и kubevirt-cr.yaml. 3. В случае необходимости обновления образов по контрольной сумме и установленной в конфигах настройке "imagePullPolicy: IfNotPresent", необходимо использовать workaround: указать в конфиге kubevirt-cr.yaml специфические пути образам с указанием sha. Пример конфига:
---
apiVersion: kubevirt.io/v1
kind: KubeVirt
metadata:
name: kubevirt
namespace: kubevirt
spec:
certificateRotateStrategy: {}
configuration:
developerConfiguration:
featureGates: []
customizeComponents:
patches:
- resourceType: DaemonSet
resourceName: virt-handler
patch: '{"spec":{"template":{"spec":{"containers":[{"imageID":"registry.altlinux.org/sisyphus/virt-handler@sha256:ce91b77c951712c48a9f1516b351c243f5526e5aa4b1c6e652833b4a1884b70d","name":"virt-handler"}]}}}}'
type: strategic
- resourceType: Deployment
resourceName: virt-controller
patch: '[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--launcher-image=registry.altlinux.org/sisyphus/virt-launcher@sha256:90c873b600a4581f447bbaaa5b5e5521675d7860f658b387bc3d8f1e2113ee5c"}]'
type: json
imagePullPolicy: Always
workloadUpdateStrategy: {}
Применить конфиг.
Удалить kubevirt
Список основных шагов можно посмотреть в документации.
$ kubectl delete -n kubevirt kubevirt kubevirt --wait=true # --wait=true should anyway be default
$ kubectl delete apiservices v1.subresources.kubevirt.io # this needs to be deleted to avoid stuck terminating namespaces
$ kubectl delete mutatingwebhookconfigurations virt-api-mutator # not blocking but would be left over
$ kubectl delete validatingwebhookconfigurations virt-operator-validator # not blocking but would be left over
$ kubectl delete validatingwebhookconfigurations virt-api-validator # not blocking but would be left over
$ kubectl delete -f kubevirt-operator.yaml --wait=false or $ kubectl delete -f https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-operator.yaml --wait=false #отменить ранее применнуй конфиг
Дополнительно можно удалить из podman образы virt-конпонентов.