Обʼєкти в Kubernetes
Обʼєкти Kubernetes є постійними сутностями в системі Kubernetes. Kubernetes використовує ці сутності для подання стану вашого кластера. Дізнайтеся про модель обʼєктів Kubernetes та про те, як працювати з цими обʼєктами.
Ця сторінка пояснює, як обʼєкти Kubernetes подаються в API Kubernetes, та як ви можете описати їх у форматі .yaml
.
Розуміння обʼєктів Kubernetes
Обʼєкти Kubernetes є постійними сутностями в системі Kubernetes. Kubernetes використовує ці сутності для подання стану вашого кластера. Зокрема, вони можуть описувати:
- Які контейнеризовані застосунки працюють (і на яких вузлах)
- Ресурси, доступні для цих застосунків
- Політики щодо того, як ці застосунки поводяться, такі як політики перезапуску, оновлення та стійкості до відмов
Обʼєкт Kubernetes є "записом про наміри" — після створення обʼєкта система Kubernetes постійно працюватиме, щоб переконатися, що обʼєкт існує. Створюючи обʼєкт, ви фактично повідомляєте системі Kubernetes, ваші побажання щодо того, як має виглядати робоче навантаження вашого кластера; це бажаний стан вашого кластера.
Для роботи з обʼєктами Kubernetes — чи то для створення, зміни чи видалення — вам потрібно використовувати API Kubernetes. Наприклад, коли ви використовуєте інтерфейс командного рядка kubectl
, CLI виконує необхідні виклики API Kubernetes за вас. Ви також можете використовувати API Kubernetes безпосередньо у ваших власних програмах за допомогою однієї з Клієнтських бібліотек.
Специфікація та стан обʼєкта
Майже кожен обʼєкт Kubernetes містить два вкладених поля обʼєкта, які керують конфігурацією обʼєкта: spec
та status
обʼєкта. Для обʼєктів, які мають spec
, вам потрібно встановити його при створенні обʼєкта, надаючи опис характеристик, які ви хочете, щоб ресурс мав: його бажаний стан.
status
описує поточний стан обʼєкта, який надається та оновлюється системою Kubernetes та її компонентами. Control plane Kubernetes постійно та активно керує фактичним станом кожного обʼєкта, щоб він відповідав бажаному стану, який ви вказали.
Наприклад: в Kubernetes, Deployment є обʼєктом, який може представляти застосунок, який працює на вашому кластері. При створенні Deployment ви можете встановити spec
Deployment, щоб вказати, що ви хочете, щоб працювало три репліки застосунку. Система Kubernetes читає spec
Deployment та запускає три екземпляри вашого застосунку — оновлюючи status
Deployment, щоб віддзеркалювати поточний стан розгорнення. Якщо один цих екземплярів зазнає збою (зміни стану), Kubernetes відреагує на відмінність між spec
та status
, створивши новий екземпляр, щоб забезпечити, щоб status
відповідав spec
.
З докладнішою інформацією про spec, status та metadata обʼєктів Kubernetes звертайтесь до Kubernetes API Conventions.
Опис обʼєктів Kubernetes
Коли ви створюєте обʼєкт Kubernetes, ви повинні визначити spec обʼєкта, який описує бажаний стан обʼєкта, а також інші відомості про обʼєкт, наприклад його назву (name). Коли ви використовуєте API Kubernetes для створення обʼєкта, чи безпосередньо, чи за допомогою kubectl
, цей запит до API має містити ці відомості у вигляді JSON в тілі запиту. Найчастіше інформація про обʼєкт подається kubectl
у вигляді файлу, який називається маніфестом. За домовленістю, маніфести обʼєктів Kubernetes подаються у форматі YAML (ви також можете використовувати JSON). Інструменти, такі як kubectl
, перетворюють інформацію з маніфесту у JSON або інший підтримуваний формат серіалізації надсилаючи HTTP-запити до API.
Ось приклад маніфесту, який містить обовʼязкові поля обʼєкта та його spec для Kubernetes Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # вказує Deployment запустити 2 Podʼи, що відповідають шаблону
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Один зі способів створення Deployment за допомогою маніфесту, подібного до показаного вище, — використання команди kubectl apply
в інтерфейсі командного рядка kubectl
, передаючи файл .yaml
як аргумент. Ось так:
kubectl apply -f https://k8s.io/examples/application/deployment.yaml
Вивід буде схожий на цей:
deployment.apps/nginx-deployment created
Обовʼязкові поля
В маніфесті (файл YAML або JSON) обʼєкта Kubernetes, який ви хочете створити, ви повинні вказати значення для наступних обовʼязкових полів:
apiVersion
— версія API Kubernetes, яку ви використовуєте для створення обʼєктаkind
— тип обʼєкта, який ви хочете створитиmetadata
— відомості про обʼєкт, які дозволяють ідентифікувати обʼєкт, включаючи рядок name
, який вказує назву обʼєкта, UID
, та, необовʼязково, namespace
spec
— опис бажаного стану обʼєкта
Точний формат spec
обʼєкта є різним для кожного типу обʼєкта в Kubernetes та містить вкладені поля, що притаманні конкретному типу обʼєкта. Kubernetes API Reference може допомогти знайти формати для всіх типів обʼєктів, які ви хочете створити використовуючи API Kubernetes.
Наприклад, подивіться на поле spec
для обʼєкта Pod. Для кожного Pod, поле .spec
вказує на Pod та його бажаний стан (наприклад, назву образу контейнера для кожного контейнера всередині цього Pod). Інший приклад специфікації обʼєкта — поле spec
для обʼєкта StatefulSet. Для StatefulSet, поле .spec
вказує на StatefulSet та його бажаний стан. У .spec
StatefulSet є template для обʼєктів Pod. Цей шаблон описує Pod, які контролер StatefulSet створить, щоб задовольнити специфікацію StatefulSet. Різні типи обʼєктів Kubernetes можуть мати різні .status
; дивіться Kubernetes API Reference для отримання відомостей структуру поля .status
та його вміст для кожного типу обʼєкта.
Перевірка полів на стороні сервера
Починаючи з Kubernetes v1.25, API сервера Kubernetes може виконувати перевірку полів на стороні сервера, що дозволяє виявляти невідомі та задвоєні поля в описі обʼєктів. Це надає функціонал kubectl --validate
на стороні сервера.
kubectl
використовує прапорець --validate
для встановлення рівня перевірки полів маніфесту. Його значенням може бути ignore
, warn
та strict
, також можна вказати true
(еквівалент strict
) та false
(еквівалент ignore
). Типове значення перевірки для kubectl
— --validate=true
.
Strict
- Сувора перевірка, повертає збій під час виявлення помилок.
Warn
- Перевірка виконується, але виявлення помилок призводить до виведення попереджень, а не збою.
Ignore
- Перевірка на стороні сервера не виконується.
Якщо kubectl
не може підʼєднатися до API сервера, він використовує локальну перевірку, яка виконується на стороні клієнта. Kubernetes v1.27 та пізніші версії завжди пропонуватимуть перевірку полів; версії до v1.27, скоріш за все — ні. Якщо версія Kubernetes на вашому кластері старіша за v1.27, звіртесь з документацією до вашої версії Kubernetes.
Що далі
Якщо ви тільки починаєте свій шлях з Kubernetes, дізнайтесь більше про:
Керування обʼєктами в Kubernetes надає додаткову інформацію про те, як працювати використовувати kubectl
для керування обʼєктами. Скоріш за все вам буде потрібно встановити kubectl
, якщо тільки ви цього ще не зробили.
Щоб дізнатись про API Kubernetes, зверніться до:
Якщо ви хочете дізнатись про Kubernetes більше, зверніться до інших сторінок в цьому розділі:
1 - Управління обʼєктами Kubernetes
Інструмент командного рядка kubectl
підтримує кілька різних способів створення та управління обʼєктами Kubernetes. Цей документ надає огляд різних підходів. Для отримання деталей щодо управління обʼєктами за допомогою Kubectl читайте Книгу Kubectl.
Техніки управління
Попередження:
Обʼєкт Kubernetes повинен управлятися лише з використанням однієї техніки. Змішування різних технік для того самого обʼєкта призводить до невизначеної поведінки.Техніка управління | Діє на | Рекомендоване середовище | Підтримувані інструменти | Крива навчання |
---|
Імперативні команди | Живі обʼєкти | Проєкти розробки | 1+ | Налегша |
Імперативна конфігурація обʼєктів | Окремі файли | Продуктові проєкти | 1 | Середня |
Декларативна конфігурація обʼєктів | Теки файлів | Продуктові проєкти | 1+ | Найскладніша |
Імперативні команди
При використанні імперативних команд користувач працює безпосередньо з живими обʼєктами в кластері. Користувач надає операції команді kubectl
у вигляді аргументів чи прапорців.
Це рекомендований спосіб початку роботи або виконання одноразового завдання в кластері. Оскільки цей метод працює безпосередньо з живими обʼєктами, він не зберігає жодної історичної конфігурації.
Приклади
Запустіть екземпляр контейнера nginx, створивши обʼєкт розгортання (Deployment):
kubectl create deployment nginx --image nginx
Компроміси
Переваги порівняно із конфігуруванням обʼєктів:
- Команди виражені як одне слово дії.
- Команди вимагають лише одного кроку для внесення змін до кластера.
Недоліки порівняно із конфігуруванням обʼєктів:
- Команди не інтегруються з процесами перегляду змін.
- Команди не надають логів аудиту, повʼязаних зі змінами.
- Команди не надають джерела записів, окрім того, що є на живому сервері.
- Команди не надають шаблону для створення нових обʼєктів.
Імперативне конфігурування обʼєктів
У імперативній конфігурації обʼєктів команда kubectl
вказує операцію (створити, замінити інше), необовʼязкові прапорці та принаймні одне імʼя файлу. Зазначений файл повинен містити повне визначення обʼєкта у форматі YAML або JSON.
Див. API-довідник для отримання докладніших відомостей щодо визначення обʼєктів.
Попередження:
Імперативна команда replace
замінює поточну специфікацію на нову, вилучаючи всі зміни обʼєкта, які відсутні в файлі конфігурації. Цей підхід не повинен використовуватися із типами ресурсів, специфікації яких оновлюються незалежно від файлу конфігурації. Наприклад, у служб типу LoadBalancer
поле externalIPs
оновлюється незалежно від конфігурації кластера.Приклади
Створити обʼєкти, визначені у файлі конфігурації:
kubectl create -f nginx.yaml
Видалити обʼєкти, визначені у двох файлах конфігурації:
kubectl delete -f nginx.yaml -f redis.yaml
Оновити обʼєкти, визначені у файлі конфігурації, перезаписавши живу конфігурацію:
kubectl replace -f nginx.yaml
Компроміси
Переваги порівняно з імперативними командами:
- Конфігурація обʼєктів може зберігатися у системі контролю версій, такій як Git.
- Конфігурація обʼєктів може інтегруватися з процесами, такими як перегляд змін перед публікацією та аудитом.
- Конфігурація обʼєктів надає шаблон для створення нових обʼєктів.
Недоліки порівняно з імперативними командами:
- Конфігурація обʼєктів потребує базового розуміння схеми обʼєкта.
- Конфігурація обʼєктів потребує додаткового кроку у вигляді написання файлу YAML.
Переваги порівняно із декларативною конфігурацією обʼєктів:
- Поведінка імперативної конфігурації обʼєктів простіша та її легше зрозуміти.
- З версії Kubernetes 1.5 імперативна конфігурація обʼєктів більш зріла.
Недоліки порівняно із декларативною конфігурацією обʼєктів:
- Імперативна конфігурація обʼєктів працює краще з файлами, а не з теками.
- Оновлення живих обʼєктів повинно відображатися у файлах конфігурації, або вони будуть втрачені під час наступної заміни.
Декларативна конфігурація обʼєктів
При використанні декларативної конфігурації обʼєктів користувач працює з конфігураційними файлами обʼєктів, збереженими локально, проте користувач не визначає операції, які слід виконати над файлами. Операції створення, оновлення та видалення автоматично визначаються для кожного обʼєкта за допомогою kubectl
. Це дозволяє працювати з теками, де для різних обʼєктів можуть бути потрібні різні операції.
Примітка:
Декларативна конфігурація обʼєктів зберігає зміни, внесені іншими учасниками, навіть якщо зміни не зливаються назад у файл конфігурації обʼєкта. Це можливо за допомогою використання операції API patch
для запису тільки спостережуваних відмінностей, замість використання операції replace
для заміни всього файлу конфігурації обʼєкта.Приклади
Обробити всі файли конфігурації обʼєктів у каталозі configs
та створити або внести патчі до живих обʼєктів. Спочатку ви можете використовувати diff
, щоб побачити, які зміни будуть внесені, а потім застосовувати:
kubectl diff -f configs/
kubectl apply -f configs/
Рекурсивно обробити теки:
kubectl diff -R -f configs/
kubectl apply -R -f configs/
Компроміси
Переваги порівняно з імперативною конфігурацією обʼєктів:
- Зміни, внесені безпосередньо в живі обʼєкти, зберігаються, навіть якщо вони не зливаються назад у файли конфігурації.
- Декларативна конфігурація обʼєктів краще підтримує роботу з теками та автоматично визначає типи операцій (створення, патч, видалення) для кожного обʼєкта.
Недоліки порівняно з імперативною конфігурацією обʼєктів:
- Декларативна конфігурація обʼєктів важко налагоджувати, і результати її роботи важко зрозуміти, коли вони несподівані.
- Часткові оновлення за допомогою відміток створюють складні операції злиття та накладання патчів.
Що далі
2 - Назви та Ідентифікатори Обʼєктів
Кожен обʼєкт у вашому кластері має Назву (імʼя), яка є унікальною для цього типу ресурсу. Кожен обʼєкт Kubernetes також має UID, який є унікальним в усьому вашому кластеру.
Наприклад, ви можете мати лише один обʼєкт Pod із назвою myapp-1234
в просторі імен з такою ж назвою, а також ви можете мати один обʼєкт Pod та один Deployment із назвами myapp-1234
кожен.
Для неунікальних атрибутів, наданих користувачем, Kubernetes надає мітки (labels) та анотації (annotations).
Назви
Наданий клієнтом рядок, який посилається на обʼєкт в URL ресурсу, наприклад /api/v1/pods/some-name
.
Тільки один обʼєкт вказаного виду (kind) може мати вказану назву одночасно. Проте, якщо ви видаляєте обʼєкт, ви можете створити новий обʼєкт з такою ж назвою.
Назви повинні бути унікальними між усіма версіями API того ж самого ресурсу. Ресурси API відрізняються своєю API-групою, типом ресурсу, простором імен (для ресурсів із просторами імен) та назвою. Іншими словами, версія API не має значення в цьому контексті.
Примітка:
У випадках, коли обʼєкти представляють фізичний обʼєкт, наприклад, Node, що представляє фізичний хост, коли хост перестворюється з тією ж самою назвою без видалення та перестворення Node, Kubernetes розглядає новий хост як старий, що може призвести до неузгодженостей.Сервер може згенерувати імʼя, якщо в запиті на створення ресурсу замість name
вказати generateName
. Коли використовується generateName
, надане значення використовується як префікс імені, до якого сервер додає згенерований суфікс. Навіть якщо імʼя згенеровано, воно може конфліктувати з наявними іменами, що призведе до повторної відповіді HTTP 409. Це стало набагато менш імовірним в Kubernetes v1.31 і пізніших версіях, оскільки сервер зробить до 8 спроб згенерувати унікальне імʼя перед тим, як повернути відповідь HTTP 409.
Нижче наведено чотири типи обмежень на назви ресурсів, які часто використовуються.
Назви DNS-піддоменів
Більшість типів ресурсів потребують назви, яку можна використовувати як DNS-піддомен згідно з RFC 1123. Це означає, що назва повинна:
- містити не більше 253 символів
- містити лише буквено-цифрові символи, '-' чи '.' в нижньому регістрі
- починатися буквено-цифровим символом
- закінчуватися буквено-цифровим символом
Назви міток RFC 1123
Деякі типи ресурсів вимагають, щоб їх назви відповідали стандарту DNS як визначено в RFC 1123. Це означає, що назва повинна:
- містити не більше 63 символів
- містити лише буквено-цифрові символи чи '-' в нижньому регістрі
- починатися буквено-цифровим символом
- закінчуватися буквено-цифровим символом
Назви міток RFC 1035
Деякі типи ресурсів вимагають, щоб їх назви відповідали стандарту DNS як визначено в RFC 1035. Це означає, що назва повинна:
- містити не більше 63 символів
- містити лише буквено-цифрові символи чи '-' в нижньому регістрі
- починатися алфавітним символом
- закінчуватися буквено-цифровим символом
Примітка:
Єдина відмінність між стандартами RFC 1035 та RFC 1123 полягає у тому, що мітки RFC 1123 можуть починатися з цифри, тоді як мітки RFC 1035 можуть починатися
лише з літери алфавіту в нижньому регістрі.Назви сегментів шляху
Деякі типи ресурсів вимагають, щоб їх назви можна було безпечно кодувати як сегмент шляху. Іншими словами, назва не може бути "." або "..", і вона не може
містити "/" або "%".
Ось приклад маніфесту для Pod із назвою nginx-demo
.
apiVersion: v1
kind: Pod
metadata:
name: nginx-demo
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Примітка:
Деякі типи ресурсів мають додаткові обмеження на їх назви.UID
Рядок, створений системами Kubernetes для унікальної ідентифікації обʼєктів.
Кожен обʼєкт, створений протягом усього життя кластера Kubernetes, має відмінний UID. Він призначений для відмінності між історичними випадками схожих сутностей.
UID Kubernetes — це унікальні ідентифікатори, також відомі як UUID (узгоджені універсальні ідентифікатори). UUID стандартизовані згідно з ISO/IEC 9834-8 та ITU-T X.667.
Що далі
3 - Мітки та Селектори
Мітки — це пари ключ/значення, які прикріплені до обʼєктів, таких як Pod. Мітки призначені для використання для вказівки визначних атрибутів обʼєктів, які мають значення та стосуються користувачів, але безпосередньо не вбачають семантику для основної системи. Мітки можуть бути використані для організації та вибору підмножини обʼєктів. Мітки можуть бути прикріплені до обʼєктів при їх створенні та пізніше додані та змінені в будь-який час. Кожен обʼєкт може мати набір унікальних міток ключ/значення. Кожен ключ повинен бути унікальним для даного обʼєкта.
"metadata": {
"labels": {
"key1" : "value1",
"key2" : "value2"
}
}
Мітки дозволяють є ефективними для запитів та спостережень та є ідеальними для використання в інтерфейсах користувача та інтерфейсах командного рядка. Інформацію, що не є ідентифікуючою, слід записувати за допомогою анотацій.
Мотивація
Мітки дозволяють користувачам звʼязувати свої власні організаційні структури з обʼєктами системи у вільний спосіб, не вимагаючи зберігання цих звʼязків в клієнтах.
Розгортання Service та конвеєрів обробки пакетів часто є багатомірними сутностями (наприклад, кілька розділів чи розгортань, кілька шляхів релізів, кілька рівнів, кілька мікросервісів на кожному рівні). Управління часто потребує наскрізних операцій, які порушують інкапсуляцію строго ієрархічних уявлень, особливо жорстких ієрархій, визначених інфраструктурою, а не користувачами.
Приклади міток:
"release" : "stable"
, "release" : "canary"
"environment" : "dev"
, "environment" : "qa"
, "environment" : "production"
"tier" : "frontend"
, "tier" : "backend"
, "tier" : "cache"
"partition" : "customerA"
, "partition" : "customerB"
"track" : "daily"
, "track" : "weekly"
Це приклади загальновживаних міток; ви вільні розробляти свої власні домовленості. Памʼятайте, що ключ мітки повинен бути унікальним для даного обʼєкта.
Синтаксис та набір символів
Мітки — це пари ключ/значення. Дійсні ключі міток мають два сегменти: необовʼязковий префікс та назву, розділені слешем (/
). Сегмент назви є обовʼязковим і має бути не більше 63 символів, починатися та закінчуватися буквено-цифровим символом ([a-z0-9A-Z]
) з дефісами (-
), підкресленнями (_
), крапками (.
), та буквено-цифровими символами між ними. Префікс є необовʼязковим. Якщо вказаний, префікс повинен бути піддоменом DNS: серією DNS-міток, розділених крапками (.
), не довше 253 символів загалом, за яким слідує слеш (/
).
Якщо префікс відсутній, ключ мітки вважається приватним для користувача. Автоматизовані компоненти системи (наприклад, kube-scheduler
, kube-controller-manager
, kube-apiserver
, kubectl
, або інші засоби автоматизації від інших сторін), які додають мітки до обʼєктів користувача, повинні вказати префікс.
Префікси kubernetes.io/
та k8s.io/
є зарезервованими для основних компонентів Kubernetes.
Дійсне значення мітки:
- повинно бути не більше 63 символів (може бути порожнім),
- крім порожнього значення, повинно починатися та закінчуватися буквено-цифровим символом (
[a-z0-9A-Z]
), - може містити дефіси (
-
), підкреслення (_
), крапки (.
), та буквено-цифрові символи між ними.
Наприклад, ось маніфест для Pod із двома мітками environment: production
та app: nginx
:
apiVersion: v1
kind: Pod
metadata:
name: label-demo
labels:
environment: production
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Селектори міток
На відміну від назв та UID, мітки не забезпечують унікальності. Загалом, ми очікуємо, що багато обʼєктів матимуть ті ж самі мітки.
За допомогою селектора міток користувач може ідентифікувати набір обʼєктів. Селектор міток є основним примітивом гуртування в Kubernetes.
На цей момент API підтримує два типи селекторів: equality-based та set-based. Селектор міток може складатися з кількох вимог, які розділені комами. У випадку кількох вимог всі повинні бути задоволені, таким чином кома виступає логічним
оператором AND (&&
).
Примітка:
Для деяких типів API, таких як ReplicaSets, селектори міток двох екземплярів не повинні перетинатися в одному просторі імен, бо контролер може вважати це конфліктною інструкцією та не визначити, скільки реплік повинно бути присутньо.Увага:
Для умов на основі рівності і на основі множини немає логічного оператора OR (||
). Переконайтеся, що ваші вирази фільтрації структуровані відповідно.Equality-based вимоги
Вимоги Equality- чи inequality-based дозволяють фільтрувати обʼєкти за ключами та значеннями міток. Відповідні обʼєкти повинні задовольняти всі вказані обмеження міток, хоча вони можуть мати додаткові мітки також. Допускаються три види операторів: =
, ==
, !=
. Перший та другий представляють рівність (equality) і є синонімами, тоді як останній представляє нерівність (inequality).
Наприклад:
environment = production
tier != frontend
Перший вибирає всі ресурси з ключем environment
та значенням production
. Другий вибирає всі ресурси з ключем tier
та значеннями відмінним від frontend
, та всі ресурси без міток з ключем tier
. Можна використовувати оператор коми для фільтрації ресурсів у production
, іншими словами, environment=production,tier!=frontend
.
Один зі сценаріїв використання вимог на основі рівності використовується для Podʼів, які вказують критерії вибору вузлів. Наприклад, зразок Podʼа нижче вибирає вузли з міткою accelerator
зі значенням "accelerator=nvidia-tesla-p100
".
apiVersion: v1
kind: Pod
metadata:
name: cuda-test
spec:
containers:
- name: cuda-test
image: "registry.k8s.io/cuda-vector-add:v0.1"
resources:
limits:
nvidia.com/gpu: 1
nodeSelector:
accelerator: nvidia-tesla-p100
Set-based вимоги
Вимоги на основі множини дозволяють фільтрувати ключі за набором значень. Підтримуються три види операторів: in
, notin
та exists
(тільки ідентифікатор ключа). Наприклад:
environment in (production, qa)
tier notin (frontend, backend)
partition
!partition
- Перший приклад вибирає всі ресурси з ключем, рівним
environment
та значенням
рівним production
або qa
. - Другий приклад вибирає всі ресурси з ключем, рівним
tier
та значеннями іншими
ніж frontend
та backend
, та всі ресурси без міток з ключем tier
. - Третій приклад вибирає всі ресурси, включаючи мітку з ключем
partition
;
значення не перевіряються. - Четвертий приклад вибирає всі ресурси без мітки з ключем
partition
;
значення не перевіряються.
Так само розділювач коми діє як AND оператор. Таким чином, фільтрування ресурсів з ключем partition
(без значення) та з environment
відмінним від qa
може бути досягнуто за допомогою partition,environment notin (qa)
. Вимоги на основі множини є загальною формою вимог на основі рівності, оскільки environment=production
еквівалентно environment in (production)
; так само для !=
та notin
.
Вимоги на основі множини можна комбінувати з вимогами на основі рівності. Наприклад: partition in (customerA, customerB),environment!=qa
.
API
Фільтрація LIST та WATCH
Для операцій list і watch ви можете вказати селектори міток для фільтрації наборів обʼєктів що повертаються; фільтр задається за допомогою параметра запиту. (Щоб дізнатися докладніше про watch у Kubernetes, прочитайте ефективне виявлення змін).
Обидві вимоги дозволені (тут подано так, як вони з'являться у рядку URL-запиту):
- вимоги на основі рівності:
?labelSelector=environment%3Dproduction,tier%3Dfrontend
- вимоги на основі множини:
?labelSelector=environment+in+%28production%2Cqa%29%2Ctier+in+%28frontend%29
Обидва стилі селекторів міток можуть бути використані для переліку чи перегляду ресурсів через клієнта REST. Наприклад, спрямовуючись до apiserver
за допомогою kubectl
та використовуючи вимогу на основі рівності, можна написати:
kubectl get pods -l environment=production,tier=frontend
чи використовуючи вимогу на основі множини:
kubectl get pods -l 'environment in (production),tier in (frontend)'
Як вже зазначалося, вимоги на основі множини є більш виразними. Наприклад, вони можуть реалізувати оператор OR в значеннях:
kubectl get pods -l 'environment in (production, qa)'
чи обмежувати відʼємний збіг за допомогою оператора notin:
kubectl get pods -l 'environment,environment notin (frontend)'
Посилання в API-обʼєктах
Деякі обʼєкти Kubernetes, такі як services
та replicationcontrollers
, також використовують селектори міток для вказівки наборів інших ресурсів, таких як Podʼи.
Service та ReplicationController
Множина Podʼів, яку service
вибирає, визначається селектором міток. Так само, популяція Podʼів, якою replicationcontroller
повинен керувати,
також визначається селектором міток.
Селектори міток для обох обʼєктів визначаються в файлах json
або yaml
за допомогою звʼязування та підтримуються лише equality-based селектори:
"selector": {
"component" : "redis",
}
або
selector:
component: redis
Цей селектор (відповідно у форматі json
або yaml
) еквівалентний component=redis
або component in (redis)
.
Ресурси, які підтримують вимоги на основі множин
Нові ресурси, такі як Job
, Deployment
, ReplicaSet
, та DaemonSet
, також підтримують вимоги на основі множин.
selector:
matchLabels:
component: redis
matchExpressions:
- { key: tier, operator: In, values: [cache] }
- { key: environment, operator: NotIn, values: [dev] }
matchLabels
— це звʼязування з парами {key,value}
. Одна пара {key,value}
у
звʼязці matchLabels
еквівалентна елементу matchExpressions
, де поле key
— це "key", оператор — "In", а масив values
містить лише "value". matchExpressions
- це список вимог селектора для вибору Podʼів. Допустимі оператори включають In, NotIn, Exists, та DoesNotExist. Масив values повинен бути непорожнім у випадку In та NotIn. Всі вимоги, як з matchLabels
, так і з matchExpressions
, йдуть разом
з логічною операцією AND — всі вони повинні бути задоволені для збігу.
Вибір множини вузлів
Одним з варіантів використання селекторів на мітках є обмеження множини вузлів, на які може бути заплановано Pod. Дивіться документацію щодо вибору вузла для отримання докладнішої інформації.
Ефективне використання міток
Ви можете застосовувати одну мітку до будь-яких ресурсів, але це не завжди є найкращою практикою. Є багато сценаріїв, де слід використовувати кілька міток для розрізнення наборів ресурсів один від одного.
Наприклад, різні застосунки можуть використовувати різні значення для мітки app
,
але багаторівневий застосунок, такий як приклад гостьової книги, додатково повинен відрізняти кожний рівень. Фронтенд може мати наступні мітки:
labels:
app: guestbook
tier: frontend
тоді як Redis master та replica можуть мати різні мітки tier
, і, можливо, навіть
додаткову мітку role
:
labels:
app: guestbook
tier: backend
role: master
та
labels:
app: guestbook
tier: backend
role: replica
Мітки дозволяють розрізняти ресурси по будь-якому виміру, зазначеному міткою:
kubectl apply -f examples/guestbook/all-in-one/guestbook-all-in-one.yaml
kubectl get pods -Lapp -Ltier -Lrole
NAME READY STATUS RESTARTS AGE APP TIER ROLE
guestbook-fe-4nlpb 1/1 Running 0 1m guestbook frontend <none>
guestbook-fe-ght6d 1/1 Running 0 1m guestbook frontend <none>
guestbook-fe-jpy62 1/1 Running 0 1m guestbook frontend <none>
guestbook-redis-master-5pg3b 1/1 Running 0 1m guestbook backend master
guestbook-redis-replica-2q2yf 1/1 Running 0 1m guestbook backend replica
guestbook-redis-replica-qgazl 1/1 Running 0 1m guestbook backend replica
my-nginx-divi2 1/1 Running 0 29m nginx <none> <none>
my-nginx-o0ef1 1/1 Running 0 29m nginx <none> <none>
kubectl get pods -lapp=guestbook,role=replica
NAME READY STATUS RESTARTS AGE
guestbook-redis-replica-2q2yf 1/1 Running 0 3m
guestbook-redis-replica-qgazl 1/1 Running 0 3m
Оновлення міток
Іноді вам може знадобитися переозначити наявні Podʼи та інші ресурси перед створенням нових ресурсів. Це можна зробити за допомогою kubectl label
. Наприклад, якщо ви хочете позначити всі свої NGINX Podʼи як рівень фронтенду, виконайте:
kubectl label pods -l app=nginx tier=fe
pod/my-nginx-2035384211-j5fhi labeled
pod/my-nginx-2035384211-u2c7e labeled
pod/my-nginx-2035384211-u3t6x labeled
Спочатку фільтруються всі Podʼи з міткою "app=nginx", а потім вони позначаються як "tier=fe". Щоб переглянути Podʼи, які ви позначили, виконайте:
kubectl get pods -l app=nginx -L tier
NAME READY STATUS RESTARTS AGE TIER
my-nginx-2035384211-j5fhi 1/1 Running 0 23m fe
my-nginx-2035384211-u2c7e 1/1 Running 0 23m fe
my-nginx-2035384211-u3t6x 1/1 Running 0 23m fe
Це виводить всі Podʼи "app=nginx", з додатковим стовпчиком міток рівня Podʼів (вказаним за допомогою -L
або --label-columns
).
Для отримання додаткової інформації, будь ласка, див. kubectl label.
Що далі
4 - Простори імен
В Kubernetes простори імен (namespaces) забезпечують механізм для ізоляції груп ресурсів в межах одного кластера. Імена ресурсів повинні бути унікальними в межах простору імен, але не між просторами імен. Засноване на просторах імен обмеження застосовується лише до обʼєктів, які входять до простору імен (наприклад, Deployments, Services тощо), а не до обʼєктів, що поширюються на весь кластер (наприклад, StorageClass, Вузли, PersistentVolumes тощо).
Коли використовувати кілька просторів імен
Простори імен призначені для використання в середовищах з багатьма користувачами, розподіленими в різні команди чи проєкти. Для кластерів з кількома десятками користувачів вам, ймовірно, не потрібно створювати або думати про простори імен. Почніть використовувати простори імен, коли ви потребуєте функції, які вони забезпечують.
Простори імен визначають область імен. Назви ресурсів повинні бути унікальними в межах простору імен, але не між просторами імен. Простори імен не можуть бути вкладені один в одного, і кожен ресурс Kubernetes може бути лише в одному просторі імен.
Простори імен — це спосіб розділити ресурси кластера між кількома користувачами (за допомогою квот ресурсів).
Не обовʼязково використовувати кілька просторів імен для відокремлення трохи відмінних ресурсів, таких як різні версії одного й того ж програмного забезпечення: використовуйте мітки для розрізнення ресурсів в межах одного простору імен.
Примітка:
Для промислового кластера розгляньте можливість не використовувати простір імен default
. Замість цього створюйте і використовуйте інші простори імен.Початкові простори імен
Після запуску в Kubernetes є чотирьох початкових простори імен:
default
- Kubernetes включає цей простір імен, щоб ви могли почати використовувати новий кластер без попереднього створення простору імен.
kube-node-lease
- Цей простір імен містить обʼєкти Оренди, повʼязані з кожним вузлом. Обʼєкти оренди дозволяють kubelet відправляти імпульси, щоб панель управління могла виявити відмову вузла.
kube-public
- Цей простір імен може бути прочитаний усіма клієнтами (включаючи тих, які не автентифіковані). Цей простір імен в основному призначений для внутрішнього використання кластером, у випадку, коли деякі ресурси повинні бути видимими та доступними публічно по всьому кластеру. Публічний аспект цього простору імен — це лише домовленість, яка не є обовʼязковою.
kube-system
- Простір імен для обʼєктів, створених системою Kubernetes.
Робота з просторами імен
Створення та видалення просторів імен описано в документації з адміністрування просторів імен.
Примітка:
Уникайте створення просторів імен із префіксом kube-
, оскільки він зарезервований для системних просторів імен Kubernetes.Перегляд просторів імен
Ви можете переглянути поточні простори імен у кластері за допомогою:
NAME STATUS AGE
default Active 1d
kube-node-lease Active 1d
kube-public Active 1d
kube-system Active 1d
Встановлення простору імен для запиту
Щоб встановити простір імен для поточного запиту, використовуйте прапорець --namespace
.
Наприклад:
kubectl run nginx --image=nginx --namespace=<insert-namespace-name-here>
kubectl get pods --namespace=<insert-namespace-name-here>
Встановлення обраного простору імен
Ви можете постійно зберігати простір імен для всіх подальших команд kubectl в даному
контексті.
kubectl config set-context --current --namespace=<insert-namespace-name-here>
# Перевірте його
kubectl config view --minify | grep namespace:
Простори імен та DNS
При створенні Service, створюється відповідний DNS запис. Цей запис має форму <service-name>.<namespace-name>.svc.cluster.local
, що означає,
що якщо контейнер використовує тільки <service-name>
, він буде звертатись до сервісу, який є локальним для простору імен. Це корисно для використання одного і того ж конфігураційного файлу в кількох просторах імен, таких як Development, Staging та Production. Якщо вам потрібно досягти обʼєкта в іншому просторі імен, вам слід використовувати повне кваліфіковане доменне імʼя (FQDN).
Отже, всі імена просторів імен повинні бути дійсними
DNS-мітками згідно RFC 1123.
Попередження:
Створюючи простори імен із тими ж назвами, що і публічні домени верхнього рівня (TLD), Serviceʼи в цих просторах імен можуть мати короткі імена DNS, які перетинаються з публічними записами DNS. Завдання з будь-якого простору імен, яке виконує DNS-запит без крапки в кінці буде перенаправлено на ці сервіси, отримуючи перевагу над публічним DNS.
Для помʼякшення цього обмеження скоротіть привілеї для створення просторів імен довіреним користувачам. Якщо необхідно, ви можете додатково налаштувати сторонні перевірки на забезпечення безпеки, такі як обробники доступу, щоб блокувати створення будь-якого простору імен з іменем публічних TLD.
Не всі обʼєкти мають простори імен
Більшість ресурсів Kubernetes (наприклад, pods, services, replication controllers та інші) є в деяких просторах імен. Однак ресурси простору імен самі не перебувають в просторі імен. І ресурси низького рівня, такі як nodes та persistentVolumes, не перебувають в жодному просторі імен.
Щоб переглянути, які ресурси Kubernetes є в просторі імен, а які — ні:
# В просторі імен
kubectl api-resources --namespaced=true
# Не в просторі імен
kubectl api-resources --namespaced=false
Автоматичне маркування
СТАН ФУНКЦІОНАЛУ:
Kubernetes 1.22 [stable]
Панель управління Kubernetes встановлює незмінювану мітку kubernetes.io/metadata.name
для всіх просторів імен. Значення мітки — це назва простору імен.
Що далі
5 - Анотації
Ви можете використовувати анотації Kubernetes, щоб додати довільні невизначені метадані до обʼєктів.
Клієнти, такі як інструменти та бібліотеки, можуть отримувати ці метадані.
Ви можете використовувати як мітки, так і анотації для додавання метаданих до обʼєктів Kubernetes. Мітки можна використовувати для вибору обʼєктів та пошуку колекцій обʼєктів, які відповідають певним умовам. На відміну від цього, анотації не використовуються для ідентифікації та вибору обʼєктів. Метадані в анотації можуть бути невеликими або великими, структурованими або неструктурованими, і можуть включати символи, які не дозволяються міткам. Можна використовувати як мітки, так і анотації в метаданих того ж самого обʼєкта.
Анотації, подібно до міток, є парами ключ/значення:
"metadata": {
"annotations": {
"key1" : "value1",
"key2" : "value2"
}
}
Примітка:
Ключі та значення в парі повинні бути рядками. Іншими словами, ви не можете використовувати числові, булеві, спискові або інші типи як для ключів, так і для їх значень.Ось кілька прикладів інформації, яку можна записати в анотаціях:
Поля, керовані декларативним рівнем конфігурації. Додавання цих полів як анотацій відмежовує їх від типових значень, встановлених клієнтами чи серверами, а також від автогенерованих полів та полів, встановлених системами автомасштабування.
Інформація про збірку, реліз чи образ, така як часові мітки, ідентифікатори релізу, гілка git, номера PR, хеші образу та адреса реєстру.
Вказівники на репозиторії логування, моніторингу, аналітики чи аудиту.
Інформація про клієнтську бібліотеку чи інструмент, яку можна використовувати для налагодження: наприклад, назва, версія та інформація про збірку.
Інформація про походження користувача чи інструменту/системи, така як URL-адреси повʼязаних обʼєктів з інших компонентів екосистеми.
Метадані інструменту легкого розгортання: наприклад, конфігурація чи контрольні точки.
Номери телефонів або пейджерів відповідальних осіб, чи записи в каталозі, які вказують, де можна знайти цю інформацію, наприклад, на вебсайті команди.
Директиви від кінцевого користувача до реалізації щодо зміни поведінки чи використання нестандартних функцій.
Замість використання анотацій, ви можете зберігати цей тип інформації у зовнішній базі даних чи каталозі, але це ускладнило б створення загальних бібліотек та інструментів для впровадження, управління, інтроспекції, та подібного.
Синтаксис та набір символів
Анотації — це пари ключ/значення. Допустимі ключі анотацій мають два сегменти: необовʼязковий префікс і назва, розділені косою рискою (/
). Назва є обовʼязковою та має містити не більше 63 символів, починаючи та закінчуючись буквено-цифровим символом ([a-z0-9A-Z]
), тире (-
), підкресленням (_
), крапкою (.
) та буквено-цифровими символами між ними. Префікс є необовʼязковим. Якщо вказано, префікс повинен бути піддоменом DNS: серією DNS-міток, розділених крапками (.
), загальною довжиною не більше 253 символів, за якою слідує коса риска (/
).
Якщо префікс відсутній, ключ анотації вважається приватним для користувача. Автоматизовані компоненти системи (наприклад, kube-scheduler
, kube-controller-manager
, kube-apiserver
, kubectl
чи інші автоматизовані засоби від сторонніх розробників), які додають анотації до обʼєктів кінцевого користувача, повинні вказати префікс.
Префікси kubernetes.io/
та k8s.io/
зарезервовані для основних компонентів Kubernetes.
Наприклад, ось маніфест для Pod, який має анотацію imageregistry: https://hub.docker.com/
:
apiVersion: v1
kind: Pod
metadata:
name: annotations-demo
annotations:
imageregistry: "https://hub.docker.com/"
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Що далі
6 - Селектори полів
Селектори полів дозволяють вам вибирати обʼєкти Kubernetes на основі значень одного або кількох полів ресурсу. Ось кілька прикладів запитань для селекторів полів:
metadata.name=my-service
metadata.namespace!=default
status.phase=Pending
Ця команда kubectl
вибирає всі Podʼи, для яких значення поля status.phase
дорівнює Running
:
kubectl get pods --field-selector status.phase=Running
Примітка:
Селектори полів, по суті, є фільтрами ресурсів. Типово селектори/фільтри не застосовуються, а це означає, що вибрані всі ресурси вказаного типу. Це робить запити kubectl kubectl get pods
та kubectl get pods --field-selector ""
еквівалентними.Підтримувані поля
Підтримувані селектори полів варіюються залежно від типу ресурсу Kubernetes. Усі типи ресурсів підтримують поля metadata.name
та metadata.namespace
. Використання селекторів до полів, що їх не підтримують, призводить до помилки. Наприклад:
kubectl get ingress --field-selector foo.bar=baz
Error from server (BadRequest): Unable to find "ingresses" that match label selector "", field selector "foo.bar=baz": "foo.bar" is not a known field selector: only "metadata.name", "metadata.namespace"
Список підтримуваних полів
Вид | Поля |
---|
Pod | spec.nodeName
spec.restartPolicy
spec.schedulerName
spec.serviceAccountName
spec.hostNetwork
status.phase
status.podIP
status.nominatedNodeName |
Event | involvedObject.kind
involvedObject.namespace
involvedObject.name
involvedObject.uid
involvedObject.apiVersion
involvedObject.resourceVersion
involvedObject.fieldPath
reason
reportingComponent
source
type |
Secret | type |
Namespace | status.phase |
ReplicaSet | status.replicas |
ReplicationController | status.replicas |
Job | status.successful |
Node | spec.unschedulable |
CertificateSigningRequest | spec.signerName |
Поля власних ресурсів
Усі власні типи ресурсів підтримують поля metadata.name
та metadata.namespace
.
Крім того, поле spec.versions[*].selectableFields
у CustomResourceDefinition оголошує, які інші поля власного ресурсу можна використовувати у селекторах полів. Дивіться статтю поля, які можна вибрати для власних ресурсів або додаткові відомості про те, як використовувати селектори полів з CustomResourceDefinitions.
Підтримувані оператори
Ви можете використовувати оператори =
, ==
та !=
з селекторами полів (=
та ==
означають те саме). Наприклад, ця команда kubectl
вибирає всі сервіси Kubernetes, які не знаходяться в просторі імен default
:
kubectl get services --all-namespaces --field-selector metadata.namespace!=default
Ланцюжки селекторів
Як і з мітками та іншими селекторами, селектори полів можна складати у список, розділений комами. Ця команда kubectl
вибирає всі Podʼи, для яких значення status.phase
не дорівнює Running
, а поле spec.restartPolicy
дорівнює Always
:
kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always
Кілька типів ресурсів
Ви можете використовувати селектори полів для кількох типів ресурсів. Ця команда kubectl
вибирає всі Statefulsets та Services, які не знаходяться в просторі імен default
:
kubectl get statefulsets,services --all-namespaces --field-selector metadata.namespace!=default
7 - Завершувачі
Завершувачі — це ключі простору імен, які наказують Kubernetes чекати до виконання певних умов перед тим, як повністю видаляти ресурси, позначені для видалення. Завершувачі попереджають контролери про очищення ресурсів, які належать обʼєкту, що вилучається.
Коли ви наказуєте Kubernetes видалити обʼєкт, для якого є завершувачі, API Kubernetes позначає обʼєкт для видалення, заповнюючи поле .metadata.deletionTimestamp
, і повертає статус-код 202
(HTTP "Accepted"). Цільовий обʼєкт залишається в стані завершення, поки панель управління чи інші компоненти виконують дії, визначені завершувачами. Після завершення цих дій контролер видаляє відповідні завершувачі з цільового обʼєкта. Коли поле metadata.finalizers
порожнє, Kubernetes вважає видалення завершеним і видаляє обʼєкт.
Ви можете використовувати завершувачі для управління збором сміття ресурсів. Наприклад, ви можете визначити завершувач для очищення повʼязаних ресурсів чи інфраструктури перед тим, як контролер видалить цільовий ресурс.
Ви можете використовувати завершувачі для управління збиранням сміття з обʼєктів за допомогою надсилань повідомлень контролерам з вимогою виконати певні завдання з очищення перед видаленням цільового ресурсу.
Зазвичай завершувачі не вказують код для виконання. Замість цього вони являють собою списки ключів для конкретного ресурсу, аналогічні анотаціям. Kubernetes автоматично вказує деякі завершувачі, але ви також можете вказати свої.
Як працюють завершувачі
При створенні ресурсу за допомогою файлу маніфесту ви можете вказати завершувачі у полі metadata.finalizers
. Коли ви намагаєтеся видалити ресурс, сервер API, що обробляє запит на видалення, помічає значення у полі finalizers
і робить наступне:
- Модифікує обʼєкт, додаючи поле
metadata.deletionTimestamp
з часом, коли ви почали видалення. - Запобігає видаленню обʼєкта, поки всі елементи не будуть видалені з його поля
metadata.finalizers
. - Повертає код статусу
202
(HTTP "Accepted")
Контролер, який керує цим завершувачем, помічає оновлення обʼєкта і встановлення metadata.deletionTimestamp
, що вказує на те, що було запрошене видалення обʼєкта. Контролер потім намагається виконати вимоги, вказані для цього ресурсу завершувачами. Кожного разу, коли виконується умова завершувача, контролер видаляє цей ключ із поля finalizers
ресурсу. Коли поле finalizers
порожнє, обʼєкт із встановленим полем deletionTimestamp
автоматично видаляється. Ви також можете використовувати завершувачі для запобігання видаленню некерованих ресурсів.
Розповсюджений приклад завершувача — kubernetes.io/pv-protection
, який запобігає
випадковому видаленню обʼєктів PersistentVolume
. Коли обʼєкт PersistentVolume
використовується у Podʼі, Kubernetes додає завершувач pv-protection
. Якщо ви
намагаєтеся видалити PersistentVolume
, він потрапляє в стан Terminating
, але
контролер не може видалити його через наявність завершувача. Коли Pod перестає
використовувати PersistentVolume
, Kubernetes очищує завершувач pv-protection
,
і контролер видаляє обʼєкт.
Примітка:
Коли ви видаляєте обʼєкт за допомогою DELETE
, Kubernetes додає відмітку видалення для цього обʼєкта і тут же починає обмежувати зміни в полі .metadata.finalizers
для обʼєкта, який тепер очікує видалення. Ви можете видаляти наявні завершувачі (видаляти запис зі списку finalizers
), але не можете додати новий завершувач. Ви також не можете модифікувати deletionTimestamp
для обʼєкта, якщо він вже встановлений.
Після запиту на видалення ви не можете відновити цей обʼєкт. Єдиний спосіб — видалити його і створити новий схожий обʼєкт.
Власники, мітки та завершувачі
Так само як і мітки, посилання на власника описують стосунки між обʼєктами в Kubernetes, але використовуються для іншої цілі. Коли контролер керує обʼєктами типу Pod, він використовує мітки для відстеження змін у групах повʼязаних обʼєктів. Наприклад, коли Завдання створює один чи
декілька Podʼів, контролер Завдання додає мітки до цих Podʼів та відстежує зміни
у будь-яких Podʼах у кластері з такою ж міткою.
Контролер Завдання також додає посилання на власника до цих Podʼів, посилаючись на Завдання, яке створило Podʼи. Якщо ви видаляєте Завдання, поки ці Podʼи працюють, Kubernetes використовує посилання на власника (а не мітки), щоб визначити, які Podʼи в кластері потрібно прибрати.
Kubernetes також обробляє завершувачі, коли визначає посилання на власника ресурсу, призначене для видалення.
У деяких ситуаціях завершувачі можуть блокувати видалення залежних обʼєктів, що може призвести до того, що цільовий обʼєкт-власник залишиться довше, ніж очікувалося, не буде повністю видалений. У таких ситуаціях вам слід перевірити завершувачі та посилання на власника, на цільового власника та залежні
обʼєкти для усунення несправностей.
Примітка:
У випадках, коли обʼєкти застрягають в стані видалення, уникайте ручного видалення завершувачів для продовження процесу видалення. Завершувачі, як правило, додаються до ресурсів з певною метою, тому примусове їх видалення може призвести до проблем у вашому кластері. Це слід робити лише тоді, коли призначення завершувача зрозуміло та може бути виконано іншим способом (наприклад, ручне очищення деякого залежного обʼєкта).Що далі
8 - Власники та Залежності
В Kubernetes деякі обʼєкти є
власниками інших обʼєктів. Наприклад, ReplicaSet є власником групи Podʼів. Ці обʼєкти, якими володіють, є залежними від свого власника.
Власність відрізняється від механізму міток та селекторів, який також використовують деякі ресурси. Наприклад, розгляньте Service, який створює обʼєкти EndpointSlice
. Service використовує мітки щоби панель управління могла
визначити, які обʼєкти EndpointSlice
використовуються для цього Service. Крім того, до міток, кожен EndpointSlice
, який керується від імені Service, має
посилання на власника. Посилання на власника допомагають різним частинам Kubernetes уникати втручання в обʼєкти, якими вони не керують.
Посилання на власника в специфікаціях обʼєктів
Залежні обʼєкти мають поле metadata.ownerReferences
, яке містить посилання на їх власника. Дійсне посилання на власника складається з назви обʼєкта та UID в межах того ж простору імен, що й залежний обʼєкт. Kubernetes автоматично встановлює значення цього поля для обʼєктів, які є залежностями інших обʼєктів, таких як ReplicaSets, DaemonSets, Deployments, Jobs and CronJobs, та ReplicationControllers. Ви також можете налаштувати ці звʼязки вручну, змінивши значення цього поля. Однак зазвичай цього не потрібно робити, і можна дозволити Kubernetes автоматично керувати цими звʼязками.
Залежні обʼєкти також мають поле ownerReferences.blockOwnerDeletion
, яке має булеве значення і контролює, чи можуть певні залежні обʼєкти блокувати збір сміття, що видаляє їх власника. Kubernetes автоматично встановлює це поле в true
, якщо контролер (наприклад, контролер Deployment) встановлює значення поля metadata.ownerReferences
. Ви також можете встановити значення поля blockOwnerDeletion
вручну, щоб контролювати, які залежні обʼєкти блокують збір сміття.
Контролер доступу Kubernetes контролює доступ користувачів для зміни цього поля для залежних ресурсів на основі прав видалення власника. Це керування перешкоджає несанкціонованим користувачам затримувати видалення обʼєкта-власника.
Примітка:
Посилання на власника поза межами простору імен заборонені. Залежні обʼєкти в просторі імен можуть вказувати власників або на рівні кластера, або в тому ж просторі імен. Якщо цього не відбувається, посилання на власника розглядається як відсутнє, і залежний обʼєкт може бути видалений, якщо всі власники визначено як відсутні.
Обʼєкти в просторі імен можуть вказувати тільки власників в межах кластера. У версії v1.20+, якщо обʼєкт в просторі імен вказує обʼєкт кластера як власника, він розглядається як обʼєкт з нерозвʼязаним посиланням на власника і не може бути вилучений.
У v1.20+, якщо збирач сміття виявляє недійсний перехресний простір імен ownerReference
або залежний обʼєкт на рівні кластера з ownerReference
, що посилається на тип простору імен, зʼявляється повідомлення з попередженням з причиною OwnerRefInvalidNamespace
та involvedObject
про недійсного залежного. Ви можете перевірити наявність такого роду подій (Event), запустивши kubectl get events -A --field-selector=reason=OwnerRefInvalidNamespace
.
Власність та завершувачі
Коли ви наказуєте Kubernetes видалити ресурс, сервер API дозволяє керуючому контролеру обробити будь-які правила завершувача для ресурсу. Завершувачі запобігають випадковому видаленню ресурсів, які вашому кластеру можуть ще бути потрібні для коректної роботи. Наприклад, якщо ви намагаєтеся видалити PersistentVolume, який все ще використовується Podʼом, видалення не відбувається негайно, оскільки PersistentVolume
має завершувач kubernetes.io/pv-protection
. Замість цього том залишається в стані Terminating
до тих пір, поки Kubernetes не очистить завершувач, що відбувається тільки після того, як PersistentVolume
більше не привʼязаний до Podʼа.
Kubernetes також додає завершувачів до ресурсу-власника, коли ви використовуєте або переднє або інше каскадне видалення. При передньому видаленні додається завершувач foreground
, так що контролер повинен видалити залежні ресурси, які також мають ownerReferences.blockOwnerDeletion=true
, перш ніж він видалить власника. Якщо ви вказуєте політику видалення покинутих ресурсів (сиріт), Kubernetes додає завершувач orphan
, так що контролер ігнорує залежні ресурси після того, як він видаляє обʼєкт-власника.
Що далі
9 - Рекомендовані Мітки
Ви можете візуалізувати та керувати обʼєктами Kubernetes за допомогою інших інструментів, ніж kubectl та панель інструментів (dashboard). Загальний набір міток дозволяє інструментам працювати між собою, описуючи обʼєкти спільним чином, який можуть розуміти всі інструменти.
Крім підтримки інструментів, рекомендовані мітки описують застосунки так, що до них можна звертатись.
Метадані організовані навколо концепції застосунку. Kubernetes не є платформою як сервіс (PaaS) і не має формального поняття застосунку або його виконання. Замість цього застосунки є неформальними та описуються метаданими. Визначення того, що включає застосунок, є гнучким.
Примітка:
Це рекомендовані мітки. Вони полегшують управління застосунками, але не обовʼязкові для будь-яких основних інструментів.Спільні мітки та анотації мають спільний префікс: app.kubernetes.io
. Мітки без префіксу є приватними для користувачів. Спільний префікс забезпечує, що спільні мітки не втручаються у власні мітки користувача.
Мітки
Щоб повною мірою скористатися цими мітками, їх слід застосовувати до кожного обʼєкта ресурсу.
Ключ | Опис | Приклад | Тип |
---|
app.kubernetes.io/name | Назва застосунку | mysql | рядок |
app.kubernetes.io/instance | Унікальна назва, що ідентифікує екземпляр застосунку | mysql-abcxyz | рядок |
app.kubernetes.io/version | Поточна версія застосунку (наприклад, SemVer 1.0, хеш ревізії і т.д.) | 5.7.21 | рядок |
app.kubernetes.io/component | Компонент всередині архітектури | database | рядок |
app.kubernetes.io/part-of | Назва вищого рівня застосунку, частину якого складає цей | wordpress | рядок |
app.kubernetes.io/managed-by | Інструмент, який використовується для управління операцією застосунку | Helm | рядок |
Щоб проілюструвати ці мітки в дії, розгляньте наступний обʼєкт StatefulSet:
# Це уривок
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app.kubernetes.io/name: mysql
app.kubernetes.io/instance: mysql-abcxyz
app.kubernetes.io/version: "5.7.21"
app.kubernetes.io/component: database
app.kubernetes.io/part-of: wordpress
app.kubernetes.io/managed-by: Helm
Застосунки та екземпляри застосунків
Застосунок можна встановити один або декілька разів в кластер Kubernetes і, у деяких випадках, в тому ж просторі імен. Наприклад, WordPress можна встановити більше одного разу, де різні вебсайти є різними екземплярами WordPress.
Назва застосунку та назва екземпляра записуються окремо. Наприклад, у WordPress є app.kubernetes.io/name
— wordpress
, тоді як назва екземпляра представлена як app.kubernetes.io/instance
зі значенням wordpress-abcxyz
. Це дозволяє ідентифікувати застосунок та його екземпляр. Кожен екземпляр застосунку повинен мати унікальну назву.
Приклади
Щоб проілюструвати різні способи використання цих міток, наведено різні приклади складності.
Простий Stateless Service
Розгляньте випадок простого Stateless Serviceʼу, розгорнутого за допомогою обʼєктів Deployment
та Service
. Наведені нижче два уривки представляють, як можуть бути використані мітки у їх найпростішій формі.
Deployment
використовується для нагляду за Podʼами, які виконують сам застосунок.
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: myservice
app.kubernetes.io/instance: myservice-abcxyz
...
Service
використовується для відкриття доступу до застосунку.
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/name: myservice
app.kubernetes.io/instance: myservice-abcxyz
...
Вебзастосунок із базою даних
Розгляньмо трохи складніший застосунок: вебзастосунок (WordPress) із базою даних (MySQL), встановлений за допомогою Helm. Наведені нижче уривки ілюструють початок обʼєктів, які використовуються для розгортання цього застосунку.
Початок цього Deployment
використовується для WordPress:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: wordpress
app.kubernetes.io/instance: wordpress-abcxyz
app.kubernetes.io/version: "4.9.4"
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: server
app.kubernetes.io/part-of: wordpress
...
Service
використовується для відкриття доступу до WordPress:
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/name: wordpress
app.kubernetes.io/instance: wordpress-abcxyz
app.kubernetes.io/version: "4.9.4"
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: server
app.kubernetes.io/part-of: wordpress
...
MySQL представлено як StatefulSet
з метаданими як для нього, так і для застосунку, до якого він належить:
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app.kubernetes.io/name: mysql
app.kubernetes.io/instance: mysql-abcxyz
app.kubernetes.io/version: "5.7.21"
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: database
app.kubernetes.io/part-of: wordpress
...
Service
використовується для відкриття доступу до MySQL як частини WordPress:
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/name: mysql
app.kubernetes.io/instance: mysql-abcxyz
app.kubernetes.io/version: "5.7.21"
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: database
app.kubernetes.io/part-of: wordpress
...
З MySQL StatefulSet
та Service
ви побачите, що включена інформація як про MySQL, так і про WordPress.