Riavvia il contenitore all'interno del pod


112

Ho un pod test-1495806908-xn5jncon 2 contenitori. Vorrei riavviare uno di loro chiamato container-test. È possibile riavviare un singolo contenitore all'interno di un pod e come? In caso contrario, come riavvio il pod?

Il pod è stato creato utilizzando un deployment.yamlcon:

kubectl create -f deployment.yaml

Risposte:


144

È possibile riavviare un singolo contenitore

Non attraverso kubectl, sebbene a seconda della configurazione del tuo cluster puoi "barare" e docker kill the-sha-goes-here, il che farà sì che kubelet riavvii il contenitore "non riuscito" (supponendo, ovviamente, che la politica di riavvio per il Pod dica che è quello che dovrebbe fare)

come faccio a riavviare il pod

Dipende da come è stato creato il pod, ma in base al nome del pod che hai fornito, sembra essere sotto la supervisione di un ReplicaSet, quindi puoi semplicemente kubectl delete pod test-1495806908-xn5jne kubernetes ne creerà uno nuovo al suo posto (il nuovo pod avrà un nome diverso, quindi non aspettarti kubectl get podsdi tornare test-1495806908-xn5jnmai più)


7
La politica di riavvio predefinita è sempre riavvia
Hem

Se posso fare questo docker kill the-sha-goes-here:, allora perché non farlo docker container restart the-sha-goes-hereinvece? perché affidarsi kubeleta riavviarlo? Ad ogni modo, il vero problema è che dove eseguo il dockercomando anche per uccidere il contenitore. Attivato could-shell, dockernon mostra i contenitori dei cluster k8s!
Nawaz

53

Ci sono casi in cui desideri riavviare un contenitore specifico invece di eliminare il pod e lasciare che Kubernetes lo ricrea.

Fare un lavoro kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5per me.

(Ho cambiato il comando da reboota in /sbin/killall5base ai seguenti consigli.)


28
Non tutti i contenitori hanno reboot; Ho avuto più fortuna con l'esecuzione /sbin/killall5invece; che uccide tutti i processi e il contenitore uscirà.
Ingo Karkat

1
E non tutti i container hanno un utente root;)
JuliSmz

4
-1, perché ... Stai usando l'effetto collaterale del "riavvio" che interrompe tutti i processi e ne ripristina Kubernetes. Sta facendo molte ipotesi: esecuzione come root, disponibilità del binario nel contenitore, una politica di riavvio abilitata, ecc. Inoltre, questo ingombra i registri su un errore del processo, il che non è l'ideale.
gertvdijk

1
Quindi sembra che alpine non abbia il killall, ma / sbin / reboot funziona alla grande. kubectl exec POD_NAME -c CONTAINER_NAME /sbin/rebootha funzionato a
meraviglia

38

Sia il pod che il contenitore sono temporanei, prova a utilizzare il seguente comando per arrestare il contenitore specifico e il cluster k8s riavvierà un nuovo contenitore.

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

Questo invierà un SIGTERMsegnale al processo 1, che è il processo principale in esecuzione nel contenitore. Tutti gli altri processi saranno figli del processo 1 e verranno terminati dopo l'uscita dal processo 1. Vedi la manpage kill per altri segnali che puoi inviare.


3
Ho provato altre risposte e questa è stata l'unica che ha funzionato per me, mi sembra che sia la più generale.
Batato

come ottengo il nome del contenitore in esecuzione all'interno di un pod ??
AATHITH RAJENDRAN

Il mio container Alpine è andato in uno stato malsano di qualche tipo quando ho provato questo. kubectl get po mostra Error nella colonna di stato per il pod ..
Atifm

17

L'intera ragione per avere kubernetes è che gestisce i contenitori per te in modo che tu non debba preoccuparti così tanto del ciclo di vita dei contenitori nel pod.

Poiché hai una deploymentconfigurazione che utilizza replica set. Puoi eliminare il pod utilizzando kubectl delete pod test-1495806908-xn5jne kubernetes gestirà la creazione di un nuovo pod con i 2 contenitori senza tempi di inattività. Il tentativo di riavviare manualmente singoli container nei pod nega tutti i vantaggi di kubernetes.


2
Ho sperimentato tempi di inattività quando il processo di terminazione del pod è diventato 0/1
Dean Christian Armada

6
Devi stare attento affermando "senza tempi di inattività". Dipende dalla tua configurazione esatta. Inoltre, il tempo di inattività zero ha sfide da solo.
Nicolas

Quando elimino un pod nella mia distribuzione con una sola replica, si verificano sempre tempi di inattività.
Nyein Chan Wynn

7

Tutte le risposte precedenti hanno menzionato l'eliminazione del pod ... ma se hai molti pod dello stesso servizio, sarebbe noioso eliminarli ognuno di essi ...

Pertanto, propongo la seguente soluzione, riavvia :

  • 1) Imposta la scala su zero:

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

    Il comando precedente terminerà tutti i tuoi pod con il nome <<name>>

  • 2) Per riavviare il pod, impostare le repliche su più di 0

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

    Il comando precedente avvierà nuovamente i tuoi pod con 2 repliche.


5
La domanda era su come riavviare un singolo contenitore all'interno di un pod.
Chris Beach

Inoltre, il ridimensionamento a 0 pod non funzionerà per le applicazioni a disponibilità elevata. Usa kubectl patch deployment <deployment name> -p "{\"spec\": {\"template\": {\"metadata\": { \"labels\": { \"redeploy\": \"$(date +%s)\"}}}}}"invece. Ciò aggiornerà la distribuzione e quindi avvierà la ricreazione di tutti i pod gestiti da essa in base alla strategia di aggiornamento continuo.
Kostrahb,

3

Usiamo una riga di comando piuttosto comoda per forzare la ridistribuzione di nuove immagini sul pod di integrazione.
Abbiamo notato che tutti i nostri contenitori alpini eseguono il loro comando di "sostegno" su PID 5. Pertanto, inviandogli un SIGTERMsegnale si abbassa il contenitore. imagePullPolicyessendo impostato su, Alwaysil kubelet richiama l'ultima immagine quando ripristina il contenitore.

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

1
cosa rappresentano -15 e 5?
John Balvin Arias

2
@JohnBalvinAriasè nascosto nella descrizione sopra, ma kill -15 5stai eseguendo il comando kill per inviare il segnale "-15" al processo con il PID 5. Questo è il modo in cui dici a un processo che vorresti che terminasse (SIGTERM ) e avere il tempo necessario per ripulire tutte le risorse aperte (file temporanei, transazioni di rollback db, chiudere connessioni, qualunque cosa). Contrariamente a -9 (SIGKILL), interrompe immediatamente il processo, non permettendogli di ripulire le risorse aperte.
Conrad.Dean

2

Uccidere il processo specificato nel Dockerfile CMD/ENTRYPOINT funziona per me. (Il contenitore si riavvia automaticamente)

Il riavvio non era consentito nel mio contenitore, quindi ho dovuto utilizzare questa soluzione alternativa.


2

Si è verificato un problema in corednspod, ho eliminato tale pod da

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

Il suo pod si riavvierà automaticamente.


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

Supponendo che il contenitore venga eseguito come root, il che non è consigliato.

Nel mio caso, quando ho cambiato la configurazione dell'applicazione, ho dovuto riavviare il contenitore che è stato utilizzato in un modello sidecar, ucciderei il PID per l'applicazione di avvio a molla che è di proprietà dell'utente docker.


1
Se scrivi kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ..., è molto più facile per le persone copiare / incollare.
William Pursell
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.