Модуль 2.1: Деплойменти — глибоке занурення
Складність:
[MEDIUM]— ключова навичка CKAD з кількома операціямиЧас на виконання: 45–55 хвилин
Передумови: Частина 1 завершена, розуміння Подів та ReplicaSet
Що ви зможете робити
Розділ «Що ви зможете робити»Після завершення цього модуля ви зможете:
- Розгорнути застосунки за допомогою Деплойментів з правильною кількістю реплік та стратегіями оновлення
- Налаштувати параметри ковзного оновлення, включно з
maxSurgeтаmaxUnavailable - Діагностувати завислі розгортання та виконувати відкати за допомогою команд
kubectl rollout - Реалізувати операції масштабування як імперативно, так і декларативно
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»Деплойменти — це спосіб запуску застосунків у продакшн Kubernetes. Вони керують ReplicaSet, які керують Подами. Розуміння Деплойментів означає розуміння ковзних оновлень, відкатів, масштабування та повного життєвого циклу вашого застосунку.
CKAD активно тестує операції з Деплойментами:
- Створення та масштабування Деплойментів
- Виконання ковзних оновлень
- Відкат до попередніх версій
- Призупинення та відновлення розгортань
- Перевірка статусу та історії розгортання
Аналогія з конвеєром випуску ПЗ
Деплоймент — це як реліз-менеджер. Коли ви хочете випустити нову версію, реліз-менеджер (Деплоймент) створює нову виробничу лінію (ReplicaSet) з новим кодом. Він поступово переводить трафік зі старої лінії на нову. Якщо щось піде не так, він може швидко повернутися до старої лінії. Робітники (Поди) просто виконують інструкції — Деплоймент оркеструє все.
Основи Деплойментів
Розділ «Основи Деплойментів»Створення Деплойментів
Розділ «Створення Деплойментів»# Імперативне створенняk create deploy nginx --image=nginx:1.21 --replicas=3
# З портомk create deploy web --image=nginx --port=80
# Згенерувати YAMLk create deploy api --image=httpd --replicas=2 --dry-run=client -o yaml > deploy.yamlСтруктура YAML Деплойменту
Розділ «Структура YAML Деплойменту»apiVersion: apps/v1kind: Deploymentmetadata: name: web-app labels: app: webspec: replicas: 3 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: nginx image: nginx:1.21 ports: - containerPort: 80 resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m"Ключові компоненти
Розділ «Ключові компоненти»| Компонент | Призначення |
|---|---|
replicas | Кількість копій Подів для запуску |
selector.matchLabels | Як Деплоймент знаходить свої Поди |
template | Специфікація Поду (мітки мають збігатися з selector) |
strategy | Спосіб виконання оновлень |
Масштабування Деплойментів
Розділ «Масштабування Деплойментів»Ручне масштабування
Розділ «Ручне масштабування»# Масштабувати до 5 реплікk scale deploy web-app --replicas=5
# Масштабувати до нуля (зупинити всі поди)k scale deploy web-app --replicas=0
# Масштабувати кілька деплойментівk scale deploy web-app api-server --replicas=3Перевірка масштабування
Розділ «Перевірка масштабування»# Спостерігати за масштабуванням подівk get pods -l app=web -w
# Перевірити статус деплойментуk get deploy web-app
# Детальний статусk describe deploy web-app | grep -A5 ReplicasКовзні оновлення
Розділ «Ковзні оновлення»Ковзні оновлення замінюють Поди поступово, забезпечуючи нульовий час простою.
Оновлення образу
Розділ «Оновлення образу»# Оновити образ контейнераk set image deploy/web-app nginx=nginx:1.22
# Оновити з записом (застаріло, але працює)k set image deploy/web-app nginx=nginx:1.22 --record
# Оновити через patchk patch deploy web-app -p '{"spec":{"template":{"spec":{"containers":[{"name":"nginx","image":"nginx:1.22"}]}}}}'Конфігурація стратегії оновлення
Розділ «Конфігурація стратегії оновлення»spec: strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 # Макс. подів понад бажану кількість під час оновлення maxUnavailable: 0 # Макс. подів недоступних під час оновлення| Параметр | Опис | Приклад |
|---|---|---|
maxSurge | Додаткові поди, дозволені під час оновлення | 1 або 25% |
maxUnavailable | Поди, які можуть бути недоступні під час оновлення | 0 або 25% |
MaxUnavailable у StatefulSet
StatefulSet підтримують
maxUnavailableу своїйupdateStrategy(GA з K8s 1.27), що дозволяє паралельне оновлення подів замість послідовного по одному. Це може зробити оновлення StatefulSet до 60% швидшими — критично для кластерів баз даних та stateful-навантажень:updateStrategy:type: RollingUpdaterollingUpdate:maxUnavailable: 2 # Оновлювати 2 поди одночасно замість 1
Типи стратегій
Розділ «Типи стратегій»# RollingUpdate (за замовчуванням) — поступова замінаstrategy: type: RollingUpdate
# Recreate — знищити все, потім створити новеstrategy: type: RecreateВикористовуйте Recreate, коли:
- Застосунок не може працювати з кількома версіями одночасно
- Міграції бази даних вимагають єдиної версії
- Час простою є прийнятним
Моніторинг розгортань
Розділ «Моніторинг розгортань»Перевірка статусу розгортання
Розділ «Перевірка статусу розгортання»# Спостерігати за ходом розгортанняk rollout status deploy/web-app
# Перевірити, чи завершилося розгортанняk rollout status deploy/web-app --timeout=60sПерегляд історії розгортання
Розділ «Перегляд історії розгортання»# Список історії ревізійk rollout history deploy/web-app
# Деталі конкретної ревізіїk rollout history deploy/web-app --revision=2
# Поточна ревізіяk describe deploy web-app | grep -i revisionПризупинення та відновлення
Розділ «Призупинення та відновлення»# Призупинити розгортання (для пакетних змін)k rollout pause deploy/web-app
# Внести кілька змін поки призупиненоk set image deploy/web-app nginx=nginx:1.23k set resources deploy/web-app -c nginx --limits=memory=256Mi
# Відновити розгортанняk rollout resume deploy/web-appВідкати
Розділ «Відкати»Відкат до попередньої версії
Розділ «Відкат до попередньої версії»# Відкат до попередньої ревізіїk rollout undo deploy/web-app
# Відкат до конкретної ревізіїk rollout undo deploy/web-app --to-revision=2
# Перевірити статус відкатуk rollout status deploy/web-appРозуміння ревізій
Розділ «Розуміння ревізій»# Кожна зміна створює новий ReplicaSetk get rs -l app=web
# Вивід:# NAME DESIRED CURRENT READY AGE# web-app-6d8f9b6b4f 3 3 3 5m (поточний)# web-app-7b8c9d4e3a 0 0 0 10m (попередній)Старі ReplicaSet зберігаються (масштабовані до 0) для можливості відкату.
Обмеження історії ревізій
Розділ «Обмеження історії ревізій»spec: revisionHistoryLimit: 5 # Зберігати лише 5 старих ReplicaSetСтани Деплойменту
Розділ «Стани Деплойменту»Перевірка стану Деплойменту
Розділ «Перевірка стану Деплойменту»# Отримати станиk get deploy web-app -o jsonpath='{.status.conditions[*].type}'
# Детальні станиk describe deploy web-app | grep -A10 ConditionsТипові стани
Розділ «Типові стани»| Стан | Значення |
|---|---|
Available | Мінімальна кількість реплік доступна |
Progressing | Деплоймент оновлюється |
ReplicaFailure | Не вдалося створити поди |
Дедлайн прогресу Деплойменту
Розділ «Дедлайн прогресу Деплойменту»spec: progressDeadlineSeconds: 600 # Збій, якщо немає прогресу протягом 10 хвЯкщо розгортання застрягає (наприклад, помилка завантаження образу), воно позначається як невдале після цього дедлайну.
Мітки та селектори
Розділ «Мітки та селектори»Правила селекторів
Розділ «Правила селекторів»selector.matchLabels МУСИТЬ збігатися з template.metadata.labels:
spec: selector: matchLabels: app: web # Має збігатися з нижче tier: frontend template: metadata: labels: app: web # Має збігатися з вище tier: frontend version: v1 # Може мати додаткові міткиОновлення міток
Розділ «Оновлення міток»# Додати мітку до деплойменту (лише метадані)k label deploy web-app environment=production
# Додати мітку до подів через шаблон (запускає розгортання)k patch deploy web-app -p '{"spec":{"template":{"metadata":{"labels":{"version":"v2"}}}}}'Швидкий довідник типових операцій
Розділ «Швидкий довідник типових операцій»# Створитиk create deploy NAME --image=IMAGE --replicas=N
# Масштабуватиk scale deploy NAME --replicas=N
# Оновити образk set image deploy/NAME CONTAINER=IMAGE
# Оновити ресурсиk set resources deploy NAME -c CONTAINER --limits=cpu=200m,memory=512Mi
# Статус розгортанняk rollout status deploy/NAME
# Історія розгортанняk rollout history deploy/NAME
# Відкатk rollout undo deploy/NAME
# Призупинити/Відновитиk rollout pause deploy/NAMEk rollout resume deploy/NAME
# Перезапустити всі поди (ковзний)k rollout restart deploy/NAMEЧи знали ви?
Розділ «Чи знали ви?»-
kubectl rollout restartзапускає ковзний перезапуск без зміни образу. Він додає анотацію з поточною міткою часу, що викликає перестворення подів. Чудово підходить для підхоплення змін у ConfigMap. -
Деплойменти не видаляють старі ReplicaSet одразу. Вони зберігають їх (масштабованими до 0) для можливості відкату. Керуйте цим через
revisionHistoryLimit. -
Прапорець
--recordє застарілим, але все ще працює. Kubernetes 1.22+ рекомендує використовувати анотації замість нього для відстеження причин змін.
Типові помилки
Розділ «Типові помилки»| Помилка | Чому це шкодить | Рішення |
|---|---|---|
| Селектор не збігається з мітками шаблону | Деплоймент не може знайти свої поди | Переконайтесь, що мітки збігаються точно |
Використання Recreate у продакшні | Спричиняє простій | Використовуйте RollingUpdate з правильними налаштуваннями |
maxUnavailable: 100% | Усі поди знищуються одночасно | Встановіть розумні відсотки |
| Забули перевірити статус розгортання | Не знаєте, чи оновлення вдалося | Завжди виконуйте rollout status |
| Не встановлено ліміти ресурсів | Поди можуть спожити всі ресурси вузла | Завжди встановлюйте requests та limits |
Тест
Розділ «Тест»-
Як виконати відкат Деплойменту до ревізії 3?
Відповідь
`kubectl rollout undo deploy/NAME --to-revision=3` -
Яка різниця між стратегіями
RollingUpdateтаRecreate?Відповідь
`RollingUpdate` поступово замінює поди (нульовий час простою), тоді як `Recreate` завершує всі наявні поди перед створенням нових (спричиняє простій, але гарантує роботу лише однієї версії). -
Як запустити ковзний перезапуск без зміни образу?
Відповідь
`kubectl rollout restart deploy/NAME`. Це додає анотацію з міткою часу, що запускає перестворення подів. -
Що станеться, якщо мітки селектора не збігаються з мітками шаблону?
Відповідь
Деплоймент не зможе знайти або керувати своїми подами. API-сервер відхилить Деплоймент з помилкою валідації.
Практична вправа
Розділ «Практична вправа»Завдання: Відпрактикуйте повний життєвий цикл Деплойменту.
Частина 1: Створення та масштабування
# Створити деплойментk create deploy webapp --image=nginx:1.20 --replicas=2
# Перевіритиk get deploy webappk get pods -l app=webapp
# Масштабувати вгоруk scale deploy webapp --replicas=5
# Перевірити масштабуванняk get pods -l app=webapp -wЧастина 2: Ковзне оновлення
# Оновити образk set image deploy/webapp nginx=nginx:1.21
# Спостерігати за розгортаннямk rollout status deploy/webapp
# Перевірити історіюk rollout history deploy/webapp
# Оновити зновуk set image deploy/webapp nginx=nginx:1.22Частина 3: Відкат
# Відкат до попередньоїk rollout undo deploy/webapp
# Перевірити, що образ повернувсяk describe deploy webapp | grep Image
# Відкат до конкретної ревізіїk rollout history deploy/webappk rollout undo deploy/webapp --to-revision=1Частина 4: Призупинення та пакетні зміни
# Призупинитиk rollout pause deploy/webapp
# Внести кілька змінk set image deploy/webapp nginx=nginx:1.23k set resources deploy/webapp -c nginx --limits=memory=128Mi
# Відновитиk rollout resume deploy/webapp
# Перевірити єдине розгортанняk rollout status deploy/webappОчищення:
k delete deploy webappПрактичні вправи
Розділ «Практичні вправи»Вправа 1: Базовий Деплоймент (Ціль: 2 хвилини)
Розділ «Вправа 1: Базовий Деплоймент (Ціль: 2 хвилини)»# Створити деплоймент з 3 реплікамиk create deploy drill1 --image=nginx --replicas=3
# Перевірити, що всі поди працюютьk get pods -l app=drill1
# Масштабувати до 5k scale deploy drill1 --replicas=5
# Перевіритиk get deploy drill1
# Очищенняk delete deploy drill1Вправа 2: Оновлення образу (Ціль: 3 хвилини)
Розділ «Вправа 2: Оновлення образу (Ціль: 3 хвилини)»# Створити деплойментk create deploy drill2 --image=nginx:1.20
# Оновити образk set image deploy/drill2 nginx=nginx:1.21
# Перевірити статус розгортанняk rollout status deploy/drill2
# Перевірити новий образk describe deploy drill2 | grep Image
# Очищенняk delete deploy drill2Вправа 3: Відкат (Ціль: 3 хвилини)
Розділ «Вправа 3: Відкат (Ціль: 3 хвилини)»# Створити та оновити кілька разівk create deploy drill3 --image=nginx:1.19k set image deploy/drill3 nginx=nginx:1.20k set image deploy/drill3 nginx=nginx:1.21
# Перевірити історіюk rollout history deploy/drill3
# Відкат до ревізії 1k rollout undo deploy/drill3 --to-revision=1
# Перевірити, що образ — 1.19k describe deploy drill3 | grep Image
# Очищенняk delete deploy drill3Вправа 4: Налаштування ковзного оновлення (Ціль: 4 хвилини)
Розділ «Вправа 4: Налаштування ковзного оновлення (Ціль: 4 хвилини)»# Створити деплоймент з кастомною стратегієюcat << 'EOF' | k apply -f -apiVersion: apps/v1kind: Deploymentmetadata: name: drill4spec: replicas: 4 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0 selector: matchLabels: app: drill4 template: metadata: labels: app: drill4 spec: containers: - name: nginx image: nginx:1.20EOF
# Оновити та спостерігати (має бути макс. 5 подів, 4 завжди готові)k set image deploy/drill4 nginx=nginx:1.21k get pods -l app=drill4 -w
# Очищенняk delete deploy drill4Вправа 5: Призупинення та відновлення (Ціль: 3 хвилини)
Розділ «Вправа 5: Призупинення та відновлення (Ціль: 3 хвилини)»# Створити деплойментk create deploy drill5 --image=nginx:1.20
# Призупинитиk rollout pause deploy/drill5
# Внести зміни (розгортання поки немає)k set image deploy/drill5 nginx=nginx:1.21k set resources deploy/drill5 -c nginx --requests=cpu=100m
# Перевірити, що призупиненоk rollout status deploy/drill5
# Відновитиk rollout resume deploy/drill5
# Перевірити, що єдине розгортання застосувало обидві зміниk rollout status deploy/drill5
# Очищенняk delete deploy drill5Вправа 6: Повний сценарій Деплойменту (Ціль: 6 хвилин)
Розділ «Вправа 6: Повний сценарій Деплойменту (Ціль: 6 хвилин)»Сценарій: Розгорнути застосунок, оновити його, зіткнутися з проблемою та виконати відкат.
# 1. Створити початковий деплойментk create deploy production --image=nginx:1.20 --replicas=3
# 2. Створити сервісk expose deploy production --port=80
# 3. Перевірити працездатністьk rollout status deploy/productionk get pods -l app=production
# 4. Оновити до "зламаного" образу (симуляція поганого релізу)k set image deploy/production nginx=nginx:broken-tag
# 5. Перевірити, що розгортання застряглоk rollout status deploy/production --timeout=30s
# 6. Побачити проблемні подиk get pods -l app=production
# 7. Швидкий відкатk rollout undo deploy/production
# 8. Перевірити відновленняk rollout status deploy/productionk get pods -l app=production
# 9. Очищенняk delete deploy productionk delete svc productionНаступний модуль
Розділ «Наступний модуль»Модуль 2.2: Пакетний менеджер Helm — розгортання та керування застосунками за допомогою Helm-чартів.