Модуль 1.5: Поди
Складність:
[СЕРЕДНІЙ]- Основна концепція ресурсуЧас на виконання: 25-30 хвилин
Передумови: Модулі 1.1-1.4
Що ви зможете робити
Розділ «Що ви зможете робити»Після завершення цього модуля ви зможете:
- Пояснити що таке Pod та чому він є найменшою одиницею розгортання в Kubernetes
- Визначити коли використовувати шаблони Pod з одним контейнером або кількома контейнерами (sidecar, init)
- Порівняти фази життєвого циклу Pod та розуміти, що означає кожен статус
- Оцінити чи потребує даний сценарій окремий Pod чи ресурс навантаження вищого рівня
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»Под — це найфундаментальніша концепція в Kubernetes. Кожне навантаження працює у Поді. KCNA перевірятиме ваше розуміння того, що таке Поди, що вони містять та як працюють.
Що таке Под?
Розділ «Що таке Под?»Под — це найменша одиниця розгортання в Kubernetes:
┌─────────────────────────────────────────────────────────────┐│ ЩО ТАКЕ ПОД? │├─────────────────────────────────────────────────────────────┤│ ││ Под — це: ││ • Група з одного або більше контейнерів ││ • Атомарна одиниця планування ││ • Контейнери, що спільно використовують сховище та мережу ││ ││ ┌─────────────────────────────────────────────────────┐ ││ │ ПОД │ ││ │ ┌───────────────────────────────────────────────┐ │ ││ │ │ Спільний мережевий простір імен │ │ ││ │ │ • Всі контейнери мають одну IP │ │ ││ │ │ • Контейнери комунікують через localhost │ │ ││ │ └───────────────────────────────────────────────┘ │ ││ │ │ ││ │ ┌─────────────┐ ┌─────────────┐ │ ││ │ │ Контейнер 1 │ │ Контейнер 2 │ │ ││ │ │ (застос.) │ │ (sidecar) │ │ ││ │ └─────────────┘ └─────────────┘ │ ││ │ │ ││ │ ┌───────────────────────────────────────────────┐ │ ││ │ │ Спільне сховище (Volumes) │ │ ││ │ │ • Обидва контейнери мають доступ до файлів │ │ ││ │ └───────────────────────────────────────────────┘ │ ││ └─────────────────────────────────────────────────────┘ ││ │└─────────────────────────────────────────────────────────────┘Поди проти контейнерів
Розділ «Поди проти контейнерів»┌─────────────────────────────────────────────────────────────┐│ ПОД проти КОНТЕЙНЕРА │├─────────────────────────────────────────────────────────────┤│ ││ Контейнер: Под: ││ ───────────────────────────────────────────────────────── ││ • Один процес • Один або більше контейн. ││ • Концепція середовища вик. • Концепція Kubernetes ││ • Без спільного контексту • Спільна мережа/сховище ││ • Ізольований • Суміщений ││ ││ Аналогія: ││ ───────────────────────────────────────────────────────── ││ Контейнер = Людина ││ Под = Квартира, де люди живуть разом ││ ││ Люди в одній квартирі: ││ • Мають одну адресу (IP) ││ • Спільно використовують кухню та ванну (volumes) ││ • Можуть спілкуватися напряму (localhost) ││ │└─────────────────────────────────────────────────────────────┘Поди з одним контейнером
Розділ «Поди з одним контейнером»Більшість Подів мають лише один контейнер:
┌─────────────────────────────────────────────────────────────┐│ ПОД З ОДНИМ КОНТЕЙНЕРОМ │├─────────────────────────────────────────────────────────────┤│ ││ ┌─────────────────────────────────────────────────────┐ ││ │ ПОД │ ││ │ ┌─────────────────────────────────────────────┐ │ ││ │ │ Основний контейнер застосунку │ │ ││ │ │ (напр., nginx) │ │ ││ │ └─────────────────────────────────────────────┘ │ ││ └─────────────────────────────────────────────────────┘ ││ ││ Це найпоширеніший патерн: ││ • Один контейнер на Под ││ • Простий в керуванні ││ • Кожен Под запускає один екземпляр застосунку ││ ││ "Один-контейнер-на-Под" — стандартний варіант використання││ │└─────────────────────────────────────────────────────────────┘Поди з кількома контейнерами
Розділ «Поди з кількома контейнерами»Іноді потрібно кілька контейнерів в одному Поді:
┌─────────────────────────────────────────────────────────────┐│ ПАТЕРНИ КІЛЬКОХ КОНТЕЙНЕРІВ │├─────────────────────────────────────────────────────────────┤│ ││ ПАТЕРН SIDECAR ││ ───────────────────────────────────────────────────────── ││ ┌─────────────────────────────────────────────────────┐ ││ │ ПОД │ ││ │ ┌─────────────────┐ ┌─────────────────┐ │ ││ │ │ Основний застос.│ │ Збирач логів │ │ ││ │ │ (пише логи) │─→│ (читає логи) │ │ ││ │ └─────────────────┘ └─────────────────┘ │ ││ │ └────────────┘ │ ││ │ Спільний том │ ││ └─────────────────────────────────────────────────────┘ ││ Приклад: Основний застосунок + Fluentd sidecar для логів ││ ││ ПАТЕРН AMBASSADOR ││ ───────────────────────────────────────────────────────── ││ ┌─────────────────────────────────────────────────────┐ ││ │ ПОД │ ││ │ ┌─────────────────┐ ┌─────────────────┐ │ ││ │ │ Основний застос.│ │ Проксі │ │ ││ │ │ (localhost) │─→│ (вихідний) │─→ Зовнішній│ ││ │ └─────────────────┘ └─────────────────┘ │ ││ └─────────────────────────────────────────────────────┘ ││ Приклад: Застосунок + проксі Envoy для service mesh ││ ││ ПАТЕРН ADAPTER ││ ───────────────────────────────────────────────────────── ││ ┌─────────────────────────────────────────────────────┐ ││ │ ПОД │ ││ │ ┌─────────────────┐ ┌─────────────────┐ │ ││ │ │ Основний застос.│ │ Адаптер │ │ ││ │ │(власний формат) │─→│(стандарт. форм.)│─→ Монітор│ ││ │ └─────────────────┘ └─────────────────┘ │ ││ └─────────────────────────────────────────────────────┘ ││ Приклад: Застосунок + адаптер експортера Prometheus ││ │└─────────────────────────────────────────────────────────────┘Мережа Подів
Розділ «Мережа Подів»┌─────────────────────────────────────────────────────────────┐│ МЕРЕЖА ПОДІВ │├─────────────────────────────────────────────────────────────┤│ ││ Кожен Под отримує: ││ • Власну унікальну IP-адресу ││ • Може бути доступний безпосередньо іншим Подам ││ • Контейнери у Поді спільно використовують цю IP ││ ││ ┌─────────────────────────────────────────────────────┐ ││ │ ПОД (IP: 10.1.1.5) │ ││ │ ┌────────────┐ ┌────────────┐ │ ││ │ │Контейнер A │ │Контейнер B │ │ ││ │ │ Порт 80 │ │ Порт 8080 │ │ ││ │ └────────────┘ └────────────┘ │ ││ │ │ │ │ ││ │ └────────┬─────────┘ │ ││ │ │ │ ││ │ localhost:80 localhost:8080 │ ││ │ (всередині Пода) │ ││ └─────────────────────────────────────────────────────┘ ││ │ ││ 10.1.1.5:80 10.1.1.5:8080 ││ (ззовні Пода) ││ ││ Всередині Пода: Використовуйте localhost ││ Між Подами: Використовуйте IP Пода ││ │└─────────────────────────────────────────────────────────────┘Життєвий цикл Пода
Розділ «Життєвий цикл Пода»┌─────────────────────────────────────────────────────────────┐│ ФАЗИ ЖИТТЄВОГО ЦИКЛУ ПОДА │├─────────────────────────────────────────────────────────────┤│ ││ Pending ──────→ Running ──────→ Succeeded/Failed ││ ││ PENDING: ││ • Под прийнятий, але ще не працює ││ • Очікування планування ││ • Очікування завантаження образу ││ ││ RUNNING: ││ • Под прив'язаний до вузла ││ • Принаймні один контейнер працює ││ • Або запускається/перезапускається ││ ││ SUCCEEDED: ││ • Всі контейнери завершилися успішно ││ • Не буде перезапущений ││ • Типово для Jobs ││ ││ FAILED: ││ • Всі контейнери завершилися ││ • Принаймні один зазнав невдачі (ненульовий код виходу) ││ ││ UNKNOWN: ││ • Неможливо отримати стан Пода ││ • Зазвичай помилка комунікації ││ │└─────────────────────────────────────────────────────────────┘Специфікація Пода (Концептуально)
Розділ «Специфікація Пода (Концептуально)»Вам не потрібно запам’ятовувати YAML для KCNA, але розумійте, що містить Под:
# Специфікація Пода - Ключові частиниapiVersion: v1kind: Podmetadata: name: my-pod # Ім'я Пода labels: # Мітки для вибору app: webspec: containers: # Список контейнерів - name: app # Ім'я контейнера image: nginx:1.25 # Образ контейнера ports: # Відкриті порти - containerPort: 80 resources: # Обмеження ресурсів limits: memory: "128Mi" cpu: "500m" volumes: # Спільне сховище - name: data emptyDir: {}Ключові частини для розуміння:
- metadata: Ім’я та мітки
- spec.containers: Контейнери для запуску
- spec.volumes: Спільне сховище
Под проти Deployment
Розділ «Под проти Deployment»┌─────────────────────────────────────────────────────────────┐│ ПОД проти DEPLOYMENT │├─────────────────────────────────────────────────────────────┤│ ││ Створення Пода напряму: ││ • Под падає → Його немає ││ • Немає автоматичного перезапуску ││ • Немає масштабування ││ • Ручне керування ││ ││ Використання Deployment: ││ • Deployment керує Подами ││ • Под падає → Deployment створює новий ││ • Легке масштабування (replicas: 3) ││ • Послідовні оновлення ││ ││ Правило: ││ ───────────────────────────────────────────────────────── ││ Майже НІКОЛИ не створюйте Поди напряму ││ Використовуйте Deployments, Jobs, DaemonSets ││ │└─────────────────────────────────────────────────────────────┘Чи знали ви?
Розділ «Чи знали ви?»-
Поди ефемерні - Вони створені, щоб бути одноразовими. Коли Под падає, він зникає назавжди (навіть з тим самим ім’ям це новий Под).
-
Контейнер pause - Кожен Под має прихований контейнер “pause”, який тримає мережеві простори імен. Контейнери застосунків приєднуються до його простору імен.
-
IP Пода внутрішня - IP Подів маршрутизується тільки всередині кластера. Ви не можете дістатися до них ззовні без Service.
-
Поди мають унікальні імена - У просторі імен імена Подів повинні бути унікальними. Deployments додають випадкові суфікси (напр., nginx-7b8d6c-xk4dz).
Типові помилки
Розділ «Типові помилки»| Помилка | Чому це шкодить | Правильне розуміння |
|---|---|---|
| ”Под = Контейнер” | Втрачено абстракцію Пода | Под містить контейнер(и) |
| “Поди мають кілька IP” | Нерозуміння мережі | Одна IP на Под, спільна для контейнерів |
| ”Створювати Поди напряму” | Немає відмовостійкості | Використовуйте Deployments |
| ”Поди зберігаються після видалення” | Ставитеся як до ВМ | Поди ефемерні |
Вікторина
Розділ «Вікторина»-
Яка найменша одиниця розгортання в Kubernetes?
Відповідь
Под. Не контейнер — Kubernetes планує та керує Подами, а не контейнерами безпосередньо. -
Скільки IP-адрес отримує Под?
Відповідь
Одну. Всі контейнери в Поді спільно використовують одну IP-адресу та можуть комунікувати через localhost. -
Що спільно використовують контейнери в одному Поді?
Відповідь
Мережевий простір імен (одна IP, можуть використовувати localhost), томи сховища та простір імен IPC. Вони НЕ спільно використовують файлову систему, якщо не через томи. -
Що таке патерн sidecar?
Відповідь
Патерн Пода з кількома контейнерами, де допоміжний контейнер працює поруч з основним контейнером застосунку для забезпечення допоміжної функціональності (логування, моніторинг, проксіювання). -
Чому не слід створювати Поди напряму?
Відповідь
Поди ефемерні — якщо вони падають, вони зникають. Deployments керують Подами та забезпечують, що бажана кількість завжди існує, надаючи відмовостійкість, масштабування та послідовні оновлення.
Підсумок
Розділ «Підсумок»Поди — це:
- Найменша одиниця розгортання
- Один або більше контейнерів
- Спільна мережа (одна IP)
- Спільне сховище (томи)
Ключові характеристики:
- Кожен Под має унікальну IP
- Контейнери комунікують через localhost
- Поди ефемерні (не постійні)
- Зазвичай керуються Deployments
Патерни кількох контейнерів:
- Sidecar (помічник поруч з основним)
- Ambassador (проксі для вихідного трафіку)
- Adapter (конвертація формату)
Наступний модуль
Розділ «Наступний модуль»Модуль 1.6: Ресурси навантажень - Deployments, ReplicaSets та інші контролери, що керують Подами.