Reinicie o contêiner dentro do pod


112

Eu tenho um pod test-1495806908-xn5jncom 2 contêineres. Eu gostaria de reiniciar um deles chamado container-test. É possível reiniciar um único contêiner em um pod e como? Se não, como reinicio o pod?

O pod foi criado usando um deployment.yamlcom:

kubectl create -f deployment.yaml

Respostas:


144

É possível reiniciar um único contêiner

Não completamente kubectl, embora dependendo da configuração do seu cluster você possa "trapacear" e docker kill the-sha-goes-here, o que fará com que o kubelet reinicie o contêiner "com falha" (supondo, é claro, que a política de reinicialização do pod diga que é o que ele deve fazer)

como faço para reiniciar o pod

Isso depende de como o pod foi criado, mas com base no nome do pod que você forneceu, ele parece estar sob a supervisão de um ReplicaSet, então você pode apenas kubectl delete pod test-1495806908-xn5jne o kubernetes criará um novo em seu lugar (o novo pod terá um nome diferente, por isso não espere kubectl get podsvoltar test-1495806908-xn5jnnunca mais)


7
A política de reinicialização padrão é sempre reiniciar
Hem

Se eu posso fazer isso: docker kill the-sha-goes-hereentão por que não fazer docker container restart the-sha-goes-here? por que confiar kubeletpara reiniciá-lo? De qualquer forma, o verdadeiro problema é onde executo o dockercomando até mesmo para matar o container. Ativado could-shell, dockernão mostra os containers dos clusters k8s!
Nawaz,

53

Há casos em que você deseja reiniciar um contêiner específico em vez de excluir o pod e permitir que o Kubernetes o recrie.

Fazendo um kubectl exec POD_NAME -c CONTAINER_NAME /sbin/killall5trabalho para mim.

(Eu mudei o comando de rebootpara com /sbin/killall5base nas recomendações abaixo.)


28
Nem todo contêiner tem reboot; Em /sbin/killall5vez disso, tive mais sorte na execução ; isso mata todos os processos e o contêiner sairá.
Ingo Karkat

1
E nem todo contêiner tem usuário root;)
JuliSmz

4
-1, porque ... Você está usando o efeito colateral de 'reinicializar' eliminando todos os processos e a recuperação do Kubernetes deles. Ele está fazendo muitas suposições: execução como root, disponibilidade do binário no contêiner, uma restartPolicy habilitada etc. Além disso, isso confunde os logs sobre uma falha do processo, o que não é o ideal.
gertvdijk de

1
Parece que o alpine não tem killall, mas / sbin / reboot funciona muito bem. kubectl exec POD_NAME -c CONTAINER_NAME /sbin/rebootfuncionou como um encanto
Atifm

38

Tanto o pod quanto o contêiner são efêmeros. Tente usar o seguinte comando para interromper o contêiner específico e o cluster k8s reiniciará um novo contêiner.

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

Isso enviará um SIGTERMsinal para o processo 1, que é o principal processo em execução no contêiner. Todos os outros processos serão filhos do processo 1 e serão encerrados após a saída do processo 1. Veja a página de manual do kill para outros sinais que você pode enviar.


3
Tentei outras respostas e esta foi a única que funcionou para mim, parece-me que é a mais geral.
Batato

como obtenho o nome do contêiner que está sendo executado dentro de um pod?
AATHITH RAJENDRAN

Meu contêiner Alpine entrou em algum tipo de estado prejudicial à saúde quando tentei fazer isso. kubectl get po mostra Erro na coluna de status do pod.
Atifm

17

O principal motivo para ter o kubernetes é que ele gerencia os contêineres para você, de forma que você não precise se preocupar tanto com o ciclo de vida dos contêineres no pod.

Já que você tem uma deploymentconfiguração que usa replica set. Você pode excluir o pod usando kubectl delete pod test-1495806908-xn5jne o kubernetes gerenciará a criação de um novo pod com os 2 contêineres sem qualquer tempo de inatividade. Tentar reiniciar manualmente contêineres únicos em pods anula todos os benefícios do kubernetes.


2
Eu experimentei um tempo de inatividade quando o processo de encerramento do meu pod tornou-se 0/1
Dean Christian Armada

6
Você precisa ter cuidado ao afirmar "sem nenhum tempo de inatividade". Depende da sua configuração exata. Além disso, o tempo de inatividade zero apresenta desafios por si só.
Nicolas

Quando excluo um pod em minha implantação com apenas 1 réplica, sempre fico inativo.
Nyein Chan Wynn

7

Todas as respostas acima mencionaram a exclusão do pod ... mas se você tiver muitos pods do mesmo serviço, seria entediante excluir cada um deles ...

Portanto, proponho a seguinte solução, reinicie :

  • 1) Defina a escala para zero:

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

    O comando acima encerrará todos os seus pods com o nome <<name>>

  • 2) Para iniciar o pod novamente, defina as réplicas para mais de 0

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

    O comando acima iniciará seus pods novamente com 2 réplicas.


5
A pergunta era sobre como reiniciar um único contêiner em um pod.
Chris Beach

Além disso, reduzir para 0 pods não funcionará para aplicativos altamente disponíveis. Use em seu kubectl patch deployment <deployment name> -p "{\"spec\": {\"template\": {\"metadata\": { \"labels\": { \"redeploy\": \"$(date +%s)\"}}}}}"lugar. Isso atualizará a implantação e, portanto, iniciará a recriação de todos os pods gerenciados por ele de acordo com a estratégia de atualização contínua.
Kostrahb

3

Usamos uma linha de comando bastante conveniente para forçar a reimplantação de imagens novas no pod de integração.
Percebemos que todos os nossos contêineres alpinos executam seu comando de "sustentação" no PID 5. Portanto, enviar um SIGTERMsinal leva o contêiner para baixo. imagePullPolicysendo definido como Always, o kubelet extrai novamente a imagem mais recente ao trazer o contêiner de volta.

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

1
o que -15 e 5 representam?
John Balvin Arias,

2
@JohnBalvinArias está inserido na descrição acima, mas kill -15 5você está executando o comando kill para enviar o sinal "-15" para o processo com o PID 5. É assim que você informa um processo que gostaria que ele terminasse (SIGTERM ) e leva um tempo para limpar quaisquer recursos abertos (arquivos temporários, transações de rollback de banco de dados, conexões fechadas, qualquer que seja). Comparado com -9 (SIGKILL), mata o processo imediatamente, não permitindo que ele limpe quaisquer recursos abertos.
Conrad.Dean

2

Eliminar o processo especificado no Dockerfile CMD/ ENTRYPOINTfunciona para mim. (O contêiner é reiniciado automaticamente)

A reinicialização não era permitida em meu contêiner, então tive que usar esta solução alternativa.


2

Houve um problema no corednspod, excluí esse pod por

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

Seu pod será reiniciado automaticamente.


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

Presumindo que o contêiner seja executado como root, o que não é recomendado.

No meu caso, quando alterei a configuração do aplicativo, tive que reinicializar o contêiner que foi usado em um padrão de arquivo secundário, eu mataria o PID para o aplicativo de inicialização de primavera que pertence ao usuário do docker.


1
Se você escrever kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ..., será muito mais fácil para as pessoas copiar / colar.
William Pursell
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.