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

Модуль 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: v1
kind: Pod
metadata:
name: my-pod # Ім'я Пода
labels: # Мітки для вибору
app: web
spec:
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 створює новий │
│ • Легке масштабування (replicas: 3) │
│ • Послідовні оновлення │
│ │
│ Правило: │
│ ───────────────────────────────────────────────────────── │
│ Майже НІКОЛИ не створюйте Поди напряму │
│ Використовуйте Deployments, Jobs, DaemonSets │
│ │
└─────────────────────────────────────────────────────────────┘

  • Поди ефемерні - Вони створені, щоб бути одноразовими. Коли Под падає, він зникає назавжди (навіть з тим самим ім’ям це новий Под).

  • Контейнер pause - Кожен Под має прихований контейнер “pause”, який тримає мережеві простори імен. Контейнери застосунків приєднуються до його простору імен.

  • IP Пода внутрішня - IP Подів маршрутизується тільки всередині кластера. Ви не можете дістатися до них ззовні без Service.

  • Поди мають унікальні імена - У просторі імен імена Подів повинні бути унікальними. Deployments додають випадкові суфікси (напр., nginx-7b8d6c-xk4dz).


ПомилкаЧому це шкодитьПравильне розуміння
”Под = Контейнер”Втрачено абстракцію ПодаПод містить контейнер(и)
“Поди мають кілька IP”Нерозуміння мережіОдна IP на Под, спільна для контейнерів
”Створювати Поди напряму”Немає відмовостійкостіВикористовуйте Deployments
”Поди зберігаються після видалення”Ставитеся як до ВМПоди ефемерні

  1. Яка найменша одиниця розгортання в Kubernetes?

    Відповідь Под. Не контейнер — Kubernetes планує та керує Подами, а не контейнерами безпосередньо.
  2. Скільки IP-адрес отримує Под?

    Відповідь Одну. Всі контейнери в Поді спільно використовують одну IP-адресу та можуть комунікувати через localhost.
  3. Що спільно використовують контейнери в одному Поді?

    Відповідь Мережевий простір імен (одна IP, можуть використовувати localhost), томи сховища та простір імен IPC. Вони НЕ спільно використовують файлову систему, якщо не через томи.
  4. Що таке патерн sidecar?

    Відповідь Патерн Пода з кількома контейнерами, де допоміжний контейнер працює поруч з основним контейнером застосунку для забезпечення допоміжної функціональності (логування, моніторинг, проксіювання).
  5. Чому не слід створювати Поди напряму?

    Відповідь Поди ефемерні — якщо вони падають, вони зникають. Deployments керують Подами та забезпечують, що бажана кількість завжди існує, надаючи відмовостійкість, масштабування та послідовні оновлення.

Поди — це:

  • Найменша одиниця розгортання
  • Один або більше контейнерів
  • Спільна мережа (одна IP)
  • Спільне сховище (томи)

Ключові характеристики:

  • Кожен Под має унікальну IP
  • Контейнери комунікують через localhost
  • Поди ефемерні (не постійні)
  • Зазвичай керуються Deployments

Патерни кількох контейнерів:

  • Sidecar (помічник поруч з основним)
  • Ambassador (проксі для вихідного трафіку)
  • Adapter (конвертація формату)

Модуль 1.6: Ресурси навантажень - Deployments, ReplicaSets та інші контролери, що керують Подами.