Deployment: обновления и откаты
Deployment — главный объект для запуска приложений без состояния: реплики, плавные обновления и откаты в одном.
Deployment — контроллер для декларативного управления stateless-приложением: задаёт число реплик и обеспечивает плавное обновление версий с возможностью отката.
Deployment — то, чем вы будете пользоваться чаще всего. Он управляет ReplicaSet, а тот — подами. При обновлении версии Deployment не гасит всё разом, а заменяет поды постепенно — это rolling update, обновление без простоя.
Манифест Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.27
ports:
- containerPort: 80kubectl apply -f web-deploy.yaml
kubectl get deployment webВывод:
NAME READY UP-TO-DATE AVAILABLE AGE web 3/3 3 3 20s
Rolling update — обновление без простоя
Чтобы выкатить новую версию, меняем образ в манифесте и применяем заново. Kubernetes поднимет под новой версии, дождётся готовности, погасит старый — и так по очереди:
# поменяли image на nginx:1.27 -> nginx:1.27.2 в манифесте
kubectl apply -f web-deploy.yaml
kubectl rollout status deployment/webВывод:
Waiting for deployment "web" rollout to finish: 1 out of 3 new replicas updated... Waiting for deployment "web" rollout to finish: 2 out of 3 new replicas updated... deployment "web" successfully rolled out
В любой момент часть подов отдаёт трафик — пользователи не замечают обновления.
История ревизий и откат
Deployment хранит историю. Если новая версия оказалась битой — откатываемся одной командой:
kubectl rollout history deployment/web
kubectl rollout undo deployment/webВывод:
deployment.apps/web rolled back
Откат (rollback) возвращает Deployment к предыдущей рабочей ревизии — тоже плавно, через rolling update в обратную сторону.
Масштабирование
Изменить число реплик можно прямо в манифесте (replicas: 5) и применить, либо командой:
kubectl scale deployment/web --replicas=5| Команда | Что делает |
kubectl rollout status | следить за ходом обновления |
kubectl rollout history | показать список ревизий |
kubectl rollout undo | откатиться на прошлую ревизию |
kubectl scale | изменить число реплик |
Итог
- Deployment — основной объект для stateless-приложений.
- Rolling update обновляет поды по очереди, без простоя.
kubectl rollout undoмгновенно откатывает к прошлой ревизии.