← Назад к вопросам

В чем разница между livenessProbe и readinessProbe?

2.0 Middle🔥 161 комментариев
#Kubernetes

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

livenessProbe vs readinessProbe в Kubernetes

Это две разные проверки здоровья в Kubernetes которые решают разные проблемы. Правильное их использование критично для надёжности приложений.

Быстрое сравнение

livenessProbe:
- Проверяет: жив ли контейнер?
- Действие при failure: RESTART контейнер
- Использование: обнаружить deadlock'и и зависания

readinessProbe:
- Проверяет: готов ли приложение принимать трафик?
- Действие при failure: REMOVE из Service (не restart)
- Использование: graceful startup/shutdown

livenessProbe - "жив ли процесс?"

Назначение: Обнаружить если контейнер зависла или находится в deadlock состоянии.

Действие при failure:

  • Kubernetes ПЕРЕЗАГРУЖАЕТ контейнер
  • Убивает (SIGKILL) и создаёт новый

Примеры:

apiVersion: v1
kind: Pod
metadata:
  name: liveness-pod
spec:
  containers:
  - name: app
    image: myapp:1.0
    
    # HTTP check
    livenessProbe:
      httpGet:
        path: /health
        port: 8080
      initialDelaySeconds: 30  # Wait 30s before first check
      periodSeconds: 10         # Check every 10s
      timeoutSeconds: 5         # Timeout for check
      failureThreshold: 3       # Restart after 3 failures
    
    # TCP check (для приложений без HTTP)
    # livenessProbe:
    #   tcpSocket:
    #     port: 5432
    #   initialDelaySeconds: 30
    #   periodSeconds: 10
    
    # Exec check (запустить команду)
    # livenessProbe:
    #   exec:
    #     command:
    #     - /bin/sh
    #     - -c
    #     - ps aux | grep java
    #   initialDelaySeconds: 30
    #   periodSeconds: 10

Логика:

Проверка каждые 10 секунд
  ✓ Success → OK, продолжаем
  ✗ Failure → счётчик += 1
  
После 3 failures подряд:
  → Контейнер RESTART'ится
  → Новый контейнер создаётся

readinessProbe - "готово ли к трафику?"

Назначение: Определить когда приложение готово принимать requests.

Действие при failure:

  • Kubernetes УДАЛЯЕТ pod из Service endpoints
  • Трафик перестаёт идти на этот pod
  • Pod НЕ перезагружается (процесс живой, просто не готов)

Примеры:

apiVersion: v1
kind: Pod
metadata:
  name: readiness-pod
spec:
  containers:
  - name: app
    image: myapp:1.0
    
    # HTTP check
    readinessProbe:
      httpGet:
        path: /ready
        port: 8080
      initialDelaySeconds: 10   # Быстрее чем liveness
      periodSeconds: 5          # Часто проверяем
      timeoutSeconds: 2
      failureThreshold: 1       # Одна failure = remove из Service
    
    # Exec check (проверка БД)
    # readinessProbe:
    #   exec:
    #     command:
    #     - /bin/sh
    #     - -c
    #     - curl -f http://localhost:5432/health || exit 1
    #   initialDelaySeconds: 5
    #   periodSeconds: 5

Логика:

Проверка каждые 5 секунд
  ✓ Ready → добавляем в Service endpoints (трафик идёт)
  ✗ NotReady → удаляем из endpoints (трафик НЕ идёт)
  
Процесс продолжает работать, но изолирован от трафика

Практическое объяснение

Сценарий 1: Startup

Под создан (startup phase)
  ↓
Приложение инициализируется
  - Загружает конфигурацию
  - Подключается к БД
  - Прогревает кеш
  ↓
readinessProbe = FAIL → Pod удалён из Service
  (Ещё не готов к трафику)
  ↓
После загрузки
readinessProbe = OK → Pod добавлен в Service
  (Может принимать трафик)

Сценарий 2: Runtime проблема

Приложение работает нормально
  ↓
Вдруг БД стала недоступна
  ↓
readinessProbe = FAIL
  Pod удалён из Service
  Другие pods обрабатывают трафик
  ↓
При этом livenessProbe = OK
  (Процесс жив, просто не готов)
  ↓
Когда БД восстановится
readinessProbe = OK
  Pod добавлен обратно в Service

Сценарий 3: Deadlock

Приложение входит в deadlock
  ↓
livenessProbe = FAIL
  (Не может ответить)
  ↓
Кубернетес ПЕРЕЗАГРУЖАЕТ контейнер
  ↓
Процесс убит, новый создан
  → Самовосстанавливаемость

Полный пример

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: app
        image: myapp:1.0
        ports:
        - containerPort: 8080
        
        # Startup probe (K8s 1.18+)
        # Позволяет достаточно времени на startup
        startupProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 30
          periodSeconds: 10  # 30 * 10 = 300s max для startup
        
        # Readiness: когда готов к трафику
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
          timeoutSeconds: 2
          successThreshold: 1
          failureThreshold: 1
        
        # Liveness: жив ли процесс
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 5
          failureThreshold: 3

Best Practices

1. Разные endpoints для readiness и liveness

# Python Flask приложение
from flask import Flask
from database import db

app = Flask(__name__)

@app.route('/health')
def health():
    # Liveness: просто проверяем что процесс работает
    return {'status': 'alive'}, 200

@app.route('/ready')
def ready():
    # Readiness: проверяем зависимости (БД, кеш, и т.д.)
    try:
        db.check_connection()
        cache.ping()
        return {'status': 'ready'}, 200
    except Exception as e:
        return {'status': 'not ready', 'reason': str(e)}, 503

2. Правильные timings

startupProbe:           # Если дольше стартует
  failureThreshold: 30  # 30 * periodSeconds
  periodSeconds: 10

readinessProbe:         # Чувствителен к изменениям
  initialDelaySeconds: 5
  periodSeconds: 5
  failureThreshold: 1   # Быстро удаляем

livenessProbe:          # Консервативнее
  initialDelaySeconds: 30
  periodSeconds: 10
  failureThreshold: 3   # Даём несколько попыток

3. Избегать слишком жёстких проверок

# Плохо - слишком частая проверка
readinessProbe:
  periodSeconds: 1  # Слишком нагружает
  
# Хорошо
readinessProbe:
  periodSeconds: 5-10

Диагностика

# Посмотреть статус probes
kubectl describe pod <pod-name>

# Пример вывода
Liveness probe failed: HTTP probe failed with statuscode: 500
Readiness probe failed: HTTP probe failed with statuscode: 503
Last Probe Time:   Mon, 26 Nov 2024 10:15:30 +0000
Last Transition Time: Mon, 26 Nov 2024 10:15:00 +0000
Status: True
Type: Ready

# Логи контейнера
kubectl logs <pod-name>
kubectl logs <pod-name> -f  # Follow

# События
kubectl events --field-selector involvedObject.name=<pod-name>

Выводы

livenessProbe:

  • Жизнь процесса
  • RESTART при failure
  • Для обнаружения deadlock'ов
  • Консервативнее (failureThreshold=3)

readinessProbe:

  • Готовность к трафику
  • REMOVE из Service при failure
  • Для graceful startup/shutdown
  • Более чувствительный (failureThreshold=1)

Правило: используй обе в production!

  • readinessProbe для smooth traffic management
  • livenessProbe для self-healing
  • startupProbe для медленного startup
В чем разница между livenessProbe и readinessProbe? | PrepBro