Как посмотреть историю изменений Deployment в Kubernetes
Что проверяют
Понимаете ли вы, откуда Kubernetes берёт историю Deployment и что в неё не попадает. Следом обычно просят откатиться на конкретную ревизию и объяснить, почему после отката у неё новый номер.
Как отвечать
Базовые команды:
kubectl rollout history deployment/api: список ревизий с колонкойCHANGE-CAUSE;--revision=3: шаблон пода конкретной ревизии: образы, переменные, лейблы;kubectl get rs -l app=api: сами ReplicaSet, история хранится именно в них. Номер ревизии лежит в аннотацииdeployment.kubernetes.io/revision, две версии удобно сравнить через-o yamlиdiff;kubectl describe deployment api: текущее состояние и события раскатки.
Дальше механика. Новая ревизия появляется только при изменении .spec.template: образ, env, ресурсы, лейблы пода. Изменение replicas ревизию не создаёт. Старых ReplicaSet хранится столько, сколько задано в revisionHistoryLimit, по умолчанию 10, остальные удаляются вместе с возможностью отката на них.
Колонка CHANGE-CAUSE берётся из аннотации kubernetes.io/change-cause. Флаг --record, который её заполнял, устарел, поэтому аннотацию ставят явно, например kubectl annotate deployment/api kubernetes.io/change-cause="release 2.4.1", или это делает CI.
Откат: kubectl rollout undo deployment/api --to-revision=3. Шаблон старой ревизии становится текущим и получает новый номер, а ревизия 3 пропадает из списка.
В эксплуатации полная история живёт выше: в Git при GitOps (Argo CD, Flux), в helm history для релизов Helm и в аудит-логах API-сервера.
Где спотыкаются
Считают, что правка ConfigMap или Secret попадает в историю. Шаблон пода от неё не меняется, поэтому ревизии нет и поды даже не перезапускаются. Выручает хэш конфига в аннотации шаблона или kubectl rollout restart.
Надеются на события из describe. По умолчанию API-сервер хранит их около часа, и для разбора вчерашнего релиза их уже нет.
Откатывают через rollout undo в кластере под Argo CD с включённым selfHeal. Контроллер вернёт состояние из Git, и откат тихо отменится, откатывать нужно коммитом.