Иногда вы можете попасть в ситуацию, когда вам нужно перезапустить Pod. Например, если ваш модуль находится в состоянии ошибки.
В зависимости от политики перезапуска Kubernetes сам пытается перезапустить и исправить это.
Но если это не сработает и вы не можете найти источник ошибки, перезапуск Kubernetes Pod вручную — это самый быстрый способ заставить ваше приложение снова заработать.
Как перезапустить поды в Kubernetes
К сожалению, для этой цели нет команды kubectl restart pod. Вот несколько способов перезапустить поды:
- Модуль развертывания перезапускается
- Масштабирование количества реплик
Позвольте нам подробно показать вам оба метода.
Метод 1. Перезапуск модуля развертывания
Начиная с версии Kubernetes 1.15, вы можете выполнять непрерывный перезапуск развертываний.
Контроллер убивает по одному модулю за раз и полагается на ReplicaSet для масштабирования новых модулей, пока все модули не станут новее, чем время перезапуска. На наш взгляд, это лучший способ перезапустить ваши поды, так как ваше приложение не выйдет из строя.
Возьмем пример. У вас есть развертывание с именем my-dep, которое состоит из двух модулей (поскольку для реплики установлено значение два).
root@andreyex:~# kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE my-dep 2/2 2 2 13s
Давайте узнаем детали pod:
root@andreyex:~# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES my-dep-6d9f78d6c4-8j5fq 1/1 Running 0 47s 172.16.213.255 kworker-rj2 <none> <none> my-dep-6d9f78d6c4-rkhrz 1/1 Running 0 47s 172.16.213.35 kworker-rj1 <none> <none>
Теперь давайте развернем перезапуск для развертывания my-dep с помощью такой команды:
kubectl rollout restart deployment name_of_deployment
Вы помните название развертывания из предыдущих команд? Используйте это здесь:
root@andreyex:~# kubectl rollout restart deployment my-dep deployment.apps/my-dep restarted
Вы можете наблюдать за процессом завершения работы старых модулей и создания новых с помощью команды kubectl get pod -w:
root@andreyex:~# kubectl get pod -w NAME READY STATUS RESTARTS AGE my-dep-557548758d-kz6r7 1/1 Running 0 5s my-dep-557548758d-svg7w 0/1 ContainerCreating 0 1s my-dep-6d9f78d6c4-8j5fq 1/1 Running 0 69s my-dep-6d9f78d6c4-rkhrz 1/1 Terminating 0 69s my-dep-6d9f78d6c4-rkhrz 0/1 Terminating 0 69s my-dep-557548758d-svg7w 0/1 ContainerCreating 0 1s my-dep-557548758d-svg7w 1/1 Running 0 3s my-dep-6d9f78d6c4-8j5fq 1/1 Terminating 0 71s my-dep-6d9f78d6c4-8j5fq 0/1 Terminating 0 72s my-dep-6d9f78d6c4-rkhrz 0/1 Terminating 0 74s my-dep-6d9f78d6c4-rkhrz 0/1 Terminating 0 74s my-dep-6d9f78d6c4-8j5fq 0/1 Terminating 0 76s my-dep-6d9f78d6c4-8j5fq 0/1 Terminating 0 76s
Если вы проверите модули сейчас, то увидите, что здесь детали изменились:
root@andreyex:~# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES my-dep-557548758d-kz6r7 1/1 Running 0 42s 172.16.213.43 kworker-rj1 <none> <none> my-dep-557548758d-svg7w 1/1 Running 0 38s 172.16.213.251 kworker-rj2 <none> <none>
Метод 2. Масштабирование количества реплик.
В среде CI/CD процесс перезагрузки модулей при возникновении ошибки может занять много времени, так как он должен снова пройти весь процесс сборки.
Более быстрый способ добиться этого — использовать команду kubectl scale для изменения номера реплики на ноль, и как только вы установите число больше нуля, Kubernetes создаст новые реплики.
Давай попробуем. Сначала проверьте свои pod:
root@andreyex:~# kubectl get pod NAME READY STATUS RESTARTS AGE my-dep-557548758d-kz6r7 1/1 Running 0 11m my-dep-557548758d-svg7w 1/1 Running 0 11m
Получите информацию о развертывании:
root@andreyex:~# kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE my-dep 2/2 2 2 12m
Теперь установите номер реплики на ноль:
root@andreyex:~# kubectl scale deployment --replicas=0 my-dep deployment.apps/my-dep scaled
А затем установите его обратно на два:
root@andreyex:~# kubectscale deployment --replicas=2 my-dep deployment.apps/my-dep scaled
Проверьте pod сейчас:
root@andreyex:~# kubectl get pod NAME READY STATUS RESTARTS AGE my-dep-557548758d-d2pmd 1/1 Running 0 10s my-dep-557548758d-gprnr 1/1 Running 0 10s
Вы успешно перезапустили модули Kubernetes.
Используйте любой из вышеперечисленных методов, чтобы быстро и безопасно заставить ваше приложение работать, не затрагивая конечных пользователей.
После выполнения этого упражнения убедитесь, что вы нашли основную проблему и исправили ее, поскольку перезапуск модуля не устранит основную проблему.
Надеюсь, вам понравится этот совет Kubernetes. Не забудьте подписаться на больше.