В реальных приложениях обновление — обычная операция. Deployment, StatefulSet или DaemonSet могут легко поддерживать обновление приложения.
Вы можете задать различные политики обновления:
- Постепенное обновление: Новые pods создаются постепенно, а затем старые pods удаляются. Это политика по умолчанию.
- Заменяющее обновление: Текущие pods удаляются, а затем создаются новые pods.
Параметры обновления
Параметр | Описание | Ограничение |
|---|---|---|
Максимальный прирост (maxSurge) | Указывает максимальное количество pods, которое может существовать по сравнению с spec.replicas. Значение по умолчанию 25%. Например, если spec.replicas установлено в 4, максимум в пять pods может существовать во время обновления. То есть обновление выполняется шагом 1. Во время реального обновления значение преобразуется в число и округляется вверх. Значение также может быть задано абсолютным числом. | Этот параметр поддерживается только Deployment и DaemonSet. |
Максимальное количество недоступных pods (maxUnavailable) | Указывает максимальное количество pods, которое может быть недоступно по сравнению с spec.replicas. Значение по умолчанию 25%. Например, если spec.replicas установлено в 4, минимум три pods существуют во время обновления. То есть удаление происходит шагом 1. Значение также может быть задано абсолютным числом. | Этот параметр поддерживается только Deployment и DaemonSet. |
Минимальное время готовности (секунды) (minReadySeconds) | Pod считается доступным только после превышения минимального времени готовности без падения каких-либо его контейнеров. Значение по умолчанию 0 (pod считается доступным сразу после готовности). | Нет |
Лимит истории ревизий (revisionHistoryLimit) | Указывает количество старых ReplicaSet, которые сохраняются для возможности отката. Эти старые ReplicaSet потребляют ресурсы в etcd и захламляют вывод kubectl get rs. Конфигурация каждой ревизии Deployment хранится в её ReplicaSet. Поэтому, после удаления старого ReplicaSet вы теряете возможность откатиться к этой ревизии Deployment. По умолчанию сохраняются 10 старых ReplicaSet, но оптимальное значение зависит от частоты и стабильности новых Deployment. | Нет |
Максимальная продолжительность обновления (progressDeadlineSeconds) | Указывает количество секунд, которое система ждёт, пока Deployment продвинется, прежде чем сообщить о сбое прогресса обновления. Это отображается как условие с Type=Progressing, Status=False и Reason=ProgressDeadlineExceeded в статусе ресурса. Контроллер Deployment будет повторять попытки Deployment. В будущем, после реализации автоматического отката, контроллер Deployment будет откатывать Deployment, как только обнаружит такое условие. Если этот параметр указан, его значение должно быть больше, чем у .spec.minReadySeconds. | Нет |
Окно масштабирования вниз (terminationGracePeriodSeconds) | Время корректного удаления. Значение по умолчанию — 30 секунд. При удалении pod отправляется сигнал SIGTERM, и система ждёт завершения приложений в контейнере. Если приложение не завершается в течение времени, указанного в terminationGracePeriodSeconds, отправляется сигнал SIGKILL для принудительного завершения pod. | Нет |
Пример обновления
Deployment можно обновить в декларативном режиме. То есть нужно только изменить YAML‑определение Deployment. Например, вы можете выполнить kubectl edit команду для изменения образа Deployment на nginx:alpine. После изменения выполните запрос к ReplicaSet и pod. Результат запроса показывает, что создан новый ReplicaSet и pod пере‑создан.
$ kubectl edit deploy nginx$ kubectl get rsNAME DESIRED CURRENT READY AGEnginx-6f9f58dffd 2 2 2 1mnginx-7f98958cdf 0 0 0 48m$ kubectl get podsNAME READY STATUS RESTARTS AGEnginx-6f9f58dffd-tdmqk 1/1 Running 0 1mnginx-6f9f58dffd-tesqr 1/1 Running 0 1m
Deployment может использовать maxSurge и maxUnavailable параметры для контроля доли pods, пере‑создаваемых во время обновления, что полезно во многих сценариях. Конфигурация выглядит следующим образом:
spec:strategy:rollingUpdate:maxSurge: 1maxUnavailable: 0type: RollingUpdate
В приведённом выше примере значение spec.replicas равно 2. Если оба maxSurge и maxUnavailable имеют значение по умолчанию 25%, maxSurge позволяет максимум три pods (2 x 1.25 = 2.5, округляется до 3), и maxUnavailable не позволяет более двух pods быть недоступными (2 x 0.75 = 1.5, округляется до 2). То есть в процессе обновления всегда будет работать два pods. Каждый раз при создании нового pod, старый pod удаляется, пока все pods не станут новыми.
Откат
Откат — это возврат приложения к более ранней версии при возникновении ошибки во время обновления. Deployment можно легко откатить к более ранней версии.
Например, если обновлённый образ неисправен, вы можете выполнить kubectl rollout undo команду для отката Deployment.
$ kubectl rollout undo deployment nginxdeployment.apps/nginx rolled back
Развёртывание может быть легко откатано, потому что использует ReplicaSet для управления pod. После обновления предыдущий ReplicaSet всё ещё существует. Развёртывание откатывается с использованием предыдущего ReplicaSet для повторного создания pod. Количество ReplicaSet, хранящихся в развёртывании, можно ограничить revisionHistoryLimit параметр. Значение по умолчанию 10.
- Параметры обновления
- Пример обновления
- Откат