Ответ
На основе своего опыта развёртывания приложений в продакшене, я часто сталкивался со следующими ошибками в манифестах Deployment:
-
Отсутствие или некорректные Liveness и Readiness Probes: Без них kubelet не понимает, когда контейнер готов принимать трафик или когда его нужно перезапустить. Это приводит к даунтайму во время обновлений.
livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 15 periodSeconds: 10 readinessProbe: httpGet: path: /ready port: 8080 initialDelaySeconds: 5 periodSeconds: 5 -
Не указаны Resource Requests и Limits: Это самая частая причина проблем со стабильностью кластера. Без
requestsпланировщик не может правильно разместить под, а безlimitsконтейнер может исчерпать всю память узла, вызвав OOMKill.resources: requests: memory: "128Mi" cpu: "250m" limits: memory: "256Mi" cpu: "500m" -
Использование тега
latestдля образа: Это нарушает принцип идемпотентности. Сегодня и завтраlatestмогут быть разными образами, что делает деплой непредсказуемым. Всегда используйте конкретный тег или SHA.# Плохо image: myapp:latest # Хорошо image: myapp:v1.2.3 # Или лучше (полная детерминированность) image: myapp@sha256:abc123... -
Неправильная стратегия обновления (
strategy): По умолчанию используетсяRollingUpdate, но без настройкиmaxUnavailableиmaxSurgeможно получить полную недоступность сервиса или чрезмерную нагрузку на узлы.strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 25% maxSurge: 1 -
Отсутствие меток (labels) и селекторов (selector): Несоответствие
spec.selector.matchLabelsи меток вspec.template.metadata.labelsприведёт к тому, что Deployment не сможет управлять своими подами. Я всегда проверяю это в первую очередь.