Respostas:
É 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-xn5jn
e o kubernetes criará um novo em seu lugar (o novo pod terá um nome diferente, por isso não espere kubectl get pods
voltar test-1495806908-xn5jn
nunca mais)
docker kill the-sha-goes-here
então por que não fazer docker container restart the-sha-goes-here
? por que confiar kubelet
para reiniciá-lo? De qualquer forma, o verdadeiro problema é onde executo o docker
comando até mesmo para matar o container. Ativado could-shell
, docker
não mostra os containers dos clusters k8s!
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/killall5
trabalho para mim.
(Eu mudei o comando de reboot
para com /sbin/killall5
base nas recomendações abaixo.)
reboot
; Em /sbin/killall5
vez disso, tive mais sorte na execução ; isso mata todos os processos e o contêiner sairá.
kubectl exec POD_NAME -c CONTAINER_NAME /sbin/reboot
funcionou como um encanto
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 SIGTERM
sinal 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.
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 deployment
configuração que usa replica set
. Você pode excluir o pod usando kubectl delete pod test-1495806908-xn5jn
e 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.
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.
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.
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 SIGTERM
sinal leva o contêiner para baixo. imagePullPolicy
sendo 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
kill -15 5
você 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.
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.
kubectl exec -it ${POD_NAME?} -c ${CONTAINER_NAME?} bash ...
, será muito mais fácil para as pessoas copiar / colar.