Podʼи
Podʼи — найменші обчислювальні одиниці, які ви можете створити та керувати ними в Kubernetes.
Pod (ім. чол. рід; як у випадку з групою китів або гороховим стручком) — це група з одного або кількох контейнерів, які мають спільні ресурси зберігання та мережі, а також специфікацію щодо того, як запускати контейнери. Вміст Podʼа завжди розташований та запускається разом, та працює в спільному контексті. Pod моделює "логічний хост" для вашого застосунку: він містить один або кілька контейнерів застосунку, які мають відносно тісний звʼязок один з одним. По за контекстом хмар, застосунки, що виконуються на одному фізичному або віртуальному компʼютері, аналогічні застосункам, що виконуються на одному логічному хості.
Так само як і контейнери застосунків, Podʼи можуть містити контейнери ініціалізації, які запускаються під час старту Podʼа. Ви також можете впровадити тимчасові контейнери для налагодження, якщо ваш кластер це підтримує.
Що таке Pod?
Примітка:
Вам потрібно встановити середовище виконання контейнерів на кожному вузлі кластера, щоб контейнери могли працювати там.Спільний контекст Podʼа — це набір Linux-просторів імен, cgroups та, можливо, інших аспектів ізоляції — тих самих речей, що забезпечують ізоляцію контейнера. В межах контексту Podʼа окремі застосунки можуть мати додаткові рівні ізоляції.
Pod схожий на набір контейнерів із спільними просторами імен та спільними ресурсами файлових систем.
Podʼи в кластері Kubernetes використовуються двома основними способами:
- Podʼи, що керують одним контейнером. Модель «один контейнер на Pod» є найпоширенішим використанням в Kubernetes. У цьому випадку Pod можна розглядати як обгортку навколо одного контейнера; Kubernetes керує Podʼами, а не контейнерами безпосередньо.
- Podʼи, що керують кількома контейнерами, які мають працювати разом. Pod може інкапсулювати застосунок, який складається з кількох розміщених разом контейнерів, які тісно повʼязані та мають спільні ресурси. Такі контейнери утворюють єдиний обʼєкт.
Група кількох контейнерів, розміщених разом в одному Podʼі є відносно складним прикладом. Ви повинні використовувати цей шаблон тільки в конкретних випадках, коли ваші контейнери тісно повʼязані.
Для забезпечення реплікації (з метою підвищення відмовостійкості або розширення потужності) не потрібно запускати кілька контейнерів; якщо вам потрібно створити кілька реплік, див. Керування навантаженням.
Використання 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ʼами
Зазвичай у вас немає потреби у створенні окремих Podʼів напряму в Kubernetes, навіть одиничних Podʼів. Натомість створюйте їх за допомогою ресурсів робочих навантажень, таких як Deployment або Job. Якщо ваші Podʼи потребують відстеження стану, розгляньте використання ресурсу StatefulSet.
Кожен Pod призначений для запуску одного екземпляра застосунку. Якщо ви хочете масштабувати свій застосунок горизонтально (щоб надати більше ресурсів, запустивши більше екземплярів), вам слід використовувати кілька Podʼів, по одному для кожного екземпляра. У Kubernetes це зазвичай називається реплікацією. Репліковані Podʼи створюються та керуються як група ресурсів робочих навантажень разом з їх контролером.
Ознайомтесь з розділом Podʼи та контролери для отримання додаткової інформації про те, як Kubernetes використовує ресурси робочих навантажень та їх контролери для реалізації масштабування та автоматичного відновлення роботи застосунку.
Podʼи можуть надавати два види спільних ресурсів для своїх підпорядкованих контейнерів: мережу та зберігання.
Робота з Podʼами
Ви навряд чи створюватимете окремі Podʼи напряму в Kubernetes, навіть одиничні Podʼи. Це тому, що Podʼи спроєктовано бути відносно ефемерними, одноразовими обʼєктами, які можуть бути втрачені в будь-який момент. Коли Pod створено (чи це зроблено вами, чи це зроблено автоматично за допомогою контролера), новий Pod планується на виконання на вузлі вашого кластера. Pod залишається на цьому вузлі до тих пір, поки він не завершить роботу, або обʼєкт Pod буде видалено, Pod буде виселено за відсутності ресурсів, або вузол зазнав збою.
Примітка:
Перезапуск контейнера в Pod не слід плутати з перезапуском Podʼа. Pod — це не процес, а середовище для запуску контейнера(ів). Pod існує до тих пір, поки його не видалено.Назва Podʼа має бути дійсним DNS-піддоменом, але це може призвести до неочікуваних результатів для імені хосту Podʼа. Для найкращої сумісності, імʼя має відповідати більш обмеженим правилам для DNS-мітки.
Операційна система Podʼа
Kubernetes v1.25 [stable]Ви маєте вказати значення поля .spec.os.name як linux або windows, щоб вказати ОС, на якій ви хочете запустити Pod. Ці дві ОС підтримуються Kubernetes. У майбутньому цей список може бути розширений.
У Kubernetes v1.35, значення .spec.os.name не впливає на те, як kube-scheduler вибирає вузол для запуску Podʼа. У будь-якому кластері, де для робочих вузлів використовується більше однієї операційної системи, слід правильно встановити мітку kubernetes.io/os на кожному вузлі та визначити Podʼи параметром nodeSelector, що базується на мітці операційної системи. Kube-scheduler призначає ваш Pod на вузол на основі інших критеріїв і може
успішно або невдало вибрати відповідне розміщення вузла, де ОС вузла підходить для контейнерів у цьому Podʼі. Стандарти безпеки Podʼів також використовують це поле, щоб уникнути застосування політик, які не є відповідними для цієї операційної системи.
Podʼи та контролери
Ви можете використовувати ресурси робочих навантажень для створення та керування Podʼами. Контролери ресурсів опікуються реплікацією та розгортанням Podʼів, а також автоматичним відновленням роботи застосунку в разі відмови. Наприклад, якщо Вузол впав, контролер помітить, що Pod на цьому вузлі перестав працювати, він створить заміну Podʼа. Планувальник поміщає Pod-заміну до нового працездатного вузла.
Ось кілька прикладів ресурсів робочих навантажень, які керують одним чи більше Podʼами:
Визначення посилання на робоче навантаження
Kubernetes v1.35 [alpha](стандартно вимкнено)Стандартно Kubernets планує кожний Pod окремо. Однак деякі тісно повʼязані застосунки потребують одночасного планування групи Podʼів для коректної роботи.
Ви можете повʼязати Pod з обʼєктом робочого навантаження за допомогою посилання на робоче навантаження. Таким чином ви повідомляєте kube-scheduler, що Pod є частиною певної групи, що дозволяє йому приймати скоординовані рішення щодо розміщення для всієї групи одночасно.
Pod templates
Контролери ресурсів робочих навантажень створюють 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ʼа та оновлень; ці деталі абстраговані. Ця абстракція та розділення відповідальностей спрощує семантику системи та робить можливим розширення поведінки кластера без зміни наявного коду.
Оновлення та заміна Podʼів
Як зазначено в попередньому розділі, коли template Podʼа для ресурсу робочого навантаження змінюється, контролер створює нові Podʼи на основі оновленого template замість оновлення або латання наявних Podʼів.
Kubernetes не забороняє вам керувати Podʼами напряму. Ви можете оновлювати деякі поля запущеного Podʼа, на місці. Однак операції оновлення Podʼа, такі як patch та replace, мають деякі обмеження:
- Більшість метаданих Podʼа є незмінними. Наприклад, ви не можете змінити поля
namespace,name,uidабоcreationTimestamp. - Якщо
metadata.deletionTimestampвстановлено, новий запис не може бути доданий до спискуmetadata.finalizers. - Оновлення Podʼа може не змінювати поля, крім
spec.containers[*].image,spec.initContainers[*].image,spec.activeDeadlineSeconds,spec.terminationGracePeriodSeconds,spec.tolerationsorspec.schedulingGates. Дляspec.tolerationsви можете додавати лише нові записи. - Коли ви оновлюєте
spec.activeDeadlineSeconds, дозволені два типи оновлень:- встановлення непризначеному полю позитивного числа;
- оновлення поля з позитивного числа на менше, невідʼємне число.
Субресурси Podʼів
Наведені вище правила оновлення застосовуються до регулярних оновлень подів, але інші поля пода можуть бути оновлені за допомогою субресурсів.
- Resize: Субресурс
resizeдозволяє оновлювати ресурси контейнерів (spec.containers[*].resources). Дивіться Зміна розміру ресурсів контейнера для більш детальної інформації. - Ефемерні контейнери: Субресурс
ephemeralContainersдозволяє додавати ефемерні контейнери до Podʼа. Дивіться Ефемерні контейнери для більш детальної інформації. - Status: Субресурс
statusдозволяє оновити статус контейнера. Зазвичай він використовується лише Kubelet та іншими системними контролерами. - Binding: Субресурс
bindingдозволяє встановитиspec.nodeNamePodʼів за допомогою запитуBinding. Зазвичай це використовується лише scheduler.
Генерація (покоління) Podʼів
- Поле
metadata.generationє унікальним. Воно автоматично встановлюється системою таким чином, що нові Podʼи мають значенняmetadata.generation, рівне 1, і кожне оновлення змінних полів у специфікації Podʼа збільшуватиме значенняmetadata.generationна 1.
Kubernetes v1.35 [stable](стандартно увімкнено)observedGeneration— це поле, яке фіксується в розділіstatusобʼєкта Pod. Kubelet встановитьstatus.observedGenerationдля відстеження поточного статусу Podʼа. Полеstatus.observedGenerationPodʼа відображатимеmetadata.generationPodʼа у момент коли повідомляється про статус Podʼа.
Примітка:
Полеstatus.observedGeneration керується kubelet, і зовнішні контролери не повинні змінювати це поле.Різні поля статусу можуть бути повʼязані або з metadata.generation поточного циклу синхронізації, або з metadata.generation попереднього циклу синхронізації. Ключова відмінність полягає в тому, чи зміна в spec відображається безпосередньо в status, чи є непрямим результатом поточного процесу.
Безпосередні оновлення статусу
Для полів статусу, де виділена специфікація безпосередньо відображається, observedGeneration буде повʼязане з поточним metadata.generation (Generation N).
Ця поведінка застосовується до:
- Статусу Resize: Статус операції зміни розміру ресурсу.
- Виділених ресурсів: Ресурси, виділені Podʼу після зміни розміру.
- Ефемерних контейнерів: Коли додається новий ефемерний контейнер, і він знаходиться в стані
Waiting.
Опосередковані оновлення статусу
Для полів статусу, які є непрямим результатом виконання специфікації зі spec, observedGeneration буде повʼязано з metadata.generation попереднього циклу синхронізації (покоління N-1).
Ця поведінка застосовується до:
- Образу контейнера:
ContainerStatus.ImageIDпоказує образ з попереднього покоління, поки новий образ не буде завантажено, а контейнер не буде оновлено. - Фактичних ресурсів: Під час зміни розміру, фактичні ресурси, що використовуються, все ще належать запиту попереднього покоління.
- Стану контейнера: Під час зміни розміру, з політикою перезапуску, що вимагає перезапуску, відображає запит попереднього покоління.
- activeDeadlineSeconds та terminationGracePeriodSeconds та deletionTimestamp: Вплив цих полів на статус Podʼа є результатом раніше отриманої специфікації.
Спільні ресурси та комунікація
Podʼи дозволяють контейнерам спільно використовувати ресурси та спілкуватися один з одним.
Зберігання в Podʼах
Pod може мати набір спільних ресурсів зберігання. Всі контейнери в Podʼі можуть отримати доступ до спільних томів, що дозволяє цим контейнерам спільно використовувати дані. Також томи дозволяють постійним даним в Podʼі вижити в разі перезапуску одного з контейнерів. Дивіться розділ Зберігання для отримання додаткової інформації про те, як Kubernetes реалізує спільне зберігання та робить його доступним для Podʼів.
Мережеві можливості 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ʼів
Щоб встановити обмеження безпеки для 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 та детальні параметри безпеки, перейдіть до розділу Концепції безпеки.
- Щоб дізнатися про обмеження безпеки на рівні ядра, які ви можете використовувати, див. Обмеження безпеки ядра Linux для Podʼів та контейнерів.
- Для отримання додаткової інформації про контекст безпеки Podʼа див. Налаштування контексту безпеки для Podʼа або контейнера.
Запити та обмеження ресурсів
Коли ви визначаєте Pod, ви можете необовʼязково вказати, скільки кожного ресурсу потребує контейнер. Найпоширеніші ресурси для вказання — це CPU та памʼять (RAM).
Коли ви вказуєте запит ресурсу (request) для контейнерів у Podʼі, kube-scheduler використовує цю інформацію для визначення, на який вузол розмістити Pod. Коли ви вказуєте обмеження ресурсу (limit) для контейнера, kubelet забезпечує дотримання цих обмежень, щоб використання ресурсів запущеним контейнером не перевищувало встановлені ліміти.
Ліміти CPU забезпечуються шляхом обмеження доступу до CPU. Коли контейнер наближається до свого ліміту CPU, ядро обмежує його доступ до CPU. Ліміти памʼяті забезпечуються ядром за допомогою примусового завершення процесів через нестачу памʼяті (OOM), коли контейнер перевищує свій ліміт.
Примітка:
Встановлення лімітів CPU повʼязане з компромісами. Ліміти CPU допомагають запобігти проблемам «шумного сусіда», коли одне робоче навантаження позбавляє ресурсів інших на тому ж вузлі. Це особливо важливо в багатокористувацьких середовищах. Однак ліміти CPU можуть призводити до обмеження продуктивності навіть тоді, коли на вузлі є вільні ресурси CPU, що потенційно погіршує продуктивність робочих навантажень, чутливих до затримок. Вирішення питання про встановлення лімітів CPU залежить від вашого середовища, характеристик робочого навантаження та вимог до ізоляції.Детальнішу інформацію про одиниці ресурсів, механізми забезпечення дотримання обмежень та приклади конфігурації дивіться у розділі Управління ресурсами для Podʼів та контейнерів.
Статичні Podʼи
Kubernetes v1.22 [stable]Статичні Podʼи керуються безпосередньо демоном kubelet на конкретному вузлі, без спостереження з боку сервера API. У той час як більшість Podʼів керуються панеллю управління (наприклад, Deployment), для статичних Podʼів kubelet безпосередньо наглядає за кожним статичним Podʼом (та перезапускає його, якщо він падає).
Статичні Podʼи завжди привʼязані до одного Kubeletʼу на конкретному вузлі. Основне використання статичних Podʼів — це запуск самостійної панелі управління: іншими словами, використання kubelet для нагляду за окремими компонентами панелі управління.
Kubelet автоматично намагається створити mirror Pod на сервері API Kubernetes для кожного статичного Podʼа. Це означає, що Podʼи, які працюють на вузлі, видно на сервері API, але ними не можна керувати звідти. Дивіться Створення статичних Podʼів для отримання додаткової інформації.
Примітка:
Розділspec статичного Podʼа не може посилатися на інші API-обʼєкти (наприклад, ServiceAccount, ConfigMap, Secret тощо).Podʼи з кількома контейнерами
Podʼи спроєктовано для підтримки кількох взаємодіючих процесів (таких як контейнери), які утворюють єдиний обʼєкт сервісу. Контейнери в Podʼі автоматично спільно розміщуються та плануються на тому ж фізичному або віртуальному компʼютері в кластері. Контейнери можуть спільно використовувати ресурси та залежності, взаємодіяти між собою та координувати, коли та як вони завершують роботу.
Podʼи в Kubernetes можуть керувати одним або кількома контейнерами двома способами:
- Podʼи, що керують одним контейнером. Модель "один контейнер на Pod" є найпоширенішим використанням в Kubernetes. У цьому випадку Pod можна розглядати як обгортку навколо одного контейнера; Kubernetes керує Podʼами, а не контейнерами безпосередньо.
- Podʼи, що керують кількома контейнерами, які мають працювати разом. Pod може інкапсулювати застосунок, який складається з кількох розміщених разом контейнерів, які тісно повʼязані та мають спільні ресурси. Ці спільно розташовані контейнери утворюють єдиний цілісний сервіс — наприклад, один контейнер обслуговує дані, збережені в спільному томі, для загального доступу, тоді як окремий контейнер sidecar оновлює ці файли. Pod обгортає ці контейнери, ресурси сховища та тимчасову мережеву ідентичність разом як єдину одиницю.
Наприклад, у вас може бути контейнер, який виконує функції вебсервера для файлів у спільному томі, та окремий 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ʼів, що виходять за межі основних положень, зокрема:
- PriorityClasses
- RuntimeClasses
- розширені способи конфігурації планування: спосіб, яким Kubernetes вирішує, на якому вузлі повинен працювати Pod.
Для розуміння контексту того, чому Kubernetes обгортає загальний API Pod іншими ресурсами (такими як StatefulSets або Deployments), ви можете прочитати про попередні роботи, включаючи: