Как выкатить новую версию, посмотреть историю и быстро откатиться
Deployment по умолчанию использует стратегию RollingUpdate: новые поды поднимаются постепенно, а старые удаляются только после того, как новые стали готовы. Поэтому readiness probe имеет прямое значение: без неё Kubernetes не знает, когда новый под можно считать рабочим.
Две настройки управляют темпом обновления:
maxSurge — сколько подов можно создать сверх желаемого количества;maxUnavailable — сколько подов может быть недоступно во время обновления.strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
Значение maxUnavailable: 0 означает, что сервис не теряет мощность во время выкатки.
| Задача | Команда |
|---|---|
| Обновить образ контейнера | kubectl set image deployment/<name> <container>=<image>:<tag> -n <ns> |
| Следить за ходом выкатки | kubectl rollout status deployment/<name> -n <ns> |
| Посмотреть историю ревизий | kubectl rollout history deployment/<name> -n <ns> |
| Посмотреть детали конкретной ревизии | kubectl rollout history deployment/<name> --revision=3 -n <ns> |
| Откатить на предыдущую версию | kubectl rollout undo deployment/<name> -n <ns> |
| Откатить на конкретную ревизию | kubectl rollout undo deployment/<name> --to-revision=2 -n <ns> |
| Перезапустить все поды (например, после смены ConfigMap) | kubectl rollout restart deployment/<name> -n <ns> |
| Приостановить выкатку | kubectl rollout pause deployment/<name> -n <ns> |
| Возобновить выкатку | kubectl rollout resume deployment/<name> -n <ns> |
| Изменить число реплик | kubectl scale deployment/<name> --replicas=3 -n <ns> |
| Посмотреть разницу перед применением | kubectl diff -f deployment.yaml |
kubectl get deployment <name> -n <ns>.kubectl diff -f deployment.yaml.kubectl apply -f deployment.yaml или обновите образ через set image.kubectl rollout status deployment/<name>.kubectl get pods -n <ns> и kubectl describe pod <pod>.kubectl rollout undo deployment/<name>.| Симптом | Вероятная причина | Что сделать |
|---|---|---|
| ProgressDeadlineExceeded в статусе | Новые поды не становятся Ready в отведённое время | Проверить readiness probe и логи нового пода, затем откатить |
| Старые поды не удаляются | Новые не проходят readiness, а maxUnavailable равен 0 | Исправить приложение или временно откатить |
| После отката приложение всё равно работает со старой конфигурацией | Изменился ConfigMap или Secret, а поды не перезапускались | kubectl rollout restart deployment/<name> |
| Нет подходящей ревизии для отката | Ревизии очищены по revisionHistoryLimit | Задать разумное значение этого параметра (например, 10) и хранить манифесты в git |
latest: откат и воспроизводимость ломаются, когда образ меняется под одним именем.maxUnavailable: 0 и проверяйте rollout status в CI/CD.revisionHistoryLimit, чтобы не копить сотни старых ReplicaSet.