Kubernetes: обновление, масштабирование и откат Deployment

Как выкатить новую версию, посмотреть историю и быстро откатиться

Как работает обновление

Deployment по умолчанию использует стратегию RollingUpdate: новые поды поднимаются постепенно, а старые удаляются только после того, как новые стали готовы. Поэтому readiness probe имеет прямое значение: без неё Kubernetes не знает, когда новый под можно считать рабочим.

Две настройки управляют темпом обновления:

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

Пошаговый сценарий выкатки

Типичные проблемы

СимптомВероятная причинаЧто сделать
ProgressDeadlineExceeded в статусеНовые поды не становятся Ready в отведённое времяПроверить readiness probe и логи нового пода, затем откатить
Старые поды не удаляютсяНовые не проходят readiness, а maxUnavailable равен 0Исправить приложение или временно откатить
После отката приложение всё равно работает со старой конфигурациейИзменился ConfigMap или Secret, а поды не перезапускалисьkubectl rollout restart deployment/<name>
Нет подходящей ревизии для откатаРевизии очищены по revisionHistoryLimitЗадать разумное значение этого параметра (например, 10) и хранить манифесты в git
Храните манифесты Deployment в git. История ревизий Kubernetes показывает, что менялось на уровне образа и шаблона пода, но не заменяет систему контроля версий для самих манифестов.

Рекомендации