Модуль 3.1: Проби застосунків
Складність:
[MEDIUM]— Критична тема іспиту з кількома типами пробЧас на виконання: 40–50 хвилин
Передумови: Модуль 1.1 (Поди), розуміння життєвого циклу контейнера
Що ви зможете робити
Розділ «Що ви зможете робити»Після завершення цього модуля ви зможете:
- Налаштувати проби liveness, readiness та startup з відповідними порогами та часовими параметрами
- Діагностувати цикли перезапуску Підів та проблеми маршрутизації трафіку, спричинені неправильно налаштованими пробами
- Пояснити різницю між пробами liveness, readiness та startup і коли кожна застосовується
- Реалізувати проби HTTP, TCP та exec, підібрані до можливостей перевірки здоров’я вашого застосунку
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»Проби повідомляють Kubernetes, як перевірити, чи ваш застосунок живий, чи готовий отримувати трафік, чи потребує більше часу на запуск. Без проб Kubernetes не може дізнатися, чи ваш застосунок насправді працює — він лише знає, чи процес контейнера запущений.
Іспит CKAD часто перевіряє проби, оскільки вони необхідні для продакшн-застосунків. Очікуйте запитання про:
- Налаштування проб liveness, readiness та startup
- Вибір між HTTP, TCP та exec пробами
- Встановлення відповідних порогів і часових параметрів
Аналогія з медичним оглядом
Уявіть проби як систему моніторингу в лікарні. Проба liveness перевіряє, чи пацієнт живий (якщо ні — екстрена допомога). Проба readiness перевіряє, чи пацієнт може приймати відвідувачів (якщо ні — відвідувачів поки не пускають). Проба startup дає пацієнту час прокинутися після операції, перш ніж перевіряти життєві показники. Кожна має свою мету, і використання невідповідної спричиняє проблеми.
Три типи проб
Розділ «Три типи проб»Проба Liveness
Розділ «Проба Liveness»Запитання, на яке вона відповідає: «Чи застосунок живий, чи слід його перезапустити?»
livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 15 periodSeconds: 10 failureThreshold: 3Коли liveness не проходить: Kubernetes вбиває контейнер і перезапускає його.
Використовуйте, коли:
- Застосунок може зависнути (deadlock, нескінченний цикл)
- Перезапуск вирішить проблему
- Вам потрібне автоматичне відновлення після помилок застосунку
Проба Readiness
Розділ «Проба Readiness»Запитання, на яке вона відповідає: «Чи застосунок готовий отримувати трафік?»
readinessProbe: httpGet: path: /ready port: 8080 initialDelaySeconds: 5 periodSeconds: 5 failureThreshold: 3Коли readiness не проходить: Під видаляється з ендпоінтів Service (без трафіку).
Використовуйте, коли:
- Застосунок потребує часу на прогрів (завантаження кешів, з’єднання з БД)
- Застосунок тимчасово перевантажений
- Залежні сервіси недоступні
Проба Startup
Розділ «Проба Startup»Запитання, на яке вона відповідає: «Чи застосунок завершив запуск?»
startupProbe: httpGet: path: /healthz port: 8080 failureThreshold: 30 periodSeconds: 10Коли startup проходить успішно: Проби liveness та readiness починають працювати.
Використовуйте, коли:
- Застосунок має тривалий/непередбачуваний час запуску
- Інакше довелося б встановити дуже високий
initialDelaySecondsдля liveness - Застарілі застосунки з непередбачуваним часом завантаження
Механізми проб
Розділ «Механізми проб»HTTP GET проба
Розділ «HTTP GET проба»Найпоширеніша для веб-застосунків:
livenessProbe: httpGet: path: /healthz port: 8080 httpHeaders: - name: Custom-Header value: Awesome initialDelaySeconds: 10 periodSeconds: 5- Успіх: HTTP-статус 200–399
- Невдача: Будь-який інший статус або таймаут
TCP Socket проба
Розділ «TCP Socket проба»Для не-HTTP сервісів (бази даних, черги повідомлень):
livenessProbe: tcpSocket: port: 3306 initialDelaySeconds: 15 periodSeconds: 10- Успіх: З’єднання встановлено
- Невдача: З’єднання відхилено або таймаут
Exec проба
Розділ «Exec проба»Виконує команду всередині контейнера:
livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 periodSeconds: 5- Успіх: Код виходу 0
- Невдача: Ненульовий код виходу
Параметри проб
Розділ «Параметри проб»| Параметр | Опис | Типово |
|---|---|---|
initialDelaySeconds | Очікування перед першою пробою | 0 |
periodSeconds | Як часто виконувати пробу | 10 |
timeoutSeconds | Таймаут проби | 1 |
successThreshold | Успіхів для відновлення після невдачі | 1 |
failureThreshold | Невдач перед дією | 3 |
Розрахунок часових параметрів проб
Розділ «Розрахунок часових параметрів проб»Час до першої проби: initialDelaySeconds
Час до дії при невдачі:
initialDelaySeconds + (failureThreshold × periodSeconds)
Приклад з типовими значеннями:
initialDelaySeconds: 0periodSeconds: 10failureThreshold: 3- Час до перезапуску:
0 + (3 × 10) = 30 секунд
Типові шаблони
Розділ «Типові шаблони»Комбіновані проби для веб-застосунку
Розділ «Комбіновані проби для веб-застосунку»apiVersion: v1kind: Podmetadata: name: webappspec: containers: - name: app image: myapp:v1 ports: - containerPort: 8080 startupProbe: httpGet: path: /healthz port: 8080 failureThreshold: 30 periodSeconds: 10 livenessProbe: httpGet: path: /healthz port: 8080 periodSeconds: 10 failureThreshold: 3 readinessProbe: httpGet: path: /ready port: 8080 periodSeconds: 5 failureThreshold: 3Перевірка з’єднання з базою даних
Розділ «Перевірка з’єднання з базою даних»livenessProbe: exec: command: - pg_isready - -U - postgres initialDelaySeconds: 30 periodSeconds: 10gRPC перевірка стану
Розділ «gRPC перевірка стану»livenessProbe: grpc: port: 50051 initialDelaySeconds: 10 periodSeconds: 10Порівняння проб
Розділ «Порівняння проб»┌─────────────────────────────────────────────────────────────┐│ Порівняння проб │├─────────────────────────────────────────────────────────────┤│ ││ Проба Startup ││ ├── Виконується ПЕРШОЮ (перед liveness/readiness) ││ ├── Невдача: Продовжує спроби до порогу ││ └── Успіх: Вмикає проби liveness/readiness ││ ││ Проба Liveness ││ ├── Виконується ПІСЛЯ успіху startup ││ ├── Невдача: ВБИТИ та ПЕРЕЗАПУСТИТИ контейнер ││ └── Успіх: Контейнер живий, нічого не робити ││ ││ Проба Readiness ││ ├── Виконується ПІСЛЯ успіху startup ││ ├── Невдача: ВИДАЛИТИ з ендпоінтів Service ││ └── Успіх: ДОДАТИ до ендпоінтів Service ││ │└─────────────────────────────────────────────────────────────┘Прийоми для іспиту
Розділ «Прийоми для іспиту»Додати пробу до наявного Pod YAML
Розділ «Додати пробу до наявного Pod YAML»# Згенерувати под без пробk run webapp --image=nginx --port=80 --dry-run=client -o yaml > pod.yaml
# Додати проби вручну (найшвидше на іспиті)Швидкий під з Liveness пробою
Розділ «Швидкий під з Liveness пробою»cat << 'EOF' | k apply -f -apiVersion: v1kind: Podmetadata: name: liveness-demospec: containers: - name: app image: nginx livenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 10EOFПеревірка роботи проб
Розділ «Перевірка роботи проб»# Перевірити події пода на активність пробk describe pod webapp | grep -A 10 Events
# Спостерігати за перезапусками (невдачі liveness)k get pod webapp -w
# Перевірити членство в ендпоінтах (readiness)k get endpoints myserviceЧи знали ви?
Розділ «Чи знали ви?»-
Проба startup була додана в Kubernetes 1.16, щоб вирішити проблему «застарілих застосунків». До цього доводилося ставити величезні
initialDelaySecondsдля проб liveness, що затримувало виявлення реальних збоїв. -
Exec проба виконується всередині контейнера, тобто вона має доступ до файлової системи та середовища контейнера. Це потужний інструмент для власних перевірок стану, але додає навантаження.
-
HTTP проби слідують за перенаправленнями (3xx). Якщо ваш
/healthzперенаправляє на/login, проба бачить200 OKвід кінцевого пункту призначення і вважається успішною.
Типові помилки
Розділ «Типові помилки»| Помилка | Чому це шкодить | Рішення |
|---|---|---|
| Занадто агресивна проба liveness | Вбиває справні повільні застосунки | Використовуйте пробу startup для повільного запуску |
| Однакова проба для liveness і readiness | Змішані різні цілі | Окремі ендпоінти: /healthz проти /ready |
| Readiness перевіряє зовнішні залежності | Увесь кластер падає, якщо одна залежність недоступна | Перевіряйте лише те, що контролює цей під |
Без initialDelaySeconds | Контейнер вбито до запуску застосунку | Дайте застосунку час на ініціалізацію |
timeoutSeconds: 1 для повільних перевірок | Таймаути спричиняють перезапуски | Збільште для повільних ендпоінтів перевірки стану |
Тест
Розділ «Тест»-
Що відбувається, коли проба liveness не проходить?
Відповідь
Kubernetes вбиває контейнер і перезапускає його. Лічильник перезапусків збільшується. -
Що відбувається, коли проба readiness не проходить?
Відповідь
Під видаляється з ендпоінтів Service (перестає отримувати трафік). Контейнер НЕ перезапускається. -
Коли варто використовувати пробу startup замість високого
initialDelaySeconds?Відповідь
Використовуйте пробу startup для застосунків із змінним або тривалим часом запуску. Проба startup дозволяє liveness використовувати агресивні налаштування після запуску, тоді як високий `initialDelaySeconds` затримує все виявлення збоїв. -
Яке типове значення
failureThresholdдля проб?Відповідь
3 послідовні невдачі перед виконанням дії.
Практична вправа
Розділ «Практична вправа»Завдання: Налаштуйте всі три типи проб для веб-застосунку.
Підготовка:
# Створити тестовий под з тривалим запускомcat << 'EOF' | k apply -f -apiVersion: v1kind: Podmetadata: name: probe-demo labels: app: probe-demospec: containers: - name: app image: nginx ports: - containerPort: 80 startupProbe: httpGet: path: / port: 80 failureThreshold: 10 periodSeconds: 5 livenessProbe: httpGet: path: / port: 80 periodSeconds: 10 failureThreshold: 3 readinessProbe: httpGet: path: / port: 80 periodSeconds: 5 failureThreshold: 2EOFПеревірка:
# Спостерігати за статусом подаk get pod probe-demo -w
# Перевірити події пробk describe pod probe-demo | grep -A 15 Events
# Створити сервісk expose pod probe-demo --port=80
# Перевірити ендпоінтиk get ep probe-demoЗламайте (для навчання):
# Змусити liveness не пройти — зайдіть в под і зламайте nginxk exec probe-demo -- rm /usr/share/nginx/html/index.html
# Спостерігайте за перезапускомk get pod probe-demo -wОчищення:
k delete pod probe-demok delete svc probe-demoПрактичні вправи
Розділ «Практичні вправи»Вправа 1: HTTP Liveness проба (Ціль: 2 хвилини)
Розділ «Вправа 1: HTTP Liveness проба (Ціль: 2 хвилини)»# Створити під з HTTP liveness пробоюcat << 'EOF' | k apply -f -apiVersion: v1kind: Podmetadata: name: drill1spec: containers: - name: nginx image: nginx livenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 10EOF
# Перевіритиk describe pod drill1 | grep Liveness
# Очищенняk delete pod drill1Вправа 2: Exec проба (Ціль: 2 хвилини)
Розділ «Вправа 2: Exec проба (Ціль: 2 хвилини)»# Створити під з exec пробоюcat << 'EOF' | k apply -f -apiVersion: v1kind: Podmetadata: name: drill2spec: containers: - name: app image: busybox command: ['sh', '-c', 'touch /tmp/healthy && sleep 3600'] livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 periodSeconds: 5EOF
# Перевірити запускk get pod drill2
# Очищенняk delete pod drill2Вправа 3: TCP проба (Ціль: 2 хвилини)
Розділ «Вправа 3: TCP проба (Ціль: 2 хвилини)»# Створити під з TCP пробоюcat << 'EOF' | k apply -f -apiVersion: v1kind: Podmetadata: name: drill3spec: containers: - name: redis image: redis livenessProbe: tcpSocket: port: 6379 initialDelaySeconds: 10 periodSeconds: 5EOF
# Перевіритиk describe pod drill3 | grep Liveness
# Очищенняk delete pod drill3Вправа 4: Readiness проба (Ціль: 3 хвилини)
Розділ «Вправа 4: Readiness проба (Ціль: 3 хвилини)»# Створити deployment з readiness пробоюcat << 'EOF' | k apply -f -apiVersion: apps/v1kind: Deploymentmetadata: name: drill4spec: replicas: 2 selector: matchLabels: app: drill4 template: metadata: labels: app: drill4 spec: containers: - name: nginx image: nginx readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 2 periodSeconds: 3EOF
# Створити сервісk expose deploy drill4 --port=80
# Перевірити ендпоінти (повинно бути 2)k get endpoints drill4
# Очищенняk delete deploy drill4k delete svc drill4Вправа 5: Комбіновані проби (Ціль: 4 хвилини)
Розділ «Вправа 5: Комбіновані проби (Ціль: 4 хвилини)»# Створити під з startup, liveness та readinesscat << 'EOF' | k apply -f -apiVersion: v1kind: Podmetadata: name: drill5 labels: app: drill5spec: containers: - name: app image: nginx ports: - containerPort: 80 startupProbe: httpGet: path: / port: 80 failureThreshold: 30 periodSeconds: 10 livenessProbe: httpGet: path: / port: 80 periodSeconds: 10 readinessProbe: httpGet: path: / port: 80 periodSeconds: 5EOF
# Перевірити всі пробиk describe pod drill5 | grep -E "Liveness|Readiness|Startup"
# Створити сервіс і перевірити ендпоінтk expose pod drill5 --port=80k get ep drill5
# Очищенняk delete pod drill5 svc drill5Вправа 6: Сценарій з невдалою пробою (Ціль: 5 хвилин)
Розділ «Вправа 6: Сценарій з невдалою пробою (Ціль: 5 хвилин)»Сценарій: Відлагодити під, який постійно перезапускається.
# Створити навмисно зламану пробуcat << 'EOF' | k apply -f -apiVersion: v1kind: Podmetadata: name: drill6spec: containers: - name: app image: nginx livenessProbe: httpGet: path: /nonexistent port: 80 initialDelaySeconds: 5 periodSeconds: 3 failureThreshold: 2EOF
# Спостерігати за перезапускамиk get pod drill6 -w
# Після кількох перезапусків перевірити подіїk describe pod drill6 | tail -20
# Виправити пробуk delete pod drill6cat << 'EOF' | k apply -f -apiVersion: v1kind: Podmetadata: name: drill6spec: containers: - name: app image: nginx livenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 10EOF
# Перевірити виправленняk get pod drill6
# Очищенняk delete pod drill6Наступний модуль
Розділ «Наступний модуль»Модуль 3.2: Логування контейнерів — Доступ, керування та усунення несправностей логів контейнерів.