Можно ли перезапустить отдельный контейнер
Не через 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
когда-нибудь снова)
docker kill the-sha-goes-here
то почему бы не сделатьdocker container restart the-sha-goes-here
вместо этого? зачем рассчитывать наkubelet
его перезапуск? В любом случае, настоящая проблема в том, что где мне запуститьdocker
команду, даже убить контейнер. Вклcould-shell
,docker
не показывает контейнеры из кластеров k8s!Бывают случаи, когда вы хотите перезапустить определенный контейнер вместо того, чтобы удалять модуль и позволять Kubernetes воссоздать его.
У
kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5
меня получилось.(Я изменил команду с
reboot
на/sbin/killall5
на основе приведенных ниже рекомендаций.)источник
reboot
; Мне больше повезло с исполнением/sbin/killall5
; это убивает все процессы, и контейнер выйдет.kubectl exec POD_NAME -c CONTAINER_NAME /sbin/reboot
работал как шармИ pod, и контейнер являются эфемерными, попробуйте использовать следующую команду, чтобы остановить конкретный контейнер, и кластер k8s перезапустит новый контейнер.
Это отправит
SIGTERM
сигнал процессу 1, который является основным процессом, запущенным в контейнере. Все остальные процессы будут дочерними по отношению к процессу 1 и будут завершены после выхода из процесса 1. См. Страницу kill man для других сигналов, которые вы можете отправлять.источник
Вся причина наличия кубернетов в том, что он управляет контейнерами за вас, поэтому вам не нужно так сильно заботиться о жизненном цикле контейнеров в модуле.
Поскольку у вас есть
deployment
установка, которая используетreplica set
. Вы можете удалить модуль с помощью,kubectl delete pod test-1495806908-xn5jn
и kubernetes будет управлять созданием нового модуля с двумя контейнерами без простоев. Попытка вручную перезапустить отдельные контейнеры в подах сводит на нет все преимущества кубернетов.источник
Во всех приведенных выше ответах упоминалось об удалении модуля ... но если у вас есть много модулей одной и той же службы, было бы утомительно удалять каждый из них ...
Поэтому предлагаю следующее решение, перезагрузить :
1) Установите масштаб на ноль:
Вышеупомянутая команда завершит все ваши поды с именем
<<name>>
2) Чтобы снова запустить pod, установите для реплик больше 0
Приведенная выше команда снова запустит ваши поды с двумя репликами.
источник
kubectl patch deployment <deployment name> -p "{\"spec\": {\"template\": {\"metadata\": { \"labels\": { \"redeploy\": \"$(date +%s)\"}}}}}"
Вместо этого используйте . Это обновит развертывание и, следовательно, инициирует воссоздание всех управляемых им модулей в соответствии со стратегией скользящего обновления.Мы используем довольно удобную командную строку для принудительного повторного развертывания свежих образов в модуле интеграции.
Мы заметили, что все наши контейнеры alpine запускают свою команду "поддержания" на PID 5. Следовательно, отправка ему
SIGTERM
сигнала приводит к остановке контейнера.imagePullPolicy
установлен, чтобыAlways
кубелет повторно вытягивал последний образ, когда он возвращает контейнер.источник
kill -15 5
вы запускаете команду kill для отправки сигнала "-15" процессу с PID 5. Вот как вы сообщаете процессу, что хотите, чтобы он завершился (SIGTERM ) и потребуется время, чтобы очистить все открытые ресурсы (временные файлы, откат транзакций БД, закрытие соединений и т. д.). В отличие от -9 (SIGKILL), немедленно завершает процесс, не позволяя ему очистить открытые ресурсы.У меня работает убийство процесса, указанного в Dockerfile's
CMD
/ENTRYPOINT
. (Контейнер перезапускается автоматически)В моем контейнере перезагрузка была запрещена, поэтому мне пришлось использовать этот обходной путь.
источник
Возникла проблема с
coredns
модулем, я удалил такой модульЕго модуль перезапустится автоматически.
источник
Предполагается, что контейнер запущен с правами root, что не рекомендуется.
В моем случае, когда я изменил конфигурацию приложения, мне пришлось перезагрузить контейнер, который использовался в шаблоне sidecar, я бы убил PID для приложения весенней загрузки, которое принадлежит пользователю докера.
источник
kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ...
, людям будет намного проще копировать / вставлять.