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

Какие знаешь пробы в Kubernetes?

1.3 Junior🔥 251 комментариев
#Kubernetes

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

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

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

Основные типы и механизмы проб (Probes) в Kubernetes

В Kubernetes пробы (Probes) — это механизмы проверки состояния контейнера, которые помогают оркестратору принимать решения о маршрутизации трафика и перезапуске подов. Я выделю три основных типа проб, их назначение, конфигурацию и лучшие практики.

1. Типы проб и их назначение

В Kubernetes существует три вида проб, которые настраиваются в разделе spec.containers[].livenessProbe, readinessProbe и startupProbe манифеста пода.

  • Liveness Probe (Проба жизнеспособности)
    *   **Назначение:** Определяет, жив ли контейнер. Если проба fails, kubelet убивает контейнер, и он подвергается политике перезапуска (`restartPolicy`).
    *   **Когда использовать:** Для приложений, которые могут "зависнуть" или перейти в нерабочее состояние, но продолжать работать. Например, веб-сервер, который перестал отвечать на запросы.

  • Readiness Probe (Проба готовности)
    *   **Назначение:** Определяет, готов ли контейнер принимать трафик. Если проба fails, контейнер удаляется из списка эндпоинтов (`Endpoints`) сервиса.
    *   **Когда использовать:** Для приложений, которым требуется время на "прогрев" после старта (загрузка кэша, конфигурации, подключение к БД) или которые временно не могут обслуживать запросы.

  • Startup Probe (Проба старта)
    *   **Назначение:** Определяет, запустилось ли приложение. Пока эта проба не станет successful, все остальные (`liveness` и `readiness`) отключены. Это решает проблему "длинного старта".
    *   **Когда использовать:** Для устаревших приложений с долгим временем запуска. Позволяет задать очень большой `initialDelaySeconds` для `livenessProbe`, не рискуя убить контейнер на старте.

2. Методы выполнения проб

Каждый тип пробы можно реализовать одним из трех способов:

  • HTTP GET: Наиболее распространенный метод для HTTP-сервисов. Kubelet отправляет GET-запрос на указанный путь и порт.

    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
        httpHeaders:
        - name: Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 10
    
  • TCP Socket: Kubelet пытается открыть TCP-соединение с указанным портом контейнера. Успех = установлено соединение.

    readinessProbe:
      tcpSocket:
        port: 3306
      initialDelaySeconds: 15
      periodSeconds: 20
    
  • Exec: Kubelet выполняет команду внутри контейнера. Код возврата 0 = успех, все остальное = failure.

    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      periodSeconds: 5
    

3. Ключевые параметры настройки

Каждая проба конфигурируется набором общих параметров, которые критически важны для стабильности:

  • initialDelaySeconds: Количество секунд ожидания после старта контейнера перед первой проверкой. Обязательный параметр для избежания ложных срабатываний.
  • periodSeconds: Как часто выполнять проверку (по умолчанию 10).
  • timeoutSeconds: Таймаут на выполнение проверки (по умолчанию 1). Если проба не уложилась в это время — она считается failed.
  • successThreshold: Минимальное количество последовательных успешных проверок для перехода в статус healthy (по умолчанию 1).
  • failureThreshold: Количество последовательных неудач, после которого контейнер считается unhealthy. Для livenessProbe это ведет к перезапуску, для readinessProbe — к исключению из балансировщика (по умолчанию 3).

4. Практический пример конфигурации

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

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: web
    image: myapp:latest
    ports:
    - containerPort: 8080
    startupProbe:
      httpGet:
        path: /health/startup
        port: 8080
      failureThreshold: 30  # Позволяем до 30 проверок
      periodSeconds: 5      # Каждые 5 секунд
    livenessProbe:
      httpGet:
        path: /health/live
        port: 8080
      initialDelaySeconds: 10
      periodSeconds: 5
      failureThreshold: 3
    readinessProbe:
      httpGet:
        path: /health/ready
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 5
      successThreshold: 2   # Требуем двух успехов подряд для стабильности

5. Лучшие практики и рекомендации

  • Всегда настраивайте readinessProbe. Без нее трафик будет отправляться в контейнер сразу после старта, что приведет к ошибкам 5xx.
  • Используйте разные эндпоинты для liveness и readiness. liveness должен быть легковесным и не зависеть от внешних сервисов (БД, кэш), иначе падение БД вызовет лавину перезапусков.
  • Проба liveness не должна быть "агрессивной". Слишком частые проверки или малые таймауты могут создавать нагрузку и ложные срабатывания.
  • Для legacy-приложений с долгим стартом всегда используйте startupProbe. Это более элегантная альтернатива гигантскому initialDelaySeconds в livenessProbe.
  • failureThreshold * periodSeconds — это общее "окно отказа". Рассчитывайте его, исходя из времени восстановления вашего приложения.
  • Мониторьте события (kubectl describe pod) и логи kubelet для диагностики проблем с пробами.

Правильная настройка проб — это краеугольный камень надежности приложений в Kubernetes. Они обеспечивают zero-downtime деплойменты, устойчивость к частичным отказам и автоматическое восстановление, что является сутью DevOps-практик.