Какая проба (probe) срабатывает первой после успешного запуска контейнера в поде Kubernetes?

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

Ответ

После успешного запуска контейнера (т.е. процесса внутри контейнера стартовал) первой срабатывает startupProbe (если она настроена). Её цель — определить, когда контейнер запустился. Это особенно важно для legacy-приложений, которым может требоваться длительное время на инициализацию.

Логическая последовательность проб (probes) для контейнера:

  1. startupProbe (опционально): Проверяет, запустилось ли приложение. Пока эта проба не станет успешной, livenessProbe и readinessProbe не запускаются. Если startupProbe не задана, kubelet переходит к следующей пробе.
  2. readinessProbe: Запускается после успешного startupProbe (или сразу после старта контейнера, если startupProbe нет). Определяет, готово ли приложение принимать трафик. Пока проба не успешна, под не будет добавлен в эндпоинты (Endpoint) Service и не получит входящие запросы.
  3. livenessProbe: Запускается периодически после успешного старта контейнера. Определяет, работает ли приложение. Если проба падает, kubelet убивает контейнер и перезапускает его согласно политике restartPolicy.

Пример конфигурации в манифесте пода для приложения с долгой инициализацией:

apiVersion: v1
kind: Pod
metadata:
  name: slow-start-app
spec:
  containers:
  - name: app
    image: mycompany/slow-app:latest
    ports:
    - containerPort: 8080
    startupProbe:          # Должна завершиться успешно первой
      httpGet:
        path: /health/startup
        port: 8080
      failureThreshold: 30 # Пробуем много раз (30 * 5s = 150s максимум)
      periodSeconds: 5     # Интервал между попытками
    readinessProbe:        # Начинает работать после успешного startupProbe
      httpGet:
        path: /health/ready
        port: 8080
      initialDelaySeconds: 0 # Ждем успеха startupProbe, поэтому задержка 0
      periodSeconds: 5
    livenessProbe:         # Работает постоянно после запуска
      httpGet:
        path: /health/live
        port: 8080
      initialDelaySeconds: 60 # Даем время на полную инициализацию
      periodSeconds: 10

Ключевые параметры проб:

  • initialDelaySeconds: Задержка перед первой проверкой.
  • periodSeconds: Интервал между проверками.
  • failureThreshold: Количество неудачных попыток, после которых проба считается проваленной.
  • successThreshold: Количество успешных попыток для перевода пробы в статус "успех".

Использование startupProbe позволяет задать отдельные, более либеральные параметры для фазы инициализации, не мешая работе readinessProbe и livenessProbe во время нормальной работы.