Модуль 2.1: Простори імен Linux (Namespaces)
Основи системи | Складність:
[MEDIUM]| Час: 30–35 хв
Передумови
Розділ «Передумови»Перед початком цього модуля:
- Обов’язково: Модуль 1.1: Архітектура ядра
- Обов’язково: Модуль 1.2: Процеси та systemd
- Бажано: Базове розуміння мережевих концепцій.
Що ви зможете робити після цього модуля
Розділ «Що ви зможете робити після цього модуля»Після проходження цього модуля ви зможете:
- Пояснити, що таке 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. Кожен ізолює свій аспект системи.
Що таке Namespaces?
Розділ «Що таке Namespaces?»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 |
| User | ID користувачів та груп | 2013 |
| Cgroup | Кореневу директорію cgroups | 2016 |
| Time | Системний годинник | 2020 |
PID Namespace (Процеси)
Розділ «PID Namespace (Процеси)»Дозволяє процесам бачити власне дерево PID, де їхній головний процес має PID 1.
Погляд з хоста:
Розділ «Погляд з хоста:»PID 1 (systemd) ─┬─ PID 100 (sshd) ├─ PID 200 (containerd) └─ PID 300 (ваша_програма) ← бачить усі PIDПогляд з контейнера:
Розділ «Погляд з контейнера:»PID 1 (ваша_програма) ← думає, що вона PID 1!(не бачить процесів хоста)Чому це важливо: Якщо PID 1 у просторі імен вмирає — ядро вбиває ВСІ інші процеси в цьому просторі. Саме тому контейнер зупиняється, коли завершується його основна програма.
Network Namespace (Мережа)
Розділ «Network Namespace (Мережа)»Створює ізольований мережевий стек: інтерфейси, маршрутизацію, правила файрвола.
Кожен мережевий простір має свої:
- Інтерфейси (eth0, lo тощо).
- IP-адреси.
- Таблиці маршрутизації.
- Порти (кожен простір може мати свій власний порт :80).
Це дозволяє запускати десять вебсерверів на одному хості, і кожен буде думати, що він займає порт 80.
Mount Namespace (Файлова система)
Розділ «Mount Namespace (Файлова система)»Ізолює точки монтування. Процеси в різних просторах бачать різні структури папок.
Це дозволяє контейнеру мати власну кореневу систему /, яка насправді є лише папкою десь на хості (використовуючи chroot та pivot_root).
User Namespace (Безпека)
Розділ «User Namespace (Безпека)»Дозволяє відображати (map) UID/GID всередині контейнера на інші UID/GID зовні.
Без User Namespace:Root (UID 0) в контейнері = Root (UID 0) на хості ← НЕБЕЗПЕЧНО!
З User Namespace:Root (UID 0) в контейнері → UID 100000 на хості (звичайний юзер)Це критично для безпеки: навіть якщо хакер “вистрибне” з контейнера, він опиниться на хості як безправний користувач.
Тест
Розділ «Тест»-
Яка головна мета просторів імен (namespaces) в Linux?
Відповідь
Забезпечення ізоляції ресурсів. Namespaces змушують групу процесів думати, що вони мають власні приватні ресурси (мережу, дерево процесів, ім'я хоста), які не бачать інші процеси в системі. -
Чому контейнери в одному поді Kubernetes можуть спілкуватися через localhost?
Відповідь
Тому що всі контейнери в одному поді ділять один і той самий Network Namespace. У них спільна IP-адреса і спільний простір портів. -
Що станеться, якщо основний процес контейнера (PID 1) завершиться?
Відповідь
Ядро Linux надішле сигнал завершення всім іншим процесам у цьому PID namespace, і контейнер перестане існувати. -
Який тип namespace дозволяє контейнеру мати власне ім’я хоста?
Відповідь
UTS namespace (Unix Timesharing System).
Практична вправа
Розділ «Практична вправа»Завдання: Створити ізольований простір імен вручну.
- Створіть новий простір імен з власним ім’ям хоста:
Terminal window sudo unshare --uts bash - Змініть ім’я хоста всередині цього простору:
Terminal window hostname dojo-isloatedhostname - Вийдіть із простору імен:
Terminal window exit - Перевірте ім’я хоста вашої реальної машини:
(Воно не змінилося!)
Terminal window hostname
Критерії успіху: Ви розумієте, як unshare створює ізоляцію “на льоту”.
Підсумок
Розділ «Підсумок»- Namespaces — це ілюзія окремої системи.
- 8 типів ізолюють усе: від мережі до часу.
- Контейнери = Процеси + Namespaces (ізоляція) + Cgroups (обмеження).
- Поди K8s дозволяють контейнерам ділити певні простори імен для спільної роботи.
Далі: Модуль 2.2: Контрольні групи (cgroups) — дізнайтеся, як Linux обмежує ресурси (CPU, пам’ять) для контейнерів.