Проверки состояния

Содержание

Понимание проверок состояния

Обратитесь к официальной документации Kubernetes:

В Kubernetes проверки состояния, также известные как пробы, являются критически важным механизмом для обеспечения высокой доступности и устойчивости ваших приложений. Kubernetes использует эти пробы для определения состояния здоровья и готовности ваших Pod-ов, позволяя системе предпринимать соответствующие действия, такие как перезапуск контейнеров или маршрутизация трафика. Без правильной настройки проверок состояния Kubernetes не сможет надежно управлять жизненным циклом вашего приложения, что может привести к ухудшению качества сервиса или сбоям.

Kubernetes предлагает три типа проб:

  • livenessProbe: Определяет, запущен ли контейнер. Если liveness probe не проходит, Kubernetes завершит Pod и перезапустит его согласно политике перезапуска.
  • readinessProbe: Определяет, готов ли контейнер обслуживать трафик. Если readiness probe не проходит, Endpoint Controller удалит Pod из списка Endpoint-ов Service до тех пор, пока проба не пройдет успешно.
  • startupProbe: Специально проверяет, успешно ли запустилось приложение. Liveness и readiness пробы не будут выполняться, пока startup probe не пройдет успешно. Это очень полезно для приложений с длительным временем запуска.

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

Типы проб

Kubernetes поддерживает три механизма реализации проб:

HTTP GET действие

Выполняет HTTP-запрос GET к IP-адресу Pod-а на указанном порту и пути. Проба считается успешной, если код ответа находится в диапазоне от 200 до 399.

  • Сценарии использования: Веб-серверы, REST API или любое приложение, предоставляющее HTTP-эндпоинт.

  • Пример:

    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 20

exec действие

Выполняет указанную команду внутри контейнера. Проба считается успешной, если команда завершается с кодом 0.

  • Сценарии использования: Приложения без HTTP-эндпоинтов, проверка внутреннего состояния приложения или выполнение сложных проверок, требующих специфических инструментов.

  • Пример:

    readinessProbe:
      exec:
        command:
          - cat
          - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

TCP Socket действие

Пытается открыть TCP-сокет на IP-адресе контейнера и указанном порту. Проба считается успешной, если TCP-соединение устанавливается.

  • Сценарии использования: Базы данных, очереди сообщений или любое приложение, которое общается по TCP-порту, но может не иметь HTTP-эндпоинта.

  • Пример:

    startupProbe:
      tcpSocket:
        port: 3306
      initialDelaySeconds: 5
      periodSeconds: 10
      failureThreshold: 30

Лучшие практики

  • Liveness vs. Readiness:
    • Liveness: Если ваше приложение не отвечает, лучше его перезапустить. При сбое Kubernetes перезапустит контейнер.
    • Readiness: Если приложение временно не может обслуживать трафик (например, устанавливает соединение с базой данных), но может восстановиться без перезапуска, используйте Readiness Probe. Это предотвращает маршрутизацию трафика на нездоровый экземпляр.
  • Startup Probes для медленных приложений: Используйте Startup Probes для приложений с длительным временем инициализации. Это предотвращает преждевременные перезапуски из-за сбоев Liveness Probe или проблемы с маршрутизацией трафика из-за сбоев Readiness Probe во время запуска.
  • Легковесные пробы: Убедитесь, что эндпоинты проб легковесны и выполняются быстро. Они не должны включать тяжелые вычисления или внешние зависимости (например, вызовы к базе данных), которые могут сделать пробу ненадежной.
  • Содержательные проверки: Проверки должны реально отражать состояние здоровья и готовности приложения, а не просто факт работы процесса. Например, для веб-сервера проверяйте возможность отдачи базовой страницы, а не только открытость порта.
  • Настройка initialDelaySeconds: Устанавливайте initialDelaySeconds так, чтобы дать приложению достаточно времени на запуск перед первой проверкой.
  • Настройка periodSeconds и failureThreshold: Балансируйте между быстрым обнаружением сбоев и предотвращением ложных срабатываний. Слишком частые пробы или слишком низкий failureThreshold могут привести к ненужным перезапускам или состоянию "не готов".
  • Логи для отладки: Убедитесь, что ваше приложение логирует понятные сообщения, связанные с вызовами эндпоинтов проверок и внутренним состоянием, чтобы облегчить отладку сбоев проб.
  • Комбинирование проб: Часто все три пробы (Liveness, Readiness, Startup) используются вместе для эффективного управления жизненным циклом приложения.

Пример YAML файла

