Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Виртуальные машины внутри контейнеров

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

Виртуальные машины внутри контейнеров

Виртуальные машины применяют для изоляции запускаемого программ на определенных операционных системах, этот подход позволяет достаточно сильно разделить сервисы между собой, и тем самым ограничить доступы, вычислительные ресурсы и т.д. Управление виртуальными машина достаточно дорогой процесс и требует наличия специализированного программного обеспечения, вроде VMWare, Windows Hypervisors, OpenStack и т.д.

По другую сторону находятся контейнеры, которые часто применяются в разработке для запуска микросервисов. Для оркестрации контейнеров обычно используют Kubernetes. Существует набор практик для использования платформы Kubernetes в Enterprise-системах. Эти же практики и подходы могут быть применимы для запуска виртуальных машин. Тем самым можно обеспечить запуск различных операционных систем на отличающихся архитектурах внутри одного кластера Kubernetes наряду с обычными контейнерами. В каких случаях это может быть полезно? На каких технологиях это будет работать и как виртуальные машины будут интегрированы в экосистему Kubernetes?

Спикер расскажет свой путь поиска решения для запуска тестовых стендов с виртуальными машинами на базе отечественной операционной системы в кластере Kubernetes.

Спикер: Руслан Гайнанов, тимлид DevOps-команды в ИТ-Холдинге Т1

Запись доклада - https://rutube.ru/video/79c97b6cf220bf67c8cc76bb122d4183/?r=wd&t=4621

Avatar for Ruslan Gainanov

Ruslan Gainanov

February 26, 2025

More Decks by Ruslan Gainanov

Other Decks in Programming

