<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Инфраструктурный блог</title><link>https://prudnitskiy.pro/</link><description>Recent blog posts on Инфраструктурный блог</description><generator>Hugo (https://gohugo.io)</generator><language>ru-ru</language><managingEditor/><webMaster/><lastBuildDate>Mon, 14 Sep 2026 11:00:00 Z</lastBuildDate><atom:link href="https://prudnitskiy.pro/ru/tags/docker/index.xml" rel="self" type="application/rss+xml"/><item><title>Надежная изоляция в Docker с использованием Kata и MicroVM</title><link>https://prudnitskiy.pro/ru/post/2026-09-14-kata-docker/</link><pubDate>Mon, 14 Sep 2026 11:00:00 Z</pubDate><author/><description>
Контейнеры (и в частности docker) сейчас практически основа современной доставки ПО в инфраструктуру. Если верить опросам Docker (он предвзят, но я не нашел цифр лучше) &amp;amp;ndash; 92% разработчиков использует контейнеры в той или иной форме. Контейнеры невероятно удобны &amp;amp;ndash; это герметичные образы, которые все свое возят с собой. Их не нужно устанавливать и почти не нужно настраивать, у них нет зависимостей (и проблем с конфликтами зависимостей). Выгрузка таких контейнеров в любую инфраструктуру элементарна, скачал и запустил. Контейнер иммутабелен, у него нет своего состояния и потому не бывает проблем, связанных с потерей состояния. Контейнер изолирован &amp;amp;ndash; все, что живет внутри &amp;amp;ndash; живет внутри. Не бывает конфликта PID/имен процессов/блокировок в файловой системе/сокетов или портов. Контейнеру можно ограничить ресурсы на уровне ОС и он никогда за пределы этих ресурсов не выйдет. Это делает управление ресурсами в общем делом тривиальным &amp;amp;ndash; контейнеры можно паковать в сервер как коробки в кладовку, выбирая профиль нагрузки и under/overcommitement по своему вкусу. Накладные расходы на контейнер минимальны и почти незаметны, с точки зрения операционной системы контейнер &amp;amp;ndash; это просто процесс и немного магии ядра для ограничения ресурсов. Контейнер стартует так же быстро, как обычный процесс (ведь по сути это и есть процесс). Контейнер безопасен &amp;amp;ndash; процесс, живущий внутри, наружу выберется только через явно разрешенные интерфейсы &amp;amp;ndash; сетевые или файловую систему. Или нет?</description><content:encoded>&lt;p&gt;Контейнеры (и в частности docker) сейчас практически основа современной доставки ПО в инфраструктуру. Если верить опросам Docker (он предвзят, но я не нашел цифр лучше) &amp;ndash; 92% разработчиков использует контейнеры в той или иной форме. Контейнеры невероятно удобны &amp;ndash; это герметичные образы, которые все свое возят с собой. Их не нужно устанавливать и почти не нужно настраивать, у них нет зависимостей (и проблем с конфликтами зависимостей). Выгрузка таких контейнеров в любую инфраструктуру элементарна, скачал и запустил. Контейнер иммутабелен, у него нет своего состояния и потому не бывает проблем, связанных с потерей состояния. Контейнер изолирован &amp;ndash; все, что живет внутри &amp;ndash; живет внутри. Не бывает конфликта PID/имен процессов/блокировок в файловой системе/сокетов или портов. Контейнеру можно ограничить ресурсы на уровне ОС и он никогда за пределы этих ресурсов не выйдет. Это делает управление ресурсами в общем делом тривиальным &amp;ndash; контейнеры можно паковать в сервер как коробки в кладовку, выбирая профиль нагрузки и under/overcommitement по своему вкусу. Накладные расходы на контейнер минимальны и почти незаметны, с точки зрения операционной системы контейнер &amp;ndash; это просто процесс и немного магии ядра для ограничения ресурсов. Контейнер стартует так же быстро, как обычный процесс (ведь по сути это и есть процесс). Контейнер безопасен &amp;ndash; процесс, живущий внутри, наружу выберется только через явно разрешенные интерфейсы &amp;ndash; сетевые или файловую систему. Или нет?&lt;/p&gt;
&lt;p&gt;Спойлер: Нет&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h1 id="проблема" &gt;
&lt;div&gt;
&lt;a href="#%d0%bf%d1%80%d0%be%d0%b1%d0%bb%d0%b5%d0%bc%d0%b0"&gt;
##
&lt;/a&gt;
Проблема
&lt;/div&gt;
&lt;/h1&gt;
&lt;p&gt;Контейнер по умолчанию счиатется изолированым и зрительно он хорошо изображает изоляцию процесса. Хост видит всю внутрянку контейнера (дерево процессов, ресурсы, планировщик), но процессы изнутри контейнера видят только сам контейнер. В списке процессов будут только процессы самого контейнера, файловая система будет только своя (файловая система хоста доступна только если подключить ее явно, например, для сохранения состояния между перезапусками или пересозданиями контейнера). Попытка выскочить за пределы ограничений ресурсов кончится или OOM, который прибьет процесс-нарушитель (для памяти) или троттлингом (если это CPU). Управление тем, что процесс видит сделано через ядерный механизм Namespaces, а ограничение ресурсов выполнено через CGroups. Эти механизмы работают на уровне самого ядра и в целом так же надежны, как само ядро. Вот только ядро не абсолютно надежно. Даже изоляция &amp;ldquo;не настоящая&amp;rdquo; &amp;ndash; это просто набор трюков ядра, который позволяет спрятать одни процессы от других, хотя система у них общая и ядро тоже общее. Для linux containers (упрощенно говоря &amp;ndash; для docker, хотя их целое семейство с единым протоколом) есть целый набор трюков разной степени хитрости, чтобы из контейнера убежать. Привелигированный контейнер позволяет выскочить из изоляции одной командой (&lt;strong&gt;никогда&lt;/strong&gt; не используйте &lt;code&gt;--priveleged&lt;/code&gt;). Неправильно ограниченый набор доступных системных вызовов (&lt;code&gt;capabilities&lt;/code&gt;) тоже открывает широкий простор для злоупотреблений. Попавшая внутрь контейнера devfs &amp;ndash; это еще один способ вылезти из контейнера, потому что &lt;code&gt;/dev&lt;/code&gt; общий для всего ядра и через него можно увидеть пространства имен других конейтенров (и через нее же убежать). Немалое количество атак на повышение привилегий в ядре срабатывают из контейнера тоже (и позволяют выскочить в хост-систему). Кроме того, есть атаки на конкретно побег из контейнера в хост. Так как контейнер использует то же ядро, что и хост &amp;ndash; у контейнера общий с хостом набор API для взаимодействия с ядром. Чем больше точек взаимодействия у атакующего &amp;ndash; тем проще найти уязвимость и использовать ее для побега и захвата целевой системы. Так как контейнер взаимодействует с ядром через все те же системные вызовы &amp;ndash; есть попытки улучшить безопасность контейнеров через фильтрацию этих системных вызовов. Один из таких проектов придумали в google, называется он gVisor. gVisor следит за тем, какие именно системные вызовы процесс внутри контейнера пытается использовать и отклоняет потенциально небезопасные вызовы. Настраивать его очень непросто, потому что если вы где-то ошибетесь в настройках &amp;ndash; процесс просто молча схлопнется и контейнер перезапустится. Причем контейнер может работать месяцами, а потом сработает конкретный syscall и хлопнет вам процесс. Отладка такого блуждающего бага &amp;ndash; удовольствие на больших любителей.&lt;/p&gt;
&lt;p&gt;Процессы можно изолировать надежно и безопасно, причем этой технологии лет даже больше, чем контейнерам. И называется эта технология полной виртуализацией. Виртуальная машина максимально изолирована от физической машины, на которой она запущена. У нее полностью свое ядро, свой набор процессов, изолированный сегмент оперативной памяти. Даже переферию можно сделать свою. Степень изоляции на уровне банковского сейфа. Количество атак на гипервизор (систему управления виртуальными машинами) изнутри самой виртуалки можно пересчитать буквально по пальцам одной руки. Например, автору известно 2 атаки на гипервизоры от VMWare, 3 на KVM и 2 на QEMU. Не за год, вообще. Плюс 3 атаки, специфичных для реализации железа (они не зависят от модели виртуальной машины, но зависят от типа и модели CPU или контроллера памяти). Такие атаки &amp;ndash; огромная редкость, встречаются они раз в десятилетие и каждый раз производят эффект взорвавшейся бомбы. То есть их практически мгновенно чинят и виртуализация снова становится безопасной. Виртуальная машина кажется идеальным решением проблемы изоляции &amp;ndash; у нее минимум общих мест с хост-системой, максимально независимые ресурсы и стопроцентная изоляция. К сожалению &amp;ndash; минусы тоже есть. Виртуальные машины медленные. Старт полноценной ОС занимает несколько минут (это полноценная инициализация оборудования и после этого &amp;ndash; создание дерева процессов для полноразмерного сервера).&lt;/p&gt;
&lt;p&gt;Вторая проблема виртуальных машин - это их состояние. Внутри виртуальной машины живет полноценная операционная система, безо всяких скидок. Эту операционную систему нужно установить и настроить, а потом &amp;ndash; обновлять и поддерживать. С точки зрения поддержки и управления безопасностью виртуальная машина почти не отличается от физического сервера. Это огромные накладные расходы, особенно когда у вас таких машин сотни, а то и тысячи. Контейнер легковесный, он создает &lt;em&gt;один&lt;/em&gt; целевой процесс, в этом основа контейнерного дизайна. У контейнера нет состояния, его не нужно обновлять и поддерживать в актуальном состоянии, потому что его состояние &amp;ldquo;запекается&amp;rdquo; в момент создания. Тяжелая и неповоротливая ОС общего назначения совсем не похожа на легковесный процесс внутри контейнера.&lt;/p&gt;
&lt;h1 id="решение-micro-vm" &gt;
&lt;div&gt;
&lt;a href="#%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%b8%d0%b5-micro-vm"&gt;
##
&lt;/a&gt;
Решение: micro-vm
&lt;/div&gt;
&lt;/h1&gt;
&lt;p&gt;Проблема &amp;ldquo;сделать быстро, как контейнер, но безопасно, как VM&amp;rdquo; известна многим вендорам и известна давно. Google и RedHat пытались решить эту проблему через более жесткие ограничения для процессов (с помощью gVisor и SELinux соответственно). Amazon, Intel, nVidia и некоторые другие компании пошли по иному пути. Если VM достаточно надежна и безопасна, просто прожорлива &amp;ndash; почему бы не сделать очень компактную VM, приспособленную для единственной цели? Так появились MicroVM. Идея в том, что из таких VM выкинуто все &amp;ldquo;лишнее&amp;rdquo;, не нужное для запуска контейнеров. Например, там нет полноценного экрана, только символьный терминал. Виртуальная клавиатура там имеет ровно одну кнопку (на случай, если потребуется press any key). Эмуляция и нестандартные архитектуры обычно не поддерживаются &amp;ndash; только нативная виртуализация. Такая микро-машина поддерживает только одну ОС (Linux), и Linux этот тоже обезжирен до предела. Благодаря такой агрессивной оптимизации microVM стартует практически мгновенно, считанные секунды (сравните с минутами, а то и десятками минут для нормальных ОС). MicroVM компактны и имеют минимальные накладные расходы по ресурсам. Это позволяет получить &amp;ldquo;лучшее из двух миров&amp;rdquo; &amp;ndash; скорость, удобство и поддержку контейнеров и безопасность вирутальных машин. MicroVM бесшовно интегрируется в container runtime и с точки зрения пользователя ничем от обычного контейнера не отличается. Можно использовать все тот же &lt;code&gt;podman run&lt;/code&gt; или &lt;code&gt;docker-compose up&lt;/code&gt;, образы контейнеров будут работать так же, как раньше. Просто теперь &amp;ndash; внутри виртуальных машин. Kata-containers &amp;ndash; один из вариантов таких виртуальных машин.&lt;/p&gt;
&lt;h2 id="ограничения" &gt;
&lt;div&gt;
&lt;a href="#%d0%be%d0%b3%d1%80%d0%b0%d0%bd%d0%b8%d1%87%d0%b5%d0%bd%d0%b8%d1%8f"&gt;
#
&lt;/a&gt;
Ограничения
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Kata-containers &amp;ndash; это полноценная виртуализация, хотя и притворяется контейнером. Kata-containers требует поддержки виртуализации на стороне процессора (инструкций VMX/SVM для x86, ARM поддерживает виртуализацию начиная с ARMv8). В облаке или виртуальной машине у вас должна быть включена вложенная виртуализация (Nested Virtualisation, не все провайдеры облаков ее предоставляют и не для всех типов машин). Эмуляция и кросс-архитектурный запуск не поддерживаются. Так как kata - виртуальная машина, внутренностей контейнера-гостя из хоста доступно не будет, с точки зрения ОС это будет один процесс монолитный процесс. Это не слишком удобно, но расплата за безопасную изоляцию.&lt;/p&gt;
&lt;h2 id="kata-внутри-docker" &gt;
&lt;div&gt;
&lt;a href="#kata-%d0%b2%d0%bd%d1%83%d1%82%d1%80%d0%b8-docker"&gt;
#
&lt;/a&gt;
Kata внутри Docker
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Kata-containers изначально придуманы для работы внутри Kubernetes. Штатный способ установки &amp;ndash; helm-chart и &lt;code&gt;DaemonSet&lt;/code&gt;, который все и ставит. Это очень удобно, но не получится повторить для одиночного Docker, да и такая сложная установка избыточна для простого одиночного хоста. Можно, конечно, поставить одиночный kubernetes из одного хоста (k3s или k0s прекрасно для этого подойдет), но я предпочитаю простые решения. Kata-containers распространяется как готовый набор статических бинарных файлов и подключается к docker как container runtime. Я человек очень ленивый и набросал простенький runbook для Ansible, который скачивает и распаковывает для меня эти файлы:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#ca9ee6"&gt;name&lt;/span&gt;: install Kata Containers (new ver)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;hosts&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - your.host.address
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;vars&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;kata_version&lt;/span&gt;: &lt;span style="color:#a6d189"&gt;&amp;#34;3.32.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;kata_prefix&lt;/span&gt;: &lt;span style="color:#a6d189"&gt;&amp;#34;/var/lib/kata/{{ kata_version }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;arch_map&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;x86_64&lt;/span&gt;: &lt;span style="color:#a6d189"&gt;&amp;#34;amd64&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;aarch64&lt;/span&gt;: &lt;span style="color:#a6d189"&gt;&amp;#34;arm64&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;armv7l&lt;/span&gt;: &lt;span style="color:#a6d189"&gt;&amp;#34;armhf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;tasks&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ca9ee6"&gt;name&lt;/span&gt;: Set architecture variable
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;set_fact&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;arch&lt;/span&gt;: &lt;span style="color:#a6d189"&gt;&amp;#34;{{ arch_map[ansible_facts[&amp;#39;architecture&amp;#39;]] }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ca9ee6"&gt;name&lt;/span&gt;: Check if alredy downloaded
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;ansible.builtin.stat&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;path&lt;/span&gt;: &lt;span style="color:#a6d189"&gt;&amp;#34;{{ kata_prefix }}/kata/bin/kata-runtime&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;register&lt;/span&gt;: kata_file
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ca9ee6"&gt;name&lt;/span&gt;: Download kata release
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;get_url&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;url&lt;/span&gt;: &lt;span style="color:#a6d189"&gt;&amp;#34;https://github.com/kata-containers/kata-containers/releases/download/{{ kata_version }}/kata-static-{{ kata_version }}-{{ arch }}.tar.zst&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;dest&lt;/span&gt;: &lt;span style="color:#a6d189"&gt;&amp;#34;/{{ kata_prefix }}/kata-static-{{ kata_version }}-{{ arch }}.tar.zst&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;mode&lt;/span&gt;: &lt;span style="color:#a6d189"&gt;&amp;#39;0644&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;register&lt;/span&gt;: download_result
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;until&lt;/span&gt;: download_result is success
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;retries&lt;/span&gt;: &lt;span style="color:#ef9f76"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;delay&lt;/span&gt;: &lt;span style="color:#ef9f76"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;when&lt;/span&gt;: not kata_file.stat.exists
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ca9ee6"&gt;name&lt;/span&gt;: create version folder
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;ansible.builtin.file&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;path&lt;/span&gt;: &lt;span style="color:#a6d189"&gt;&amp;#34;{{ kata_prefix }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;state&lt;/span&gt;: directory
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ca9ee6"&gt;name&lt;/span&gt;: Extract kata release
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;unarchive&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;src&lt;/span&gt;: &lt;span style="color:#a6d189"&gt;&amp;#34;/{{ kata_prefix }}/kata-static-{{ kata_version }}-{{ arch }}.tar.zst&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;dest&lt;/span&gt;: &lt;span style="color:#a6d189"&gt;&amp;#34;{{ kata_prefix }}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;remote_src&lt;/span&gt;: &lt;span style="color:#ef9f76"&gt;yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;mode&lt;/span&gt;: &lt;span style="color:#a6d189"&gt;&amp;#39;0755&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;creates&lt;/span&gt;: &lt;span style="color:#a6d189"&gt;&amp;#34;{{ kata_prefix }}/kata/bin/kata-runtime&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;extra_opts&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#a6d189"&gt;&amp;#34;--strip-components=2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ca9ee6"&gt;name&lt;/span&gt;: Remove kata archive file
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;ansible.builtin.file&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;path&lt;/span&gt;: &lt;span style="color:#a6d189"&gt;&amp;#34;/{{ kata_prefix }}/kata-static-{{ kata_version }}-{{ arch }}.tar.zst&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;state&lt;/span&gt;: absent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Этот runbook скачивает архив с github (для большей надежности добавлен retry, если github будет работать нестабильно, последнее время у него такое случается). Файл распаковывается в &lt;code&gt;{{ kata_prefix }}&lt;/code&gt;, по умолчанию - &lt;code&gt;/var/lib/kata/{{ kata_version }}&lt;/code&gt;. Этот трюк поможет бесшовно обновить kata-containers. Достаточно поменять версию в &lt;code&gt;{{ kata_version }}&lt;/code&gt;, перезапустить runbook, поменять путь в docker-config (см ниже) и перегрузить docker service. При перезапуске контейнера он будет использовать обновленную версию runtime и можно делать это контейнер за контейнером.&lt;/p&gt;
&lt;p&gt;После установки runtime нужно проверить, можно ли его использовать:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/var/lib/kata/3.32.0/kata/bin/kata-runtime check --verbose
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WARN&lt;span style="color:#99d1db;font-weight:bold"&gt;[&lt;/span&gt;0000&lt;span style="color:#99d1db;font-weight:bold"&gt;]&lt;/span&gt; Not running network checks as super user &lt;span style="color:#f2d5cf"&gt;arch&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;amd64 &lt;span style="color:#f2d5cf"&gt;name&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;kata-runtime &lt;span style="color:#f2d5cf"&gt;pid&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#ef9f76"&gt;21088&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;source&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;runtime
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO&lt;span style="color:#99d1db;font-weight:bold"&gt;[&lt;/span&gt;0000&lt;span style="color:#99d1db;font-weight:bold"&gt;]&lt;/span&gt; CPU property found &lt;span style="color:#f2d5cf"&gt;arch&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;amd64 &lt;span style="color:#f2d5cf"&gt;description&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6d189"&gt;&amp;#34;Intel Architecture CPU&amp;#34;&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;name&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;GenuineIntel &lt;span style="color:#f2d5cf"&gt;pid&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#ef9f76"&gt;21088&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;source&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;runtime &lt;span style="color:#f2d5cf"&gt;type&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;attribute
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO&lt;span style="color:#99d1db;font-weight:bold"&gt;[&lt;/span&gt;0000&lt;span style="color:#99d1db;font-weight:bold"&gt;]&lt;/span&gt; CPU property found &lt;span style="color:#f2d5cf"&gt;arch&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;amd64 &lt;span style="color:#f2d5cf"&gt;description&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6d189"&gt;&amp;#34;Virtualization support&amp;#34;&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;name&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;vmx &lt;span style="color:#f2d5cf"&gt;pid&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#ef9f76"&gt;21088&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;source&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;runtime &lt;span style="color:#f2d5cf"&gt;type&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;flag
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO&lt;span style="color:#99d1db;font-weight:bold"&gt;[&lt;/span&gt;0000&lt;span style="color:#99d1db;font-weight:bold"&gt;]&lt;/span&gt; CPU property found &lt;span style="color:#f2d5cf"&gt;arch&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;amd64 &lt;span style="color:#f2d5cf"&gt;description&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6d189"&gt;&amp;#34;64Bit CPU&amp;#34;&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;name&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;lm &lt;span style="color:#f2d5cf"&gt;pid&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#ef9f76"&gt;21088&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;source&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;runtime &lt;span style="color:#f2d5cf"&gt;type&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;flag
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO&lt;span style="color:#99d1db;font-weight:bold"&gt;[&lt;/span&gt;0000&lt;span style="color:#99d1db;font-weight:bold"&gt;]&lt;/span&gt; CPU property found &lt;span style="color:#f2d5cf"&gt;arch&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;amd64 &lt;span style="color:#f2d5cf"&gt;description&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;SSE4.1 &lt;span style="color:#f2d5cf"&gt;name&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;sse4_1 &lt;span style="color:#f2d5cf"&gt;pid&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#ef9f76"&gt;21088&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;source&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;runtime &lt;span style="color:#f2d5cf"&gt;type&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;flag
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO&lt;span style="color:#99d1db;font-weight:bold"&gt;[&lt;/span&gt;0000&lt;span style="color:#99d1db;font-weight:bold"&gt;]&lt;/span&gt; kernel property found &lt;span style="color:#f2d5cf"&gt;arch&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;amd64 &lt;span style="color:#f2d5cf"&gt;description&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6d189"&gt;&amp;#34;Host kernel accelerator for virtio network&amp;#34;&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;name&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;vhost_net &lt;span style="color:#f2d5cf"&gt;pid&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#ef9f76"&gt;21088&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;source&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;runtime &lt;span style="color:#f2d5cf"&gt;type&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;module
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO&lt;span style="color:#99d1db;font-weight:bold"&gt;[&lt;/span&gt;0000&lt;span style="color:#99d1db;font-weight:bold"&gt;]&lt;/span&gt; kernel property found &lt;span style="color:#f2d5cf"&gt;arch&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;amd64 &lt;span style="color:#f2d5cf"&gt;description&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6d189"&gt;&amp;#34;Host Support for Linux VM Sockets&amp;#34;&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;name&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;vhost_vsock &lt;span style="color:#f2d5cf"&gt;pid&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#ef9f76"&gt;21088&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;source&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;runtime &lt;span style="color:#f2d5cf"&gt;type&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;module
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO&lt;span style="color:#99d1db;font-weight:bold"&gt;[&lt;/span&gt;0000&lt;span style="color:#99d1db;font-weight:bold"&gt;]&lt;/span&gt; kernel property found &lt;span style="color:#f2d5cf"&gt;arch&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;amd64 &lt;span style="color:#f2d5cf"&gt;description&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6d189"&gt;&amp;#34;Intel KVM&amp;#34;&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;name&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;kvm_intel &lt;span style="color:#f2d5cf"&gt;pid&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#ef9f76"&gt;21088&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;source&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;runtime &lt;span style="color:#f2d5cf"&gt;type&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;module
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO&lt;span style="color:#99d1db;font-weight:bold"&gt;[&lt;/span&gt;0000&lt;span style="color:#99d1db;font-weight:bold"&gt;]&lt;/span&gt; kernel property found &lt;span style="color:#f2d5cf"&gt;arch&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;amd64 &lt;span style="color:#f2d5cf"&gt;description&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6d189"&gt;&amp;#34;Kernel-based Virtual Machine&amp;#34;&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;name&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;kvm &lt;span style="color:#f2d5cf"&gt;pid&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#ef9f76"&gt;21088&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;source&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;runtime &lt;span style="color:#f2d5cf"&gt;type&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;module
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO&lt;span style="color:#99d1db;font-weight:bold"&gt;[&lt;/span&gt;0000&lt;span style="color:#99d1db;font-weight:bold"&gt;]&lt;/span&gt; kernel property found &lt;span style="color:#f2d5cf"&gt;arch&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;amd64 &lt;span style="color:#f2d5cf"&gt;description&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#a6d189"&gt;&amp;#34;Host kernel accelerator for virtio&amp;#34;&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;name&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;vhost &lt;span style="color:#f2d5cf"&gt;pid&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#ef9f76"&gt;21088&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;source&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;runtime &lt;span style="color:#f2d5cf"&gt;type&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;module
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;System is capable of running Kata Containers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO&lt;span style="color:#99d1db;font-weight:bold"&gt;[&lt;/span&gt;0000&lt;span style="color:#99d1db;font-weight:bold"&gt;]&lt;/span&gt; device available &lt;span style="color:#f2d5cf"&gt;arch&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;amd64 check-type&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;full &lt;span style="color:#f2d5cf"&gt;device&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;/dev/kvm &lt;span style="color:#f2d5cf"&gt;name&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;kata-runtime &lt;span style="color:#f2d5cf"&gt;pid&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#ef9f76"&gt;21088&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;source&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;runtime
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO&lt;span style="color:#99d1db;font-weight:bold"&gt;[&lt;/span&gt;0000&lt;span style="color:#99d1db;font-weight:bold"&gt;]&lt;/span&gt; feature available &lt;span style="color:#f2d5cf"&gt;arch&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;amd64 check-type&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;full &lt;span style="color:#f2d5cf"&gt;feature&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;create-vm &lt;span style="color:#f2d5cf"&gt;name&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;kata-runtime &lt;span style="color:#f2d5cf"&gt;pid&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;&lt;span style="color:#ef9f76"&gt;21088&lt;/span&gt; &lt;span style="color:#f2d5cf"&gt;source&lt;/span&gt;&lt;span style="color:#99d1db;font-weight:bold"&gt;=&lt;/span&gt;runtime
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;System can currently create Kata Containers
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ядерный модуль KVM, который отвечает за поддержку виртуализации идет в комплекте с ОС и дополнительно ставить ничего не нужно, достаточно загрузить его командой &lt;code&gt;modprobe kvm&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Чтобы Docker мог использовать kata как runtime, ему нужно рассказать об этом рантайме. Пример конфигурационного файла &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;&amp;#34;log-driver&amp;#34;&lt;/span&gt;: &lt;span style="color:#a6d189"&gt;&amp;#34;local&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;&amp;#34;features&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;&amp;#34;time-namespaces&amp;#34;&lt;/span&gt;: &lt;span style="color:#ef9f76"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;&amp;#34;runtimes&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;&amp;#34;kata&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ca9ee6"&gt;&amp;#34;runtimeType&amp;#34;&lt;/span&gt;: &lt;span style="color:#a6d189"&gt;&amp;#34;/var/lib/kata/3.32.0/kata/bin/containerd-shim-kata-v2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;После перезапуска docker-daemon можно создать контейнер с использованием нового runtime: &lt;code&gt;docker run --runtime kata --rm nginx&lt;/code&gt;. В такой настройке runtime опциональный и позволит поэкспериментировать с kata, не ломая контейнеры, запущенные нормальным путем. Проверить работу проще всего, провалившись в контейнер и посмотрев на версию ядра, она у хоста и контейнера будет, очевидно, разной:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;host# uname -a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Linux host 6.1.0-49-amd64 &lt;span style="color:#737994;font-style:italic"&gt;#1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64 GNU/Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;guest# uname -a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Linux 01d00b2b5c9b 6.18.28 &lt;span style="color:#737994;font-style:italic"&gt;#1 SMP Mon May 18 17:38:40 UTC 2026 x86_64 Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Очень важно отключить фичу time-namespaces для kata runtime &amp;ndash; это новая фича docker engine и если этого не сделать &amp;ndash; контейнер упадет при запуске с невразумительной ошибкой. Еще одна проблема - DNS Resolving. Docker подставляет свой собственный резолвер внутрь контейнера на адресе 127.0.0.11 (этот адрес &amp;ldquo;не настоящий&amp;rdquo; и фактически запрос на него перенаправляется из контейнера в хост-систему). Это очень удобный фокус, потому что резолвер общий и сам docker добавляет туда имена всех контейнеров. Это позволяет общаться контейнерам по именам, без знания IP-адресов друг друга. К сожалению, в случае с Kata этот фокус работать не будет, потому что Kata полноценная виртуальная машина (просто маленькая) и localhost у нее свой. Авторы Kata не планируют решать эту проблему, потому что основная ЦА для Kata - Kubernetes, DNS resolving там решен на уровне кластера и трюки с подделкой localhost не требуются. Решений у этой проблемы три:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;просто игнорировать проблему. Ну нету DNS и нету. Если вашему контейнеру не надо ходить в сеть (или процесс, который ходит в сеть ходит туда сам и системный резолвинг не использует) &amp;ndash; вполне себе опция. Не стоит считать это защитой от побега из контейнера, но если никому не мешает &amp;ndash; чинить не нужно&lt;/li&gt;
&lt;li&gt;Использовать внешний резолвер, подменив &lt;code&gt;resolv.conf&lt;/code&gt; внутри контейнера. Подменять его в образе бессмысленно, потому что docker при старте контейнера подложит свой. Но можно просто подмонтировать внешний том (volume), примерно вот так:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#c6d0f5;background-color:#303446;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run --runtime kata --rm -ti --network host_service -v /etc/resolv.conf:/etc/resolv.conf:ro alpine
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Контейнер будет использовать тот же resolv.conf (и те же DNS-сервера) что и хост-система. Это позволит контейнеру попасть в интернет, но не поможет найти соседей&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Третий вариант &amp;ndash; использовать специализированный резолвер, запустив контейнер с ним на фиксированном адресе и передать адрес в &lt;code&gt;/etc/resolv.conf&lt;/code&gt; остальных контейнеров (помним про тягу docker крутить resolv когда не просят &amp;ndash; придется подготовить отдельный &lt;code&gt;resolv.conf&lt;/code&gt; для контейнеров и пробрасывать его внутрь всех контейнеров). CoreDNS, который используется в Kubernetes вполне подойдет. Проблема в том, что резолверу потребуется доступ к Docker API. У Docker API полностью отсутствует понятие раздельных прав доступа &amp;ndash; доступ к API дает доступ везде. Такой resolver полностью нивелирует ваши усилия по повышению безопасности всей инсталляции, потому что успешный взлом resolver-а дает взломщику &amp;ldquo;ключи от королевства&amp;rdquo;, включая выход в хост-систему. Я бы оставил такой вариант на самый крайний случай, если вам совсем уж некуда деваться.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kata-и-kubernetes" &gt;
&lt;div&gt;
&lt;a href="#kata-%d0%b8-kubernetes"&gt;
#
&lt;/a&gt;
Kata и Kubernetes
&lt;/div&gt;
&lt;/h2&gt;
&lt;p&gt;Kata создавалась с оглядкой на Kubernetes, так что интеграция совершенно бесшовная и проблем не вызывает. Kata-runtime устанавливается из helmChart &lt;code&gt;oci://ghcr.io/kata-containers/kata-deploy-charts&lt;/code&gt;, values.yaml подробно документирован. Kata использует довольно сложный chart с внутренней логикой (pre-hook, post-hook), по этому чарт &lt;strong&gt;нельзя&lt;/strong&gt; использовать с GitOps инструментами, такими как Flux или ArgoCD, даже Kustomize просто сломает чарт. Hook-и не являются частью шаблона, это логика, интерпретируемая Helm при установке. Вне helm они перестанут работать и установить ничего не получится. Все, что нужно сделать, чтобы контейнер использовал Kata как основной runtime - поменять runtimeClass (для Deployment он расположен по адресу &lt;code&gt;spec.template.spec.runtimeClassName&lt;/code&gt;) на &lt;code&gt;kata-qemu&lt;/code&gt;. По словам авторов Kata qemu &amp;ndash; основной runtime и поддерживается лучше всего (сейчас разработчики мигрируют на qemu-rs, реализации на rust). Остальные рантаймы экспериментальные и поддержка не гарантирована.&lt;/p&gt;
&lt;h1 id="выводы" &gt;
&lt;div&gt;
&lt;a href="#%d0%b2%d1%8b%d0%b2%d0%be%d0%b4%d1%8b"&gt;
##
&lt;/a&gt;
Выводы
&lt;/div&gt;
&lt;/h1&gt;
&lt;p&gt;Контейнеры сами по себе не очень безопасны и не должны использоваться как граница безопасности. Kata позволяет получть надежную изоляцию уровня виртуальной машины и удобство обычных контейнеров. Накладные расходы на виртуализацию минимальны, так что заменить обычный контейнер на microVM может быть вполне разумной идеей, если вам нужно более безопасная изоляция или больше контроля над ресурсами. Проблемы в работе KataVM встречаются, но они решаемы. MicroVM надежно изолирует внутренний мир контейнера от хоста и снижает шанс успешного побега. Нужно только помнить, что изоляция, даже самая лучшая не может быть единственной мерой безопасности в системе.&lt;/p&gt;</content:encoded><category>docker</category><category>security</category><guid isPermaLink="true">https://prudnitskiy.pro/ru/post/2026-09-14-kata-docker/</guid></item></channel></rss>