Podʼи — найменші обчислювальні одиниці, які ви можете створити та керувати ними в Kubernetes.
Pod (ім. чол. рід; як у випадку з групою китів або гороховим стручком) — це група з одного або кількох контейнерів, які мають спільні ресурси зберігання та мережі, а також специфікацію щодо того, як запускати контейнери. Вміст Podʼа завжди розташований та запускається разом, та працює в спільному контексті. Pod моделює "логічний хост" для вашого застосунку: він містить один або кілька контейнерів застосунку, які мають відносно тісний звʼязок один з одним. По за контекстом хмар, застосунки, що виконуються на одному фізичному або віртуальному компʼютері, аналогічні застосункам, що виконуються на одному логічному хості.
Так само як і контейнери застосунків, Podʼи можуть містити контейнери ініціалізації, які запускаються під час старту Podʼа. Ви також можете впровадити тимчасові контейнери для налагодження, якщо ваш кластер це підтримує.
Спільний контекст Podʼа — це набір Linux-просторів імен, cgroups та, можливо, інших аспектів ізоляції — тих самих речей, що забезпечують ізоляцію контейнера. В межах контексту Podʼа окремі застосунки можуть мати додаткові рівні ізоляції.
Pod схожий на набір контейнерів із спільними просторами імен та спільними ресурсами файлових систем.
Podʼи в кластері Kubernetes використовуються двома основними способами:
Група кількох контейнерів, розміщених разом в одному Podʼі є відносно складним прикладом. Ви повинні використовувати цей шаблон тільки в конкретних випадках, коли ваші контейнери тісно повʼязані.
Для забезпечення реплікації (з метою підвищення відмовостійкості або розширення потужності) не потрібно запускати кілька контейнерів; якщо вам потрібно створити кілька реплік, див. Керування навантаженням.
Нижче наведено приклад Podʼа, який складається з контейнера, який запускає образ nginx:1.14.2.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Для створення Podʼа, показаного вище, виконайте наступну команду:
kubectl apply -f https://k8s.io/examples/pods/simple-pod.yaml
Як правило Podʼи не створюються напряму, навіть одиничні Podʼи. Замість цього, створюйте їх за допомогою ресурсів робочих навантажень. Дивіться Робота з Podʼами для отримання додаткової інформації про те, як Podʼи використовуються разом з ресурсами робочих навантажень.
Зазвичай у вас немає потреби у створенні окремих Podʼів напряму в Kubernetes, навіть одиничних Podʼів. Натомість створюйте їх за допомогою ресурсів робочих навантажень, таких як Deployment або Job. Якщо ваші Podʼи потребують відстеження стану, розгляньте використання ресурсу StatefulSet.
Кожен Pod призначений для запуску одного екземпляра застосунку. Якщо ви хочете масштабувати свій застосунок горизонтально (щоб надати більше ресурсів, запустивши більше екземплярів), вам слід використовувати кілька Podʼів, по одному для кожного екземпляра. У Kubernetes це зазвичай називається реплікацією. Репліковані Podʼи створюються та керуються як група ресурсів робочих навантажень разом з їх контролером.
Ознайомтесь з розділом Podʼи та контролери для отримання додаткової інформації про те, як Kubernetes використовує ресурси робочих навантажень та їх контролери для реалізації масштабування та автоматичного відновлення роботи застосунку.
Podʼи можуть надавати два види спільних ресурсів для своїх підпорядкованих контейнерів: мережу та зберігання.
Ви навряд чи створюватимете окремі Podʼи напряму в Kubernetes, навіть одиничні Podʼи. Це тому, що Podʼи спроєктовано бути відносно ефемерними, одноразовими обʼєктами, які можуть бути втрачені в будь-який момент. Коли Pod створено (чи це зроблено вами, чи це зроблено автоматично за допомогою контролера), новий Pod планується на виконання на вузлі вашого кластера. Pod залишається на цьому вузлі до тих пір, поки він не завершить роботу, або обʼєкт Pod буде видалено, Pod буде виселено за відсутності ресурсів, або вузол зазнав збою.
Назва Podʼа має бути дійсним DNS-піддоменом, але це може призвести до неочікуваних результатів для імені хосту Podʼа. Для найкращої сумісності, імʼя має відповідати більш обмеженим правилам для DNS-мітки.
Kubernetes v1.25 [stable]Ви маєте вказати значення поля .spec.os.name як linux або windows, щоб вказати ОС, на якій ви хочете запустити Pod. Ці дві ОС підтримуються Kubernetes. У майбутньому цей список може бути розширений.
У Kubernetes v1.36, значення .spec.os.name не впливає на те, як kube-scheduler вибирає вузол для запуску Podʼа. У будь-якому кластері, де для робочих вузлів використовується більше однієї операційної системи, слід правильно встановити мітку kubernetes.io/os на кожному вузлі та визначити Podʼи параметром nodeSelector, що базується на мітці операційної системи. Kube-scheduler призначає ваш Pod на вузол на основі інших критеріїв і може
успішно або невдало вибрати відповідне розміщення вузла, де ОС вузла підходить для контейнерів у цьому Podʼі. Стандарти безпеки Podʼів також використовують це поле, щоб уникнути застосування політик, які не є відповідними для цієї операційної системи.
Ви можете використовувати ресурси робочих навантажень для створення та керування Podʼами. Контролери ресурсів опікуються реплікацією та розгортанням Podʼів, а також автоматичним відновленням роботи застосунку в разі відмови. Наприклад, якщо Вузол впав, контролер помітить, що Pod на цьому вузлі перестав працювати, він створить заміну Podʼа. Планувальник поміщає Pod-заміну до нового працездатного вузла.
Ось кілька прикладів ресурсів робочих навантажень, які керують одним чи більше Podʼами:
Kubernetes v1.35 [alpha](стандартно вимкнено)Стандартно Kubernets планує кожний Pod окремо. Однак деякі тісно повʼязані застосунки потребують одночасного планування групи Podʼів для коректної роботи.
Ви можете повʼязати Pod з PodGroup за допомогою поля групи планування (spec.schedulingGroup). Це повідомляє kube-scheduler, що Pod належить до певної групи, що дозволяє застосовувати скоординовані рішення щодо розміщення на рівні групи для всієї групи одночасно.
Контролери ресурсів робочих навантажень створюють Pod з pod template та керують цим Podʼом від вашого імені.
PodTemplate — це специфікація для створення Podʼа, і вона включена в ресурси робочих навантажень, таких як Deployment, Job та DaemonSet.
Кожен контролер ресурсів робочих навантажень використовує PodTemplate всередині обʼєкта робочого навантаження для створення фактичних Podʼів. PodTemplate є частиною бажаного стану будь-якого ресурсу робочого навантаження, який ви використовуєте для запуску вашого застосунку.
Коли ви створюєте Pod, ви можете додати змінні оточення в шаблон Podʼа для контейнерів, які запускаються в Podʼі.
Приклад нижче — це маніфест простого Завдання (Job) з template, яке запускає один контейнер. Контейнер в цьому Podʼі виводить повідомлення, а потім призупиняється.
apiVersion: batch/v1
kind: Job
metadata:
name: hello
spec:
template:
# Це шаблон Podʼа
spec:
containers:
- name: hello
image: busybox:1.28
command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 3600']
restartPolicy: OnFailure
# Кінець шаблону Podʼа
Зміна template або перемикання на новий template не має прямого впливу на Podʼи, які вже існують. Якщо ви змінюєте template Podʼа для ресурсу робочого навантаження, цей ресурс має створити Pod-заміну, який використовує оновлений template.
Наприклад, контролер StatefulSet переконується, що запущені Podʼи відповідають поточному template для кожного обʼєкта StatefulSet. Якщо ви редагуєте StatefulSet, щоб змінити його template, StatefulSet починає створювати нові Podʼи на основі оновленого template. З часом всі старі Podʼи замінюються новими і оновлення завершується.
Кожен ресурс робочого навантаження реалізує власні правила для обробки змін у template Podʼа. Якщо ви хочете дізнатися більше про StatefulSet, прочитайте розділ Стратегія оновлення в посібнику Основи StatefulSet.
На вузлах kubelet безпосередньо не спостерігає та не керує жодними деталями щодо template Podʼа та оновлень; ці деталі абстраговані. Ця абстракція та розділення відповідальностей спрощує семантику системи та робить можливим розширення поведінки кластера без зміни наявного коду.
Як зазначено в попередньому розділі, коли template Podʼа для ресурсу робочого навантаження змінюється, контролер створює нові Podʼи на основі оновленого template замість оновлення або латання наявних Podʼів.
Kubernetes не забороняє вам керувати Podʼами напряму. Ви можете оновлювати деякі поля запущеного Podʼа, на місці. Однак операції оновлення Podʼа, такі як patch та replace, мають деякі обмеження:
namespace, name, uid або creationTimestamp.metadata.deletionTimestamp встановлено, новий запис не може бути доданий до списку metadata.finalizers.spec.containers[*].image, spec.initContainers[*].image, spec.activeDeadlineSeconds, spec.terminationGracePeriodSeconds, spec.tolerations or spec.schedulingGates. Для spec.tolerations ви можете додавати лише нові записи.spec.activeDeadlineSeconds, дозволені два типи оновлень:Наведені вище правила оновлення застосовуються до регулярних оновлень подів, але інші поля пода можуть бути оновлені за допомогою субресурсів.
resize дозволяє оновлювати ресурси контейнерів (spec.containers[*].resources). Дивіться Зміна розміру ресурсів контейнера для більш детальної інформації.ephemeralContainers дозволяє додавати ефемерні контейнери до Podʼа. Дивіться Ефемерні контейнери для більш детальної інформації.status дозволяє оновити статус контейнера. Зазвичай він використовується лише Kubelet та іншими системними контролерами.binding дозволяє встановити spec.nodeName Podʼів за допомогою запиту Binding. Зазвичай це використовується лише scheduler.metadata.generation є унікальним. Воно автоматично встановлюється системою таким чином, що нові Podʼи мають значення metadata.generation, рівне 1, і кожне оновлення змінних полів у специфікації Podʼа збільшуватиме значення metadata.generation на 1.Kubernetes v1.35 [stable](стандартно увімкнено)observedGeneration — це поле, яке фіксується в розділі status обʼєкта Pod. Kubelet встановить status.observedGeneration для відстеження поточного статусу Podʼа. Поле status.observedGeneration Podʼа відображатиме metadata.generation Podʼа у момент коли повідомляється про статус Podʼа.status.observedGeneration керується kubelet, і зовнішні контролери не повинні змінювати це поле.Різні поля статусу можуть бути повʼязані або з metadata.generation поточного циклу синхронізації, або з metadata.generation попереднього циклу синхронізації. Ключова відмінність полягає в тому, чи зміна в spec відображається безпосередньо в status, чи є непрямим результатом поточного процесу.
Для полів статусу, де виділена специфікація безпосередньо відображається, observedGeneration буде повʼязане з поточним metadata.generation (Generation N).
Ця поведінка застосовується до:
Waiting.Для полів статусу, які є непрямим результатом виконання специфікації зі spec, observedGeneration буде повʼязано з metadata.generation попереднього циклу синхронізації (покоління N-1).
Ця поведінка застосовується до:
ContainerStatus.ImageID показує образ з попереднього покоління, поки новий образ не буде завантажено, а контейнер не буде оновлено.Podʼи дозволяють контейнерам спільно використовувати ресурси та спілкуватися один з одним.
Pod може мати набір спільних ресурсів зберігання. Всі контейнери в Podʼі можуть отримати доступ до спільних томів, що дозволяє цим контейнерам спільно використовувати дані. Також томи дозволяють постійним даним в Podʼі вижити в разі перезапуску одного з контейнерів. Дивіться розділ Зберігання для отримання додаткової інформації про те, як Kubernetes реалізує спільне зберігання та робить його доступним для Podʼів.
Кожному Podʼу присвоюється унікальна IP-адреса для кожного сімейства адрес. Кожен контейнер у Podʼі використовує спільний мережевий простір імен, що включає IP-адресу та мережеві порти. Всередині Podʼа (і тільки там) контейнери, що належать до Podʼа, можуть спілкуватися один з одним за допомогою localhost. Коли контейнери в Podʼа спілкуються з обʼєктами поза межами Podʼа, вони повинні координувати використання спільних мережевих ресурсів (таких як порти). Всередині Pod ʼа контейнери використовують спільну IP-адресу та простір портів і можуть знаходити один одного через localhost. Контейнери в Podʼі також можуть спілкуватися між собою, використовуючи стандартні засоби міжпроцесної комунікації, такі як семафори SystemV або спільну памʼять POSIX. Контейнери в різних Podʼах мають різні IP-адреси і не можуть спілкуватися за допомогою IPC на рівні ОС без спеціальної конфігурації. Контейнери, які хочуть взаємодіяти з контейнером, що працює в іншому Podʼі, можуть використовувати IP-мережу для спілкування.
Контейнери в межах Podʼа сприймають ім'я хоста системи як ім'я, що збігається з налаштованим name для Podʼа. Більше інформації про це можна знайти в розділі Мережі.
Щоб встановити обмеження безпеки для Podʼів і контейнерів, використовуйте поле securityContext у специфікації Podʼа. Це поле дає вам можливість детально контролювати, що може робити Pod або окремі контейнери. Докладнішу інформацію див. у розділі Розширена конфігурація Podʼа.
Для базової конфігурації безпеки слід дотримуватися Базового стандарту безпеки Podʼів та запускати контейнери з правами, відмінними від root. Ви можете налаштувати прості контексти безпеки:
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
containers:
- name: sec-ctx-demo
image: busybox
command: ["sh", "-c", "sleep 1h"]
Щоб дізнатися про розширені налаштування контексту безпеки, зокрема про можливості (capabilities), профілі seccomp та детальні параметри безпеки, перейдіть до розділу Концепції безпеки.
Коли ви визначаєте Pod, ви можете необовʼязково вказати, скільки кожного ресурсу потребує контейнер. Найпоширеніші ресурси для вказання — це CPU та памʼять (RAM).
Коли ви вказуєте запит ресурсу (request) для контейнерів у Podʼі, kube-scheduler використовує цю інформацію для визначення, на який вузол розмістити Pod. Коли ви вказуєте обмеження ресурсу (limit) для контейнера, kubelet забезпечує дотримання цих обмежень, щоб використання ресурсів запущеним контейнером не перевищувало встановлені ліміти.
Ліміти CPU забезпечуються шляхом обмеження доступу до CPU. Коли контейнер наближається до свого ліміту CPU, ядро обмежує його доступ до CPU. Ліміти памʼяті забезпечуються ядром за допомогою примусового завершення процесів через нестачу памʼяті (OOM), коли контейнер перевищує свій ліміт.
Детальнішу інформацію про одиниці ресурсів, механізми забезпечення дотримання обмежень та приклади конфігурації дивіться у розділі Управління ресурсами для Podʼів та контейнерів.
Kubernetes v1.22 [stable]Статичні Podʼи керуються безпосередньо демоном kubelet на конкретному вузлі, без спостереження з боку сервера API. У той час як більшість Podʼів керуються панеллю управління (наприклад, Deployment), для статичних Podʼів kubelet безпосередньо наглядає за кожним статичним Podʼом (та перезапускає його, якщо він падає).
Статичні Podʼи завжди привʼязані до одного Kubeletʼу на конкретному вузлі. Основне використання статичних Podʼів — це запуск самостійної панелі управління: іншими словами, використання kubelet для нагляду за окремими компонентами панелі управління.
За докладнішою інформацією звертайтесь до розділу Статичні Podʼи.
Podʼи спроєктовано для підтримки кількох взаємодіючих процесів (таких як контейнери), які утворюють єдиний обʼєкт сервісу. Контейнери в Podʼі автоматично спільно розміщуються та плануються на тому ж фізичному або віртуальному компʼютері в кластері. Контейнери можуть спільно використовувати ресурси та залежності, взаємодіяти між собою та координувати, коли та як вони завершують роботу.
Podʼи в Kubernetes можуть керувати одним або кількома контейнерами двома способами:
Наприклад, у вас може бути контейнер, який виконує функції вебсервера для файлів у спільному томі, та окремий sidecar контейнер, який оновлює ці файли з віддаленого джерела, як показано на малюнку:
Деякі Podʼи мають контейнери ініціалізації та контейнери застосунку. Типово, контейнери ініціалізації запускаються та завершують роботу перед тим, як почнуть працювати контейнери застосунку.
У вас також може бути sidecar контейнер, який виконує додаткові функції для контейнера застосунку, наприклад, реалізує сервісну мережу (service mesh).
Kubernetes v1.29 [beta]Типово увімкнена функціональна можливість SidecarContainers дозволяє вам вказати restartPolicy: Always для контейнерів ініціалізації. Встановлення політики перезапуску Always гарантує, що контейнери, там де ви встановили, будуть вважатися як sidecar та працювати протягом усього життєвого циклу Podʼа. Контейнери, які явно визначені як sidecar контейнери, стартують до запуску основного застосунку Podʼа та працюють допоки Pod не завершить роботу.
Проба — це діагностика, яку періодично виконує kubelet для контейнерів. Для виконання діагностики kubelet може використовувати різні дії:
ExecAction (виконується за допомогою рушія виконання контейнера)TCPSocketAction (перевіряється безпосередньо kubelet)HTTPGetAction (перевіряється безпосередньо kubelet)Ви можете дізнатися більше про перевірки в документації про життєвий цикл Podʼів
Дізнайтесь про життєвий цикл Podʼів.
Дізнайтесь про PodDisruptionBudget та як ви можете використовувати його для керування доступністю застосунку під час збоїв.
Pod є ресурсом найвищого рівня в Kubernetes REST API. Обʼєкт Pod детально описує його.
Допис в блозі The Distributed System Toolkit: Patterns for Composite Containers пояснює типові конфігурації Podʼів з більш ніж одним контейнером.
Дізнайтесь про Обмеження топології розміщення Podʼів
Прочитайте про Розширену конфігурацію Podʼів, щоб дізнатися про цю тему докладніше. На цій сторінці висвітлюються аспекти конфігурації Podʼів, що виходять за межі основних положень, зокрема:
Для розуміння контексту того, чому Kubernetes обгортає загальний API Pod іншими ресурсами (такими як StatefulSets або Deployments), ви можете прочитати про попередні роботи, включаючи: