Перезавантажте контейнер у стручку


112

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

Стручок створено за deployment.yamlдопомогою:

kubectl create -f deployment.yaml

Відповіді:


144

Чи можливо перезапустити один контейнер

Не наскрізь kubectl, хоча залежно від налаштування кластеру ви можете "обдурити", і docker kill the-sha-goes-hereце призведе до того, що кубелет перезапустить контейнер "невдалий" (якщо, звичайно, політика перезавантаження для 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!
Наваз

53

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

Виконував kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5працю для мене.

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


28
Не кожен контейнер має reboot; Я мав більше удачі з виконанням /sbin/killall5замість цього; що вбиває всі процеси, і контейнер вийде.
Інго Каркат

1
І не в кожному контейнері є користувач root;)
JuliSmz

4
-1, тому що ... Ви використовуєте побічний ефект "перезавантаження", вбиваючи всі процеси та відновлення його Kubernetes. Це робить багато припущень: запуск як root, наявність бінарного файлу в контейнері, перезапускPolicy, який увімкнено і т.д.
gertvdijk

1
Так виглядає, що альпійський не має кілла, але / sbin / reboot чудово працює. kubectl exec POD_NAME -c CONTAINER_NAME /sbin/rebootпрацював як шарм
Atifm

38

І струк, і контейнер є ефемерними, спробуйте скористатися наступною командою, щоб зупинити конкретний контейнер, і кластер k8s перезапустить новий контейнер.

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

Це відправить SIGTERMсигнал на процес 1, який є основним процесом, що працює в контейнері. Усі інші процеси будуть дочірніми в процесі 1 і будуть припинені після завершення процесу 1. Перегляньте сторінку вбивства щодо інших сигналів, які можна надіслати.


3
Я спробував інші відповіді, і ця була єдиною, яка працювала на мене, мені здається, що вона є найбільш загальною.
Батато

як мені отримати ім’я контейнера, який працює всередині стручка ??
AATHITH RAJENDRAN

Коли я спробував це, мій альпійський контейнер перейшов у нездоровий статус. kubectl get po shows Помилка у стовпці статусу для pod ..
Atifm

17

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

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


2
Я пережив простої, коли процес мого завершення струшу став 0/1
Дін Крістіан Армада

6
Вам потрібно бути обережним, заявляючи "без простоїв". Це залежить від вашої точної конфігурації. Плюс нульовий час простою має проблеми самостійно.
Ніколас

Коли я видаляю стручок у моєму розгортанні лише з 1 реплікою, я завжди відчуваю час простою.
Nyein Chan Wynn

7

Усі вищезазначені відповіді згадували про видалення стручка ... але якщо у вас є багато стручків однієї служби, то було б нудно видалити кожен з них ...

Тому пропоную перезапустити наступне рішення :

  • 1) Встановити шкалу до нуля:

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

    Наведена вище команда припинить усі ваші стручки з назвою <<name>>

  • 2) Щоб запустити струк знову, встановіть репліки більше 0

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

    Наведена вище команда знову запустить ваші стручки з 2-х реплік.


5
Питання було про те, як перезапустити окремий контейнер у межах стручка.
Кріс Біч

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

3

Ми використовуємо досить зручний командний рядок, щоб примусити повторно розгорнути свіжі зображення на інтеграційній стручці.
Ми помітили, що наші альпійські контейнери всі виконують свою команду "підтримка" на 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 ) і не знадобиться час, щоб очистити будь-які відкриті ресурси (тимчасові файли, відкатані транзакції db, тісні з’єднання тощо). Суперечивши -9 (SIGKILL), процес вбиває негайно, не дозволяючи йому очистити будь-які відкриті ресурси.
Conrad.Dean

2

Знищення процесу , вказаний в Dockerfile в 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, що не рекомендується.

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


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