Код-ревью Middle Probes и ресурсы обновлено

Ревью: probes и ресурсы

Вопрос

Найди проблемы в спецификации контейнера платёжного API (старт приложения занимает до 90 секунд).

containers:
  - name: payments
    image: registry.example.com/payments:2.3.0
    livenessProbe:
      httpGet:
        path: /health/full
        port: 8080
      initialDelaySeconds: 5
      timeoutSeconds: 1
      failureThreshold: 1
    resources:
      requests:
        memory: 1Gi
        cpu: 100m
      limits:
        memory: 512Mi
        cpu: 100m

Коротко

Исправленный вариант: startupProbe даёт до 120 секунд на старт, liveness проверяет только процесс, readiness управляет трафиком. Память с requests = limits, CPU без жёсткого лимита (или с большим запасом), куча JVM ограничена через -XX:MaxRAMPercentage=75.

Что должен найти ревьюер

  1. Ошибкастрока 6
    /health/full судя по названию проверяет зависимости: падение базы или соседнего сервиса вызовет перезапуск всех подов. Liveness должна проверять только процесс.
  2. Ошибкастрока 8
    Старт до 90 секунд, а liveness начинает через 5: под будут убивать до запуска (CrashLoopBackOff). Нужна startupProbe.
  3. Ошибкастрока 10
    failureThreshold: 1 с таймаутом 1 секунда: одна GC-пауза или всплеск нагрузки перезапустит здоровый под. Поставить 3 и таймаут с запасом.
  4. Ошибка
    Нет readinessProbe: при старте и деплое трафик пойдёт на неготовые поды.
  5. Ошибкастрока 16
    Лимит памяти 512Mi меньше requests 1Gi: API отклонит такой под (limits не могут быть меньше requests).
  6. Производительностьстрока 17
    Лимит CPU 100m для JVM-сервиса: сильный троттлинг, медленный старт и рост задержек. Увеличить или не ограничивать CPU, а requests выставить по реальному потреблению.

Разбор

Исправленный вариант:

containers:
  - name: payments
    image: registry.example.com/payments:2.3.0
    startupProbe:
      httpGet: { path: /healthz, port: 8080 }
      periodSeconds: 5
      failureThreshold: 24
    livenessProbe:
      httpGet: { path: /healthz, port: 8080 }
      periodSeconds: 10
      timeoutSeconds: 3
      failureThreshold: 3
    readinessProbe:
      httpGet: { path: /ready, port: 8080 }
      periodSeconds: 5
      timeoutSeconds: 3
    resources:
      requests: { cpu: 500m, memory: 1Gi }
      limits: { memory: 1Gi }

startupProbe даёт до 120 секунд на старт, liveness проверяет только процесс, readiness управляет трафиком. Память с requests = limits, CPU без жёсткого лимита (или с большим запасом), куча JVM ограничена через -XX:MaxRAMPercentage=75.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.