Какие механизмы в Kubernetes используются для проверки работоспособности и готовности приложения?

Ответ

В Kubernetes для проверки состояния приложения в контейнере используются Probes (пробы или проверки). Они помогают kubelet понять, когда нужно перезапустить контейнер или когда он готов принимать трафик.

Существует три основных типа проб:

  1. Liveness Probe (Проверка жизнеспособности)

    • Назначение: Проверяет, работает ли приложение. Если проба завершается неудачно, kubelet убивает контейнер, и он перезапускается в соответствии со своей restartPolicy.
    • Пример использования: Обнаружение дедлоков или ситуаций, когда приложение зависло, но процесс еще существует.
  2. Readiness Probe (Проверка готовности)

    • Назначение: Проверяет, готово ли приложение принимать трафик. Если проба не проходит, эндпоинты этого пода удаляются из объектов Service. Трафик на него перестает поступать, пока проба снова не станет успешной.
    • Пример использования: Приложение запущено, но ему нужно время на загрузку конфигурации, данных или установку соединений с базой данных.
  3. Startup Probe (Проверка запуска)

    • Назначение: Используется для приложений, которые долго запускаются. Она отключает Liveness и Readiness пробы до тех пор, пока сама не завершится успешно. Это предотвращает убийство контейнера до того, как он успел полностью запуститься.
    • Пример использования: Тяжеловесные Java-приложения или приложения, которым нужно прочитать большой объем данных при старте.

Способы проверки

Для всех проб можно настроить один из трех механизмов проверки:

  • httpGet: Выполняет GET-запрос к указанному эндпоинту. Ответ с кодом 2xx или 3xx считается успешным.
  • tcpSocket: Пытается установить TCP-соединение с указанным портом. Успешное соединение — успех.
  • exec: Выполняет команду внутри контейнера. Код завершения 0 — успех.

Пример манифеста:

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: my-app-container
    image: my-app-image
    ports:
    - containerPort: 8080
    # Проверка, что приложение готово принимать трафик
    readinessProbe:
      httpGet:
        path: /ready
        port: 8080
      initialDelaySeconds: 15 # Начать проверку через 15 секунд после старта
      periodSeconds: 10     # Проверять каждые 10 секунд

    # Проверка, что приложение "живо"
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 30
      periodSeconds: 20
      failureThreshold: 3 # Считать сбоем после 3 неудачных попыток