Перейти до вмісту

Модуль 2.1: Простори імен Linux (Namespaces)

Основи системи | Складність: [MEDIUM] | Час: 30–35 хв

Перед початком цього модуля:


Що ви зможете робити після цього модуля

Розділ «Що ви зможете робити після цього модуля»

Після проходження цього модуля ви зможете:

  • Пояснити, що таке Linux namespaces та як вони забезпечують ізоляцію контейнерів
  • Створити та інспектувати простори імен за допомогою unshare та nsenter
  • Відстежити, які namespaces використовує контейнер та чим вони відрізняються від хоста
  • Дебажити проблеми з мережею контейнерів, досліджуючи конфігурацію network namespace

Чому цей модуль важливий

Розділ «Чому цей модуль важливий»

Простори імен (Namespaces) — це фундамент ізоляції контейнерів. Коли ви запускаєте контейнер Docker або под Kubernetes, саме простори імен створюють ілюзію окремої системи.

Розуміння namespaces допоможе вам:

  • Налагодити мережу контейнерів — чому мій контейнер не бачить хост?
  • Зрозуміти ізоляцію подів — як контейнери в одному поді ділять ресурси?
  • Вирішувати конфлікти PID — чому контейнер бачить тільки свої процеси?
  • Впроваджувати безпеку — яка ізоляція насправді існує (і якої немає)?

Коли kubectl exec поводиться не так, як очікувалося, або контейнери “бачать” один одного там, де не повинні — вам потрібно розуміти namespaces.


  • Namespaces з’явилися задовго до Docker — перший простір імен (mount) був доданий у Linux ще у 2002 році. Docker (2013) просто зробив їх доступними через зручний інтерфейс.

  • Поди Kubernetes ділять простори імен — контейнери в одному поді за замовчуванням ділять мережевий (Network) та IPC простори імен. Саме тому вони можуть спілкуватися через localhost і ділити пам’ять.

  • User namespaces роблять можливими rootless-контейнери — відображаючи UID 0 (root) всередині контейнера на звичайного користувача зовні, ви можете запускати “root”-процеси без реальних прав суперкористувача на хості.

  • Існує 8 типів namespaces — Mount, UTS, IPC, PID, Network, User, Cgroup та Time. Кожен ізолює свій аспект системи.


Namespace (простір імен) огортає глобальний системний ресурс абстракцією, яка створює для процесів усередині простору ілюзію того, що вони мають власний ізольований екземпляр цього ресурсу.

┌────────────────────────────────────────────────────────────────┐
│ ХОСТ-СИСТЕМА │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Глобальний ресурс: Мережевий стек │ │
│ │ eth0 (192.168.1.100), таблиці маршрутизації │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────┴───────────────┐ │
│ ▼ ▼ │
│ ┌──────────────────────┐ ┌──────────────────────┐ │
│ │ Network Namespace 1 │ │ Network Namespace 2 │ │
│ │ eth0 (10.0.0.1) │ │ eth0 (10.0.0.2) │ │
│ │ Контейнер А │ │ Контейнер Б │ │
│ └──────────────────────┘ └──────────────────────┘ │
└────────────────────────────────────────────────────────────────┘

Кожен тип ізолює конкретний ресурс:

NamespaceЩо ізолюєПоява
Mount (mnt)Точки монтування файлової системи2002
UTSІм’я хоста та домен2006
IPCМіжпроцесна взаємодія (shared memory)2006
PIDІдентифікатори процесів2008
Network (net)Мережевий стек (IP, порти, маршрути)2009
UserID користувачів та груп2013
CgroupКореневу директорію cgroups2016
TimeСистемний годинник2020

Дозволяє процесам бачити власне дерево PID, де їхній головний процес має PID 1.

PID 1 (systemd) ─┬─ PID 100 (sshd)
├─ PID 200 (containerd)
└─ PID 300 (ваша_програма) ← бачить усі PID

Погляд з контейнера:

Розділ «Погляд з контейнера:»
PID 1 (ваша_програма) ← думає, що вона PID 1!
(не бачить процесів хоста)

Чому це важливо: Якщо PID 1 у просторі імен вмирає — ядро вбиває ВСІ інші процеси в цьому просторі. Саме тому контейнер зупиняється, коли завершується його основна програма.


Створює ізольований мережевий стек: інтерфейси, маршрутизацію, правила файрвола.

Кожен мережевий простір має свої:

  • Інтерфейси (eth0, lo тощо).
  • IP-адреси.
  • Таблиці маршрутизації.
  • Порти (кожен простір може мати свій власний порт :80).

Це дозволяє запускати десять вебсерверів на одному хості, і кожен буде думати, що він займає порт 80.


Mount Namespace (Файлова система)

Розділ «Mount Namespace (Файлова система)»

Ізолює точки монтування. Процеси в різних просторах бачать різні структури папок.

Це дозволяє контейнеру мати власну кореневу систему /, яка насправді є лише папкою десь на хості (використовуючи chroot та pivot_root).


Дозволяє відображати (map) UID/GID всередині контейнера на інші UID/GID зовні.

Без User Namespace:
Root (UID 0) в контейнері = Root (UID 0) на хості ← НЕБЕЗПЕЧНО!
З User Namespace:
Root (UID 0) в контейнері → UID 100000 на хості (звичайний юзер)

Це критично для безпеки: навіть якщо хакер “вистрибне” з контейнера, він опиниться на хості як безправний користувач.


  1. Яка головна мета просторів імен (namespaces) в Linux?

    Відповідь Забезпечення ізоляції ресурсів. Namespaces змушують групу процесів думати, що вони мають власні приватні ресурси (мережу, дерево процесів, ім'я хоста), які не бачать інші процеси в системі.
  2. Чому контейнери в одному поді Kubernetes можуть спілкуватися через localhost?

    Відповідь Тому що всі контейнери в одному поді ділять один і той самий Network Namespace. У них спільна IP-адреса і спільний простір портів.
  3. Що станеться, якщо основний процес контейнера (PID 1) завершиться?

    Відповідь Ядро Linux надішле сигнал завершення всім іншим процесам у цьому PID namespace, і контейнер перестане існувати.
  4. Який тип namespace дозволяє контейнеру мати власне ім’я хоста?

    Відповідь UTS namespace (Unix Timesharing System).

Завдання: Створити ізольований простір імен вручну.

  1. Створіть новий простір імен з власним ім’ям хоста:
    Terminal window
    sudo unshare --uts bash
  2. Змініть ім’я хоста всередині цього простору:
    Terminal window
    hostname dojo-isloated
    hostname
  3. Вийдіть із простору імен:
    Terminal window
    exit
  4. Перевірте ім’я хоста вашої реальної машини:
    Terminal window
    hostname
    (Воно не змінилося!)

Критерії успіху: Ви розумієте, як unshare створює ізоляцію “на льоту”.


  • Namespaces — це ілюзія окремої системи.
  • 8 типів ізолюють усе: від мережі до часу.
  • Контейнери = Процеси + Namespaces (ізоляція) + Cgroups (обмеження).
  • Поди K8s дозволяють контейнерам ділити певні простори імен для спільної роботи.

Далі: Модуль 2.2: Контрольні групи (cgroups) — дізнайтеся, як Linux обмежує ресурси (CPU, пам’ять) для контейнерів.