Kubevirt: различия между версиями

Материал из ALT Linux Wiki
(Fix)
мНет описания правки
 
(не показаны 2 промежуточные версии этого же участника)
Строка 12: Строка 12:
# apt-get install qemu-kvm
# apt-get install qemu-kvm
</syntaxhighlight>
</syntaxhighlight>
* Выполнить [https://kubevirt.io/user-guide/cluster%20admin/installation/ шаги развертывания] kubevirt-компонентов под юзером admin.
* Выполнить [https://kubevirt.io/user-guide/cluster_admin/installation/#installing-kubevirt-on-kubernetes шаги развертывания] kubevirt-компонентов под юзером admin.
1. Выбрать необходимую версию kubevirt. Например:
1. Выбрать необходимую версию kubevirt. Например:
<syntaxhighlight lang="console">
<syntaxhighlight lang="console">
Строка 54: Строка 54:
$ 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>
</syntaxhighlight>
Дополнительно можно указать настройки для обновления компонентов (imagePullPolicy) и обновления ВМ (workloadUpdateStrategy). Почитать о настройке workloadUpdateStrategy [https://kubevirt.io/user-guide/cluster%20admin/updating%20and%20deletion/ тут].
Дополнительно можно указать настройки для обновления компонентов (imagePullPolicy) и обновления ВМ (workloadUpdateStrategy). Почитать о настройке workloadUpdateStrategy [https://kubevirt.io/user-guide/cluster_admin/updating_and_deletion/#updating-kubevirt-workloads тут].
<syntaxhighlight lang="yaml">
<syntaxhighlight lang="yaml">
apiVersion: kubevirt.io/v1
apiVersion: kubevirt.io/v1
Строка 107: Строка 107:
</syntaxhighlight>
</syntaxhighlight>
{{Note|
{{Note|
[https://kubevirt.io/user-guide/storage/disks%20and%20volumes/ Ссылка] на документацию по данному вопросу.
[https://kubevirt.io/user-guide/storage/disks_and_volumes/#containerdisk-workflow-example Ссылка] на документацию по данному вопросу.
[https://quay.io/organization/containerdisks Список ВМ] на основе других дистрибутивов.
[https://quay.io/organization/containerdisks Список ВМ] на основе других дистрибутивов.
}}
}}
Строка 181: Строка 181:
</syntaxhighlight>
</syntaxhighlight>


== Обновление ==
== Обновление компонетов kubevirt ==
Несколько вариантов:
Несколько вариантов:
1. В случае тривиального (предпочтительного) обновления версии kubevirt достаточно отредактировать kubevirt-operator.yaml, указав новую версию и обновив путь к образу operator компонента, после чего применить (kubectl apply) измененный конфиг. Применить конфиг kubevirt-cr.yaml.
* В случае тривиального (предпочтительного) обновления версии 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.
* В случае, если в конфиге kubevirt-operator.yaml и kubevirt-cr.yaml указана  политика обновления компонентов "imagePullPolicy: Always", то при необходимости обновления образов по контрольной сумме достаточно заново применить конфиги kubevirt-operator.yaml и kubevirt-cr.yaml.
3. В случае необходимости обновления образов по контрольной сумме и установленной в конфигах настройке "imagePullPolicy: IfNotPresent", необходимо использовать workaround: указать в конфиге kubevirt-cr.yaml специфические пути образам с указанием sha. Пример конфига:
* В случае необходимости обновления образов по контрольной сумме и установленной в конфигах настройке "imagePullPolicy: IfNotPresent", необходимо использовать workaround: указать в конфиге kubevirt-cr.yaml специфические пути образам с указанием sha. Пример конфига:
<syntaxhighlight lang="yaml">
<syntaxhighlight lang="yaml">
---
apiVersion: kubevirt.io/v1
apiVersion: kubevirt.io/v1
kind: KubeVirt
kind: KubeVirt
Строка 214: Строка 213:


== Удалить kubevirt ==
== Удалить kubevirt ==
Список основных шагов можно посмотреть в [https://kubevirt.io/user-guide/cluster%20admin/updating%20and%20deletion/ документации].
Список основных шагов можно посмотреть в [https://kubevirt.io/user-guide/cluster_admin/updating_and_deletion/#deleting-kubevirt документации].
<syntaxhighlight lang="console">
<syntaxhighlight lang="console">
$ kubectl delete -n kubevirt kubevirt kubevirt --wait=true # --wait=true should anyway be default
$ kubectl delete -n kubevirt kubevirt kubevirt --wait=true
$ kubectl delete apiservices v1.subresources.kubevirt.io # this needs to be deleted to avoid stuck terminating namespaces
$ kubectl delete apiservices v1.subresources.kubevirt.io
$ kubectl delete mutatingwebhookconfigurations virt-api-mutator # not blocking but would be left over
$ kubectl delete mutatingwebhookconfigurations virt-api-mutator
$ kubectl delete validatingwebhookconfigurations virt-operator-validator # not blocking but would be left over
$ kubectl delete validatingwebhookconfigurations virt-operator-validator
$ kubectl delete validatingwebhookconfigurations virt-api-validator # not blocking but would be left over
$ kubectl delete validatingwebhookconfigurations virt-api-validator
$ 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 #отменить ранее применнуй конфиг
$ kubectl delete -f kubevirt-operator.yaml --wait=false #отменить ранее применнуй конфиг
</syntaxhighlight>
</syntaxhighlight>
Дополнительно можно удалить из podman образы virt-конпонентов.
Дополнительно можно удалить из podman образы virt-конпонентов.

Текущая версия от 15:33, 28 октября 2024

Надстройка Kubernetes, добавляющая возможность оркестровки виртуальных машин, помимо контейнеров.

Установка

  • Развернуть k8s кластер.
  • На master ноде установить пакеты:
# apt-get install qemu-kvm podman
  • Настроить podman rootless mode для пользователя, от которого далее будет настроен kubevirt. Например, admin.
  • На slave ноде установить пакеты:
# apt-get install qemu-kvm

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
  1. Дождаться завершения настройки компонентов (первоначально занимает 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 #подключиться к компоненту

Обновление компонетов kubevirt

Несколько вариантов:

  • В случае тривиального (предпочтительного) обновления версии kubevirt достаточно отредактировать kubevirt-operator.yaml, указав новую версию и обновив путь к образу operator компонента, после чего применить (kubectl apply) измененный конфиг. Применить конфиг kubevirt-cr.yaml.
  • В случае, если в конфиге kubevirt-operator.yaml и kubevirt-cr.yaml указана политика обновления компонентов "imagePullPolicy: Always", то при необходимости обновления образов по контрольной сумме достаточно заново применить конфиги kubevirt-operator.yaml и kubevirt-cr.yaml.
  • В случае необходимости обновления образов по контрольной сумме и установленной в конфигах настройке "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
$ 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=false #отменить ранее применнуй конфиг

Дополнительно можно удалить из podman образы virt-конпонентов.