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

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

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

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

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

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

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

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

Ruslan Gainanov

February 26, 2025
Tweet

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 Недостатки: