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: 80
kubectl 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 мгновенно откатывает к прошлой ревизии.
Проверьте себя
1. Что такое rolling update?
AОдновременная остановка всех подов и запуск новых
BПостепенная замена подов на новую версию без простоя
CУдаление Deployment
DОткат к предыдущей версии
2. Как откатить Deployment на предыдущую версию?
Akubectl delete deployment
Bkubectl rollout undo deployment/web
Ckubectl scale --replicas=0
Dkubectl apply заново
3. Чем управляет Deployment напрямую?
AУзлами кластера
BReplicaSet, который, в свою очередь, управляет подами
CСетевыми правилами
DХранилищем etcd
4. Как быстро изменить число реплик у Deployment?
Akubectl logs
Bkubectl scale deployment/web --replicas=5
Ckubectl rollout history
Dkubectl describe
Поддержать проект