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

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

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

kubectl create -f deployment.yaml

person s5s    schedule 08.09.2017    source источник


Ответы (12)


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

Не через 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)

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

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

Выполнение kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5 сработало для меня.

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

person Zsolt Katona    schedule 13.12.2017
comment
Не в каждом контейнере есть reboot; Мне больше повезло с выполнением /sbin/killall5; это убивает все процессы, и контейнер выйдет. - person Ingo Karkat; 06.04.2018
comment
И не в каждом контейнере есть root-пользователь;) - person JuliSmz; 05.12.2018
comment
-1, потому что ... Вы используете побочный эффект перезагрузки, который убивает все процессы и восстанавливает Kubernetes. Он делает множество предположений: запуск от имени пользователя root, доступность двоичного файла в контейнере, включенная политика перезапуска и т. Д. Кроме того, это загромождает журналы о сбое процесса, что не идеально. - person gertvdijk; 15.02.2019
comment
Похоже, у alpine нет killall, но / sbin / reboot отлично работает. kubectl exec POD_NAME -c CONTAINER_NAME /sbin/reboot работал как шарм - person Atifm; 20.03.2020

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

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

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

person ROY    schedule 29.12.2018
comment
Я пробовал другие ответы, и этот был единственным, который у меня сработал, мне кажется, что он самый общий. - person Batato; 22.05.2019
comment
как мне получить имя контейнера, который работает внутри модуля ?? - person AATHITH RAJENDRAN; 05.07.2019
comment
Когда я попробовал это, мой контейнер Alpine перешел в какое-то нездоровое состояние. kubectl get po показывает ошибку в столбце статуса для модуля. - person Atifm; 20.03.2020
comment
@AATHITHRAJENDRAN, вы можете использовать имя развертывания, и он автоматически выберет модуль - person Kamafeather; 24.11.2020
comment
это действительно сработало! - person Summer-Sky; 22.01.2021

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

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

person Innocent Anigbo    schedule 10.09.2017
comment
Я испытал простои, так как процесс моего завершающего модуля стал 0/1 - person Dean Christian Armada; 10.11.2018
comment
Вы должны быть осторожны, заявляя без простоев. Это зависит от вашей точной конфигурации. К тому же нулевое время простоя само по себе создает проблемы. - person Nicolas; 19.12.2018
comment
Когда я удаляю модуль в своем развертывании только с одной репликой, я всегда испытываю простои. - person Nyein Chan Wynn; 26.01.2019

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

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

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

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

    Приведенная выше команда завершит работу всех ваших модулей с именем <<name>>

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

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

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

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

Я использую

kubectl rollout restart deployment [deployment_name]

or

kubectl delete pod [pod_name]

person jasondayee    schedule 27.04.2021

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

kubectl exec -i [pod name] -c [container-name] -- kill -15 5
person Alexis LEGROS    schedule 26.07.2018
comment
что означает -15 и 5? - person John Balvin Arias; 19.10.2018
comment
@JohnBalvinArias это заправлено в описание выше, но в kill -15 5 вы запускаете команду kill для отправки сигнала -15 процессу с PID 5. Вот как вы сообщаете процессу, что хотите, чтобы он завершился (SIGTERM) и потребуется время, чтобы очистить все открытые ресурсы (временные файлы, откат транзакций БД, закрытие соединений и т. д.). В отличие от -9 (SIGKILL), немедленно завершает процесс, не позволяя ему очистить открытые ресурсы. - person Conrad.Dean; 20.10.2018

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

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

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

person j3ffyang    schedule 01.04.2019

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

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

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

person GreenThumb    schedule 17.09.2019
comment
Если вы напишете kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ..., людям будет намного проще копировать / вставлять. - person William Pursell; 11.12.2019

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

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

person Kevin    schedule 04.12.2018

Я играл со способами перезапуска контейнера. Я нашел для себя следующее решение:

Dockerfile:

...
ENTRYPOINT [ "/app/bootstrap.sh" ]

/app/bootstrap.sh:

#!/bin/bash
/app/startWhatEverYouActuallyWantToStart.sh &
tail -f /dev/null

Каждый раз, когда я хочу перезапустить контейнер, я убиваю процесс с помощью tail -f /dev/null, который нахожу с помощью

kill -TERM `ps --ppid 1 | grep tail | grep -v -e grep | awk '{print $1}'`

После этой команды все процессы, кроме одного с PID==1, будут убиты, а точка входа, в моем случае bootstrap.sh, будет выполнена (снова).

Это для частичного перезапуска - на самом деле это не перезапуск, но, в конце концов, он делает то, что вы хотите. Что касается части с ограничением перезапуска контейнера с именем container-test, вы можете передать имя контейнера рассматриваемому контейнеру (так как в противном случае имя контейнера было бы недоступно внутри контейнера), а затем вы можете решить, делать ли вышеуказанное kill. В вашем deployment.yaml это будет примерно так:

    env:
    - name: YOUR_CONTAINER_NAME
      value: container-test

/app/startWhatEverYouActuallyWantToStart.sh:

#!/bin/bash
...
CONDITION_TO_RESTART=0
...
if [ "$YOUR_CONTAINER_NAME" == "container-test" -a $CONDITION_TO_RESTART -eq 1 ]; then
    kill -TERM `ps --ppid 1 | grep tail | grep -v -e grep | awk '{print $1}'`
fi
person Michael    schedule 13.02.2021

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

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

Если вы не можете переключаться между двумя разными, но эквивалентными тегами (например, :latest / :1.2.3, где последняя - на самом деле версия 1.2.3), вы всегда можете просто быстро переключить его на недопустимый тег (я поставил X в конце, например :latestX или что-то в этом роде), а затем повторно отредактируйте его и сразу же удалите X, это действительно приводит к сбою контейнера, запускающемуся с ошибкой извлечения изображения в течение нескольких секунд.

Так например:

kubectl edit po my-pod-name

Найдите spec.containers[].name, которого хотите убить, а затем найдите image

apiVersion: v1
kind: Pod
metadata:
  #...
spec:
  containers:
  - name: main-container
    #...
  - name: container-to-restart
    image: container/image:tag
#...

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

person Ken Allan    schedule 16.06.2021