Перейти к основному контенту

Kubevirt

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


Содержание

Установка на KubernetesKubernetes.

    Развернуть k8s кластер. Выполнить шаги развертывания kubevirt-компонентов под юзером admin.

    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 #подключиться к компоненту для отладки
    

    Запуск виртуальной машины

      Создать ssh ключ для юзера admin, если его нет, и заригистрировать его в kubevirt-окружении для дальнейшего подлключения к виртуальной машине:
      $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 и пользовательские аргументы во время процесса загрузки, можно посмотреть тут

          Создать kubevirt конфиг ВМ vmi.yaml:
          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
            
              Посмотреть список виртуальных машин, проверить статус и выделеный ip созданной ВМ:
              $ kubectl get vmi
              
              NAME     AGE   PHASE     IP          NODENAME   READY
              testvm   30m   Running   <127.0.0.15>   test-s1    True
              
                Подключиться к ВМ можно по ssh, указав юзера из конфига ВМ, имя ранее настроенного ключа (обязательно, если файл ключа назван не подефолту), ip ВМ из предыдущей команды:
                $ 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

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

                    В случае тривиального (предпочтительного) обновления версии 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: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.