Какими средствами достигается виртуализация
Что проверяют
Понимаете ли вы, на каком уровне работает изоляция: где настоящий гипервизор с отдельным ядром, а где обычный процесс Linux, которому ограничили обзор и ресурсы. Go-разработчику следом почти всегда задают вопрос, чем контейнер отличается от виртуальной машины и как Go-сервис ведёт себя под лимитами CPU и памяти.
Как отвечать
Разложите ответ по уровням:
- аппаратная поддержка: расширения процессора Intel VT-x и AMD-V плюс вложенные таблицы страниц (EPT/NPT). Без них остаётся медленная программная эмуляция;
- гипервизор первого типа: работает прямо на железе или как часть ядра, например KVM, Xen, ESXi, Hyper-V. Каждая ВМ получает своё ядро и свою ОС;
- гипервизор второго типа: приложение поверх обычной ОС, например VirtualBox или VMware Workstation;
- паравиртуализация: гостевая ОС знает, что она в ВМ, и ходит к дискам и сети через драйверы
virtio, это быстрее эмуляции реального железа; - виртуализация на уровне ОС: контейнеры. Ядро одно на всех, изоляцию дают
namespaces(pid, net, mnt, user), ресурсы режутcgroups, файловую систему собирают слоями черезoverlayfs, системные вызовы фильтруетseccomp.
Хорошо связать это с Go: Docker, containerd, runc и Kubernetes написаны на Go, как и gVisor, который реализует ядро в пространстве пользователя. Отдельно скажите про рантайм: с Go 1.25 GOMAXPROCS по умолчанию учитывает лимит CPU из cgroup, раньше для этого подключали automaxprocs. Лимит памяти передают через GOMEMLIMIT, иначе сборщик мусора запускается слишком поздно и контейнер убивает OOM killer.
Где спотыкаются
Называют Kubernetes средством виртуализации. Это оркестратор: он раскладывает контейнеры по узлам, а изоляцию создают ядро и среда выполнения контейнеров.
Ставят JVM в один ряд с гипервизорами. Виртуальная машина языка исполняет байт-код и к изоляции ОС отношения не имеет, а Go её вовсе не использует: программа собирается в нативный бинарник под конкретную платформу.
Утверждают, что контейнер изолирован так же надёжно, как ВМ. Общее ядро означает, что уязвимость в нём затрагивает все контейнеры хоста, поэтому чужой код запускают в gVisor или в микроВМ вроде Firecracker.