Advanced
Тема интерфейса
Cloud Container Engine

Настройка политик обновления нагрузки

Эта статья полезна?
Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

В реальных приложениях обновление — обычная операция. 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 rs
NAME DESIRED CURRENT READY AGE
nginx-6f9f58dffd 2 2 2 1m
nginx-7f98958cdf 0 0 0 48m
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-6f9f58dffd-tdmqk 1/1 Running 0 1m
nginx-6f9f58dffd-tesqr 1/1 Running 0 1m

Deployment может использовать maxSurge и maxUnavailable параметры для контроля доли pods, пере‑создаваемых во время обновления, что полезно во многих сценариях. Конфигурация выглядит следующим образом:

spec:
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
type: 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 nginx
deployment.apps/nginx rolled back

Развёртывание может быть легко откатано, потому что использует ReplicaSet для управления pod. После обновления предыдущий ReplicaSet всё ещё существует. Развёртывание откатывается с использованием предыдущего ReplicaSet для повторного создания pod. Количество ReplicaSet, хранящихся в развёртывании, можно ограничить revisionHistoryLimit параметр. Значение по умолчанию 10.