spec:
  template:
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2 # Container image
          ports:
            - containerPort: 80 # Container exposed port
          startupProbe:
            httpGet:
              path: /startup-check
              port: 8080
            initialDelaySeconds: 0 # Обычно 0 для startup проб или очень маленькое значение
            periodSeconds: 5
            failureThreshold: 60 # Позволяет 60 * 5 = 300 секунд (5 минут) на запуск
          livenessProbe:
            httpGet:
              path: /healthz
              port: 8080
            initialDelaySeconds: 5 # Задержка 5 секунд после старта Pod-а перед проверкой
            periodSeconds: 10 # Проверка каждые 10 секунд
            timeoutSeconds: 5 # Таймаут через 5 секунд
            failureThreshold: 3 # Считается нездоровым после 3 последовательных сбоев
          readinessProbe:
            httpGet:
              path: /ready
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 10
            timeoutSeconds: 5
            failureThreshold: 3

Параметры настройки проверок состояния через веб-консоль

Общие параметры

ПараметрыОписание
Initial DelayinitialDelaySeconds: Период ожидания (в секундах) перед началом проверок. По умолчанию: 300.
PeriodperiodSeconds: Интервал между проверками (1-120 с). По умолчанию: 60.
TimeouttimeoutSeconds: Время ожидания ответа пробы (1-300 с). По умолчанию: 30.
Success ThresholdsuccessThreshold: Минимальное количество последовательных успешных проверок для отметки как здорового. По умолчанию: 0.
Failure ThresholdfailureThreshold: Максимальное количество последовательных неудач для срабатывания действия:
- 0: Отключает действия при сбоях
- По умолчанию: 5 неудач → перезапуск контейнера.

Параметры, специфичные для протокола

ПараметрПрименимые протоколыОписание
ProtocolHTTP/HTTPSПротокол проверки состояния
PortHTTP/HTTPS/TCPЦелевой порт контейнера для проверки.
PathHTTP/HTTPSПуть эндпоинта (например, /healthz).
HTTP HeadersHTTP/HTTPSПользовательские заголовки (добавьте пары ключ-значение).
CommandEXECКоманда для проверки, выполняемая в контейнере (например, sh -c "curl -I localhost:8080 | grep OK").
Примечание: Экранируйте специальные символы и проверьте работоспособность команды.

Устранение неполадок при сбоях проб

Если статус Pod-а указывает на проблемы, связанные с пробами, вот как их диагностировать:

Проверьте события Pod-а

kubectl describe pod <pod-name>

Ищите события, связанные с LivenessProbe failed, ReadinessProbe failed или StartupProbe failed. Эти события часто содержат конкретные сообщения об ошибках (например, отказ соединения, HTTP 500 ошибка, код выхода команды).

Просмотрите логи контейнера

kubectl logs <pod-name> -c <container-name>

Изучите логи приложения, чтобы увидеть ошибки или предупреждения в момент сбоя пробы. Возможно, приложение логирует причины, по которым эндпоинт проверки не отвечает корректно.

Проверьте эндпоинт пробы вручную

  • HTTP: Если возможно, выполните kubectl exec -it <pod-name> -- curl <probe-path>:<probe-port> или wget внутри контейнера, чтобы увидеть реальный ответ.
  • Exec: Запустите команду пробы вручную: kubectl exec -it <pod-name> -- <command-from-probe> и проверьте код выхода и вывод.
  • TCP: Используйте nc (netcat) или telnet из другого Pod-а в той же сети или с хоста (если разрешено), чтобы проверить TCP-соединение: kubectl exec -it <another-pod> -- nc -vz <pod-ip> <probe-port>.

Проверьте конфигурацию проб

  • Тщательно проверьте параметры проб (путь, порт, команда, задержки, пороги) в YAML Deployment/Pod. Частая ошибка — неправильный порт или путь.

Проверьте код приложения

  • Убедитесь, что эндпоинт проверки состояния реализован корректно и действительно отражает готовность/работоспособность приложения. Иногда эндпоинт может возвращать успех, даже если приложение сломано.

Ограничения ресурсов

  • Недостаток CPU или памяти может привести к неотзывчивости приложения и сбоям проб. Проверьте использование ресурсов Pod-а (kubectl top pod <pod-name>) и рассмотрите возможность настройки лимитов/запросов ресурсов.

Проблемы с сетью

  • В редких случаях политики сети или проблемы с CNI могут препятствовать достижению проб контейнера. Проверьте сетевое соединение внутри кластера.