Поиск по сайту:

Как перезапустить модули Kubernetes с помощью Kubectl


Поды Kubernetes должны работать без вмешательства, но иногда вы можете столкнуться с проблемой, когда контейнер работает не так, как должен. Перезапуск модуля может помочь восстановить нормальную работу.

Kubectl не имеет прямого способа перезапустить отдельные модули. Поды должны работать до тех пор, пока они не будут заменены в рамках процедуры развертывания. Обычно это происходит, когда вы выпускаете новую версию образа контейнера.

Вот несколько методов, которые вы можете использовать, если хотите перезапустить модули без создания нового образа или запуска конвейера непрерывной интеграции. Они могут помочь, если вы думаете, что новый набор контейнеров снова запустит вашу рабочую нагрузку.

Масштабирование количества реплик

Несмотря на отсутствие перезапуска kubectl, вы можете добиться чего-то подобного, увеличив количество запущенных реплик контейнеров. Это работает, когда ваш модуль является частью Deployment, StatefulSet, ReplicaSet или контроллера репликации.

kubectl scale deployment my-deployment --replicas=0
kubectl scale deployment my-deployment --replicas=3

Уменьшение масштаба развертывания до 0 приведет к удалению всех существующих модулей. Подождите, пока модули не будут завершены, используя kubectl get pods, чтобы проверить их статус, а затем измените масштаб развертывания обратно на предполагаемое количество реплик. Kubernetes создаст новые поды со свежими экземплярами контейнеров.

Бесперебойный перезапуск с развертыванием

Ручная настройка количества реплик имеет ограничение: уменьшение масштаба до 0 приведет к периоду простоя, когда не будет доступных модулей для обслуживания ваших пользователей. Альтернативный вариант — инициировать последовательный перезапуск, который позволяет заменить набор модулей без простоев. Он доступен в Kubernetes v1.15 и более поздних версиях.

kubectl rollout restart deployment my-deployment

Когда вы запускаете эту команду, Kubernetes постепенно завершает работу и заменяет ваши поды, обеспечивая при этом работоспособность некоторых контейнеров. Поэтапный характер развертывания позволяет вам продолжать обслуживать клиентов, эффективно «перезапуская» ваши модули за кулисами.

После завершения развертывания у вас будет то же количество реплик, что и раньше, но каждый контейнер будет новым экземпляром. Вы можете проверить статус развертывания, используя kubectl get pods, чтобы получить список модулей и посмотреть, как они заменяются. Также есть kubectl rollout status deployment/my-deployment, который также показывает текущий прогресс.

kubectl rollout работает с Deployments, DaemonSets и StatefulSets. В большинстве случаев это должен быть ваш вариант, когда вы хотите завершить работу своих контейнеров и немедленно запустить новые.

(Ab) с использованием мониторинга ReplicaSet

Когда ваш под является частью набора реплик или развертывания, вы можете инициировать замену, просто удалив его. ReplicaSet заметит, что Pod исчез, поскольку количество экземпляров контейнера упадет ниже числа целевых реплик.

kubectl delete pod my-pod

ReplicaSet вмешается, чтобы восстановить минимальный уровень доступности. Он автоматически создаст новый Pod, запустив новый контейнер для замены старого.

Технически это побочный эффект — лучше использовать команды scale или rollout, которые являются более явными и предназначены для этого варианта использования. Тем не менее, ручное удаление может быть полезным методом, если вы знаете личность единственного некорректно работающего пода внутри ReplicaSet или Deployment. Развертывание заменит все управляемые модули, а не только тот, в котором возникла ошибка.

Вы можете расширить технику замены всех неисправных модулей с помощью одной команды:

kubectl delete pods --field-selector=status.phase=Failed

Любые поды в состоянии Failed будут остановлены и удалены. Контроллер репликации заметит несоответствие и добавит новые поды, чтобы вернуть состояние к настроенному количеству реплик. Если вы уверены, что старые поды вышли из строя из-за временной ошибки, новые должны продолжать работать в исправном состоянии.

Изменение аннотаций модуля

Другой способ принудительной замены модуля — добавить или изменить аннотацию. Kubernetes заменит Pod, чтобы применить изменения.

Вы можете использовать команду kubectl annotate, чтобы применить аннотацию:

kubectl annotate pods my-pod app-version="2" --overwrite

Эта команда обновляет аннотацию app-version в my-pod. Флаг --overwrite указывает Kubectl применить изменение, даже если аннотация уже существует. Без него вы можете добавлять новые аннотации только в качестве меры безопасности, чтобы предотвратить непреднамеренные изменения.

Обновление переменных среды развертывания имеет тот же эффект, что и изменение аннотаций. Это идеально, если вы уже предоставляете номер версии приложения, идентификатор сборки или дату развертывания в своей среде.

kubectl set env deployment my-deployment APP_VERSION="2"

Заключение

Поды Kubernetes обычно должны работать до тех пор, пока они не будут заменены новым развертыванием. В результате нет прямого способа «перезапустить» отдельный модуль. Если в одном из ваших контейнеров возникла проблема, постарайтесь заменить его, а не перезапускать. Незначительное изменение терминологии лучше соответствует операционной модели Kubernetes Pods без сохранения состояния.

Увеличьте количество реплик, инициируйте развертывание или вручную удалите поды из набора реплик, чтобы закрыть старые контейнеры и запустить новые экземпляры. Выпуски являются предпочтительным решением для современных выпусков Kubernetes, но другие подходы тоже работают и могут больше подходить для конкретных сценариев.

В первую очередь вы должны думать об этих двух вопросах: хотите ли вы, чтобы все поды в вашем развертывании или наборе реплик были заменены, и приемлемо ли какое-либо время простоя? Ручное удаление пода может быть идеальным, если вы хотите «перезапустить» отдельный под без простоев, при условии, что вы используете более одной реплики, в то время как масштаб является вариантом, когда > нельзя использовать, и вас не беспокоит короткий период недоступности.