Transcript

  1. Руслан Гайнанов • Тимлид команды DevOps в дивизионе продуктовой разработки

    ГК Иннотех (входит в Т1) • Занимаюсь разработкой сервисов для автоматизации разработки и внедрения продуктов компании
  2. 1. Описание проекта и задачи 2. Способы решения 3. Подробнее

    про подход 4. Выводы по решению 5. Возникшие трудности и выход Содержание
  3. Система управления конфигурациями «Осмакс» — система распространения и обновления ПО,

    а также массового управления конфигурациями устройств в гетерогенной среде https://infra.inno.tech/osmax
  4. 1 2 3 systemd-службы Приложения: deb/rpm- пакеты Настройки ОС: диски,

    устройства, пользователи Основные требования к ПО и стендам
  5. 1 2 3 systemd-службы Приложения: deb/rpm- пакеты Настройки ОС: диски,

    устройства, пользователи Основные требования к ПО и стендам 4 5 6 Вообще без ОС ОС: Windows, AstraLinux, RED, BaseALT GUI: RDP/VNC/ssh
  6. KVM - QEMU • KVM — это модуль ядра Linux,

    ​обеспечивающий доступ к аппаратной виртуализации на базе Intel VT и AMD SVM • QEMU — эмулятор аппаратного обеспечения различных платформ, позволяющий запускать различные гостевые операционные системы • QEMU-KVM — qemu-system, запущенный с kvm в качестве ускорителя
  7. libvirt • libvirt — open-source проект, который занимается разработкой набора

    инструментов и драйверов для управления гипервизорами • Предоставляет интерфейс взаимодействия через набор XML-файлов плюс возможность автоматизации через API
  8. Инструменты для управления ВМ через libvirt • the-hard-way: API (libvirt)

    • bash: virsh, virt-install • ansible: community.libvirt • vagrant: libvirt • terraform: libvirt • kubernetes: kubevirt, virtlet, virtink
  9. Инструменты для управления ВМ через libvirt • the-hard-way: API (libvirt)

    • bash: virsh, virt-install • ansible: community.libvirt • vagrant: libvirt • terraform: libvirt • kubernetes: kubevirt, virtlet, virtink
  10. Два мира — один стек - стартовал в 2016 при

    поддержке RedHat - проект CNCF с 2019 (sandbox), с 2022 - incubating - релиз 1.0 в июле 2023 сейчас - 1.3.0 (17 июля 2024) и >5k на GitHub
  11. apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: testvm spec: template: spec:

    domain: ... networks: ... volumes: - name: containerdisk containerDisk: image: quay.io/kubevirt/cirros-container-disk-demo kubectl apply -f VM.yaml
  12. $ kubectl get pods NAME READY STATUS virt-launcher-testvm-jbkbg 1/1 Running

    VM → VMI → Pod с QEMU KubeVirt VM KubeVirt VMI create create KubeVirt POD KVM + QEMU Container
  13. $ kubectl exec virt-launcher-testvm-jbkbg -- sh $ virsh list Id

    Name State 1 default_testvm running $ virsh dumpxml default_testvm <domain type='qemu' id='1'> <name>default_testvm</name> <uuid>5a9fc181-957e-5c32-9e5a-2de5e9673531</uuid> <memory unit='KiB'>524288</memory> <currentMemory unit='KiB'>524288</currentMemory> <vcpu placement='static'>1</vcpu> ... </domain> ВМ внутри контейнера в Pod’е
  14. 2 Где и как хранить образы? данные? Как подключиться к

    ней? 3 4 Как интегрировать ВМ с сервисами Kubernetes? Как управлять ресурсами? доступами? Мы запустили ВМ в Kubernetes! И это всё? 1
  15. $ virtctl console testvm $ kubectl virt console testvm $

    virtctl ssh testvm $ virtctl vnc testvm Подключение к ВМ
  16. apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: testvm spec: running: false

    template: metadata: labels: kubevirt.io/domain: testvm spec: ... networks: - name: default pod: {} ... Подключение к ВМ через LoadBalancer. ssh apiVersion: v1 kind: Service metadata: name: testvm-ssh spec: ports: - port: 22 protocol: TCP targetPort: 22 selector: kubevirt.io/domain: testvm type: LoadBalancer
  17. $ virtctl port-forward vm/win10 udp/3389 tcp/3389 Подключение к ВМ через

    port-forward и RDP client virtctl port- forward proxy Your computer Pod VM
  18. Подключение к ВМ через noVNC wavezhang/virtVNC — централизованный дашборд для

    подключения через браузер к запущенным ВМ (KubeVirt)
  19. 2 Есть скрипты для первичной автонастройки (cloud-init) Временное хранение данных

    (до перезапуска) 3 4 Подходит для тестовых сценариев Можно использовать существующий ContainerRegistry Ephemeral Volume 1
  20. # VM Spec spec: template: spec: volumes: - containerDisk: image:

    registry.example.com/vm/fedora25 # Dockerfile FROM scratch ADD --chown=107:107 fedora25.qcow2 /disk/ Ephemeral Volume. containerDisk. Build & Push
  21. Persistent Volume 1. Долгосрочное хранение данных 2. Позволяет выполнять миграции

    ВМ (LiveMigration) 3. Работает через дополнительный оператор и CRD: DataVolume (DV) DV PVC Pod create mount
  22. apiVersion: cdi.kubevirt.io/v1beta1 kind: DataVolume metadata: name: dv-cirros spec: source: http:

    url: "https://download.cirros-cloud.net/0.6.2/cirros-0.6.2-x86_64-disk.img" –– << из S3 pvc: accessModes: - ReadWriteOnce resources: requests: storage: "128Mi" Создание Data Volumes(DV)
  23. apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: testvm-dv spec: template: spec:

    ... volumes: - name: dvdisk dataVolume: name: dv-cirros ––––––––––––––– << имя DV # PVs NAME CAPACITY ACCESS MODES STATUS CLAIM pvc-..-4f918b1618a7 128Mi RWO Bound default/dv-cirros Подключение Data Volumes (DV) к VM
  24. Используется Kubernetes Scheduler • requests • nodeSelector • affinity and

    anti-affinity • taints and tolerations Можно задать архитектуру, загрузчик (BIOS/UEFI), модель материнской платы, ЦП Есть поддержка NUMA, SRV-IOV, PCI-Passthrough (GPU, USB) 1 2 3 Что есть для управления ресурсами ВМ
  25. Как ограничить использование ВМ? 1. RBAC 2. NetworkPolicy 3. Webhooks

    (admission/mutation) Через стандартные механизмы Kubernetes: Client VM Kube-API
  26. Мониторинг 1. метрики формата Prometheus 2. есть grafana dashboard: –

    cpu – memory – io – network 3. есть runbooks по алертам 4. node-exporter внутри ВМ
  27. Логирование 1. Логи ВМ не получить через kubectl logs 2.

    Но можно через fluent-bit из journald или файла логов
  28. Трассировка и Istio Есть, при использовании сети pod’ов (pod network

    masquerade) apiVersion: kubevirt.io/v1 kind: VirtualMachineInstance metadata: annotations: sidecar.istio.io/inject: "true"
  29. KubeVirt • Виртуалки и контейнеры вместе • Эффективная утилизация ресурсов

    • Поддержка со стороны сообщества • Отказоустойчивость из коробки Достоинства:
  30. KubeVirt • Виртуалки и контейнеры вместе • Эффективная утилизация ресурсов

    • Поддержка со стороны сообщества • Отказоустойчивость из коробки Достоинства: • Документация оставляет желать лучшего • Поведение при больших нагрузках неизвестно • Нужен Kubernetes Недостатки: