Kubernetes v1.37: KubeletInUserNamespace (також відомий як Rootless mode) переходить в Beta

Kubernetes v1.37 переводить функціональну можливість KubeletInUserNamespace в бета. Коли ця функціональна можливість увімкнена, всі компоненти вузла (kubelet, CRI та OCI середовища виконання контейнерів, CNI втулки та kube-proxy) можуть працювати як non-root користувач на хості, використовуючи Linux user namespace (простір імен користувача). Цей підхід також відомий як rootless mode. Робота почалася як експеримент у 2018 році, і була обʼєднана в Kubernetes v1.22 (2021) як альфа-функція (Kubernetes Enhancement Proposal KEP-2033).

Цю функцію не слід плутати з user namespaces для Podʼів (hostUsers: false з функціональною можливістю UserNamespacesSupport, GA з v1.36), що розміщує Podʼи в user namespaces, але все ще запускає компоненти вузла як root. Ці дві функції не конфліктують. Крім того, їх можна поєднати для вкладення Kubernetes у Kubernetes без необхідності повного privileged: true.

Для чого запускати компоненти вузла в user namespace?

Тому що компоненти вузла історично мали вразливості прориву контейнера (container-breakout vulnerabilities), які могли скомпрометувати повні root привілеї на хості.

Приклади таких вразливостей включають:

  • CVE-2022-0811 («cr8escape»): CRI-O можна було спровокувати на встановлення довільних sysctl, таких як kernel.core_pattern, що призводило до довільного виконання коду як root на хості
  • CVE-2023-27561: runc можна було спровокувати на обхід маскованих шляхів контейнера через гонитву під час монтування тому, що викривало файли procfs хосту (регресія CVE-2019-19921)
  • CVE-2024-10220: kubelet можна було змусити виконувати довільні команди як root через томи gitRepo (gitRepo томи мали схожу вразливість, CVE-2018-11235, ще у 2018 році)
  • CVE-2025-31133: runc можна було спровокувати на bind-монтування контрольованих атакуючим шляхів та запис у файли procfs хосту, такі як /proc/sysrq-trigger та /proc/sys/kernel/core_pattern
  • CVE-2026-53488: containerd можна було спровокувати на виконання довільних команд на хості через підроблені мітки в образі контейнера

Запускаючи компоненти вузла в user namespace, потенційна шкода обмежується обліковим записом non-root користувача. Зокрема, атакуючий не може приховати своє втручання, модифікуючи ядро, завантажувач або прошивку.

Слід все ж зазначити, що user namespaces не ефективні для помʼякшення вразливостей у самому ядрі. User namespaces слід використовувати в поєднанні з традиційними заходами зміцнення безпеки, такими як seccomp для запобігання виклику контейнерами непотрібних системних викликів.

Випадки використання

  • Production кластери: помʼякшувати потенційні вразливості прориву контейнера.
  • Спільні машини (напр., HPC): користувачі можуть розгортати Kubernetes без запиту root-привілеїв у адміністратора машини і без ризику випадково пошкодити середовища інших користувачів.
  • Ноутбуки: запобігати випадковому пошкодженню локальним кластером конфігурації хост-системи, напр., правил iptables хосту, використовуваних для VPN.
  • AI sandbox: розробник Kubernetes-застосунків може створити спеціальний локальний обліковий запис користувача для запуску AI-агента для кодування та тестового Kubernetes-кластера. Ця установка корисна для запобігання пошкодженню хосту AI-агентом, коли його обдурюють шкідливою інформацією в Інтернеті.
  • Kubernetes-in-Kubernetes: вкладений кластер може запускатися всередині батьківського кластера як Pod з user namespace (hostUsers: false), ізолюючи робочі навантаження суворіше, ніж Kubernetes API namespaces.
  • Bootstrapping: тимчасовий непривілейований кластер може бути використаний для початкового розгортання реального кластера, напр., з Cluster API.

Як це працює?

Ядро Linux — user namespace відображає non-root користувача рівня хосту (напр., UID 1000) на користувача fake root всередині простору імен. Привілеї UID 0 обмежені внутрішньою частиною простору імен. Fake root достатній для більшості задач компонентів вузла: монтування томів, створення cgroups та налаштування мережевих просторів імен Podʼів. Він все ще йде з деякими застереженнями, які можуть ламати сумісність з певними CNI та CSI драйверами.

User namespace має бути створений поза Kubernetes. Наприклад, Rootless Docker можна використати для підготовки user namespace, в якому запускається Kubernetes.

Сама функціональна можливість KubeletInUserNamespace досить проста: по суті, вона просто дозволяє kubelet ігнорувати помилки дозволів, що виникають при встановленні деяких значень sysctl (напр., vm.overcommit_memory та kernel.panic) та при спостереженні за повідомленнями ядра через /dev/kmsg.

Дивіться Running Kubernetes Node Components as a Non-root User для додаткової інформації.

Що змінилося від Alpha до Beta?

  • Функціональна можливість KubeletInUserNamespace тепер стандартно увімкнена. Її увімкнення автоматично не розміщує kubelet у user namespace, тому нічого не змінюється для наявних «rootful» кластерів.
  • kubectl get nodes -o yaml тепер повідомляє, чи запущені вузли в user namespace через властивість runningInUserNamespace. Адміністратор кластера може використати цю властивість для встановлення міток або taints на вузлах, щоб уникнути планування робочих навантажень, що потребують реальних root привілеїв (напр., деякі інсталятори CNI втулків) на rootless вузлах.
  • Для власного CI/CD тестування Kubernetes, node conformance end-to-end тести тепер запускаються на rootless кластері (ci-kubernetes-e2e-kind-rootless).

Деякі повʼязані покращення також відбулися поза просуванням цієї функціональної можливості:

  • Linux kernel v6.3 (2023): додано підтримку idmapped tmpfs.
  • Kubernetes v1.33 (2025): функціональну можливість UserNamespacesSupport стандартно увімкнено, дозволяючи створювати Podʼи з user namespace (hostUsers: false) без додаткової конфігурації.
  • containerd v2.1 (2025): додано підтримку writable cgroups.

Завдяки цим покращенням, Kubernetes-кластер з KubeletInUserNamespace тепер також може бути вкладеним усередині Kubernetes Podʼа з hostUsers: false (UserNamespacesSupport).

Як це використовувати

kind

Найпростіший спосіб — використати kind (проєкт Kubernetes SIG Testing) для запуску Kubernetes-кластера в rootless Docker, rootless nerdctl або rootless Podman:

# Приклад з Docker
dockerd-rootless-setuptool.sh install
kind create cluster

Залежно від конфігурації хоста, вам може знадобитися додаткова конфігурація для systemd, модулів ядра, sysctl тощо.

Дивіться документацію Docker та документацію kind для додаткової інформації.

minikube

minikube (проєкт Kubernetes SIG Cluster Lifecycle) також підтримує запуск Kubernetes-кластера в rootless Docker або rootless Podman:

dockerd-rootless-setuptool.sh install
minikube start --driver=docker

Дивіться документацію minikube для додаткової інформації.

Usernetes

Usernetes (сторонній проєкт) є дистрибутивом rootless Kubernetes, що підтримується автором цієї статті. Проєкт почався у 2018 році, і саме звідси початково прийшла функціональна можливість KubeletInUserNamespace.

На відміну від kind та minikube, Usernetes підтримує створення кластера з кількома rootless вузлами Docker / Podman / nerdctl, зʼєднаними через VXLAN за допомогою Flannel CNI плагіна.

Usernetes також експериментально підтримує режим Kubernetes-in-Kubernetes.

k3s

k3s (проєкт CNCF Sandbox) також підтримує rootless mode. На відміну від kind, minikube та поточного покоління Usernetes, rootless k3s не покладається на зовнішнє середовище виконання контейнерів, таке як rootless Docker.

Що далі?

Залежно від відгуків та впровадження, проєкт Kubernetes планує просунути цю функцію до General Availability (GA) у майбутньому релізі. Якщо у вас є відгук щодо цієї функції, будь ласка, створіть тікет в репозиторії kubernetes/kubernetes.

Проєкт також обговорює кілька Kubernetes Enhancement Proposals, які можуть сприяти спрощенню Kubernetes-in-Kubernetes з цією функцією:

Як долучитися

Ми завжди вітаємо нових учасників. Якщо ви хочете приєднатися, ви можете приєднатися до Node Special Interest Group (SIG Node).

Якщо ви хочете поділитися відгуком, ви можете це зробити на нашому публічному Slack-каналі (відвідайте https://slack.k8s.io/ для запрошення, якщо потрібне).

Щира подяка всім, хто допоміг спроєктувати та реалізувати цю функцію, включно з (в алфавітному порядку):

Востаннє змінено September 22, 2026 at 2:07 PM PST: [uk] Ukrainian translation (all-in-one) (bf98050d8c)