Перезапустить контейнер внутри модуля


113

У меня есть стручок test-1495806908-xn5jnс 2 емкостями. Хочу перезапустить один из них позвонил container-test. Можно ли перезапустить отдельный контейнер внутри модуля и как? Если нет, как мне перезапустить модуль?

Под был создан с использованием deployment.yaml:

kubectl create -f deployment.yaml

Ответы:


145

Можно ли перезапустить отдельный контейнер

Не через kubectl, хотя в зависимости от настроек вашего кластера вы можете «обмануть» и docker kill the-sha-goes-here, что приведет к тому, что kubelet перезапустит «отказавший» контейнер (при условии, конечно, что политика перезапуска для Pod говорит, что это то, что он должен делать)

как мне перезапустить модуль

Это зависит от того, как был создан Pod, но исходя из указанного вами имени Pod, похоже, что он находится под надзором ReplicaSet, поэтому вы можете просто, kubectl delete pod test-1495806908-xn5jnи kubernetes создаст новый вместо него (новый Pod будет иметь другое имя, так что не ждите, kubectl get podsчто вернусь test-1495806908-xn5jnкогда-нибудь снова)


7
Политика перезапуска по умолчанию - всегда перезапуск
Hem

Если я могу сделать это:, docker kill the-sha-goes-hereто почему бы не сделать docker container restart the-sha-goes-hereвместо этого? зачем рассчитывать на kubeletего перезапуск? В любом случае, настоящая проблема в том, что где мне запустить dockerкоманду, даже убить контейнер. Вкл could-shell, dockerне показывает контейнеры из кластеров k8s!
Наваз,

54

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

У kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5меня получилось.

(Я изменил команду с rebootна /sbin/killall5на основе приведенных ниже рекомендаций.)


28
Не в каждом контейнере есть reboot; Мне больше повезло с исполнением /sbin/killall5; это убивает все процессы, и контейнер выйдет.
Инго Каркат

1
И не в каждом контейнере есть root-пользователь;)
JuliSmz 05

4
-1, потому что ... Вы используете побочный эффект перезагрузки, который убивает все процессы и восстанавливает Kubernetes. Он делает множество предположений: запуск от имени root, доступность двоичного файла в контейнере, включенная политика перезапуска и т. Д. Кроме того, это загромождает журналы о сбое процесса, что не идеально.
gertvdijk

2
Похоже, у alpine нет killall, но / sbin / reboot отлично работает. kubectl exec POD_NAME -c CONTAINER_NAME /sbin/rebootработал как шарм
Атифм

39

И pod, и контейнер являются эфемерными, попробуйте использовать следующую команду, чтобы остановить конкретный контейнер, и кластер k8s перезапустит новый контейнер.

kubectl exec -it [POD_NAME] -c [CONTAINER_NAME] -- /bin/sh -c "kill 1"

Это отправит SIGTERMсигнал процессу 1, который является основным процессом, запущенным в контейнере. Все остальные процессы будут дочерними по отношению к процессу 1 и будут завершены после выхода из процесса 1. См. Страницу kill man для других сигналов, которые вы можете отправлять.


3
Я пробовал другие ответы, и это был единственный, который у меня сработал, мне кажется, что он самый общий.
Batato

как мне получить имя контейнера, который работает внутри модуля?
AATHITH RAJENDRAN 05

Когда я попробовал это, мой контейнер Alpine перешел в какое-то нездоровое состояние. kubectl get po показывает ошибку в столбце статуса для модуля ..
Atifm

17

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

Поскольку у вас есть deploymentустановка, которая использует replica set. Вы можете удалить модуль с помощью, kubectl delete pod test-1495806908-xn5jnи kubernetes будет управлять созданием нового модуля с двумя контейнерами без простоев. Попытка вручную перезапустить отдельные контейнеры в подах сводит на нет все преимущества кубернетов.


2
Я испытал простой, так как процесс прерывания моей капсулы стал 0/1
Дин Кристиан Армада

6
Вы должны быть осторожны, заявляя «без простоев». Это зависит от вашей точной конфигурации. К тому же нулевое время простоя само по себе создает проблемы.
Николас

Когда я удаляю модуль в своем развертывании только с одной репликой, я всегда испытываю простои.
Nyein Chan Wynn

7

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

Поэтому предлагаю следующее решение, перезагрузить :

  • 1) Установите масштаб на ноль:

     kubectl scale deployment <<name>> --replicas=0 -n service 
    

    Вышеупомянутая команда завершит все ваши поды с именем <<name>>

  • 2) Чтобы снова запустить pod, установите для реплик больше 0

    kubectl scale deployment <<name>> --replicas=2 -n service
    

    Приведенная выше команда снова запустит ваши поды с двумя репликами.


5
Вопрос касался того, как перезапустить отдельный контейнер внутри модуля.
Крис Бич

Кроме того, уменьшение количества модулей до 0 не будет работать для приложений с высокой доступностью. kubectl patch deployment <deployment name> -p "{\"spec\": {\"template\": {\"metadata\": { \"labels\": { \"redeploy\": \"$(date +%s)\"}}}}}"Вместо этого используйте . Это обновит развертывание и, следовательно, инициирует воссоздание всех управляемых им модулей в соответствии со стратегией скользящего обновления.
Кострахб,

3

Мы используем довольно удобную командную строку для принудительного повторного развертывания свежих образов в модуле интеграции.
Мы заметили, что все наши контейнеры alpine запускают свою команду "поддержания" на PID 5. Следовательно, отправка ему SIGTERMсигнала приводит к остановке контейнера. imagePullPolicyустановлен, чтобы Alwaysкубелет повторно вытягивал последний образ, когда он возвращает контейнер.

kubectl exec -i [pod name] -c [container-name] -- kill -15 5

1
что означает -15 и 5?
Джон Балвин Ариас

2
@JohnBalvinArias это заправлено в описание выше, но kill -15 5вы запускаете команду kill для отправки сигнала "-15" процессу с PID 5. Вот как вы сообщаете процессу, что хотите, чтобы он завершился (SIGTERM ) и потребуется время, чтобы очистить все открытые ресурсы (временные файлы, откат транзакций БД, закрытие соединений и т. д.). В отличие от -9 (SIGKILL), немедленно завершает процесс, не позволяя ему очистить открытые ресурсы.
Конрад Дин

2

У меня работает убийство процесса, указанного в Dockerfile's CMD/ ENTRYPOINT. (Контейнер перезапускается автоматически)

В моем контейнере перезагрузка была запрещена, поэтому мне пришлось использовать этот обходной путь.


2

Возникла проблема с corednsмодулем, я удалил такой модуль

kubectl delete pod -n=kube-system coredns-fb8b8dccf-8ggcf

Его модуль перезапустится автоматически.


2
kubectl exec -it POD_NAME -c CONTAINER_NAME bash - then kill 1

Предполагается, что контейнер запущен с правами root, что не рекомендуется.

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


1
Если вы пишете kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ..., людям будет намного проще копировать / вставлять.
Уильям Перселл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.