Какие типы проб (probes) в Kubernetes знаешь и как они работают?

«Какие типы проб (probes) в Kubernetes знаешь и как они работают?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Kubernetes существует три основных типа проб для мониторинга состояния контейнеров:

  1. Liveness Probe

    • Назначение: Проверяет, "живо" ли приложение внутри контейнера. Если проба начинает постоянно падать, kubelet убивает контейнер и перезапускает его согласно политике restartPolicy.
    • Когда использовать: Для восстановления "зависших" приложений, которые не отвечают, но процесс продолжает работать.
  2. Readiness Probe

    • Назначение: Определяет, готов ли контейнер принимать входящий трафик. Если проба падает, конечные точки (Endpoints) Pod'а удаляются из сервиса, и он перестаёт получать запросы.
    • Когда использовать: Во время запуска приложения, требующего длительной инициализации (загрузка кэша, подключение к БД), или для временного исключения перегруженного Pod'а из балансировки.
  3. Startup Probe

    • Назначение: Используется для медленно стартующих приложений. Пока эта проба не станет успешной, liveness и readiness пробы отключены. Если startup проба не завершится успехом за заданное время, контейнер будет убит.
    • Когда использовать: Для legacy-приложений, которым может потребоваться несколько минут на старт, чтобы избежать преждевременных перезапусков из-за liveness-проб.

Пример конфигурации в манифесте Pod:

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
  - name: myapp
    image: myapp:latest
    livenessProbe:
      httpGet:
        path: /health
        port: 8080
      initialDelaySeconds: 15  # Ждем 15 секунд перед первой проверкой
      periodSeconds: 10        # Проверяем каждые 10 секунд
    readinessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 5
    startupProbe:
      httpGet:
        path: /startup
        port: 8080
      failureThreshold: 30     # Пробуем 30 раз
      periodSeconds: 10        # с интервалом в 10 секунд (итого 5 минут на старт)

Ключевые параметры для всех проб: initialDelaySeconds, periodSeconds, timeoutSeconds, successThreshold, failureThreshold. Выбор механизма проверки (httpGet, tcpSocket, exec) зависит от возможностей приложения.