Pods bloqueados no status Terminando

244

Tentei excluir um ReplicationControllercom 12 pods e pude ver que alguns deles estão presos no Terminatingstatus.

Meu cluster Kubernetes consiste em um nó do plano de controle e três nós de trabalho instalados nas máquinas virtuais do Ubuntu.

Qual poderia ser o motivo desse problema?

NAME        READY     STATUS        RESTARTS   AGE
pod-186o2   1/1       Terminating   0          2h
pod-4b6qc   1/1       Terminating   0          2h
pod-8xl86   1/1       Terminating   0          1h
pod-d6htc   1/1       Terminating   0          1h
pod-vlzov   1/1       Terminating   0          1h
Dimuthu
fonte
O agendador e o controlador-gerente estão em execução?
Antoine Cotten
1
Pode estar relacionado a github.com/kubernetes/kubernetes/issues/51835
donhector 19/03/18

Respostas:

471

Você pode usar o seguinte comando para excluir o POD com força.

kubectl delete pod <PODNAME> --grace-period=0 --force --namespace <NAMESPACE>
Nitin
fonte
3
esta foi a solução para mim em um 1.2.4. Pods tinha sido terminar a noite toda
tback
6
No meu caso, tenho que adicionar mais uma opção: --forcepara que os pods sejam temperados.
BMW
17
Fiz isso no meu cluster e o pod parecia ter sido removido, mas quando verifiquei o nó, o contêiner ainda estava em execução. Acabei reiniciando o Docker no próprio nó. github.com/kubernetes/kubernetes/issues/25456 Apenas tome cuidado para não esconder um problema sistêmico com este comando.
Mqsoh
4
@mqsoh: a exclusão forçada basta removê-lo da loja api-server (etcd), o recurso real excluído pode acabar sendo executado indefinidamente.
bits de
8
"aviso: a exclusão imediata não espera confirmação de que o recurso em execução foi encerrado. O recurso pode continuar em execução no cluster indefinidamente" Quais recursos?
Akshay
57

Forçar a exclusão do pod:

kubectl delete pod --grace-period=0 --force --namespace <NAMESPACE> <PODNAME>

A --forcebandeira é obrigatória.

Joan
fonte
41
Mas a verdadeira questão para mim é "por que precisamos recorrer a isso em primeiro lugar?" Que tipos de coisas fazem com que os pods entrem nesse estado preso em condições operacionais normais?
neverfox
2
Bem, posso dar um exemplo: tínhamos um contêiner de java que tinha um desligamento gracioso, mas estava se recolhendo até a morte, não reagindo a sinais.
Aurelia
1
É bom fornecer o espaço para nome, caso contrário, em um ambiente com vários nomes, seu pod não será encontrado; por padrão, ele estará procurando no kube-systemespaço para nome.
Daniel Andrei Mincă
Para forçar a exclusão de todos os pods em uma namesapce de uma só vezktl get pods -o custom-columns=:metadata.name | xargs kubectl delete pod --force --grace-period=0
deepdive 17/03
21

Exclua o bloco finalizadores do recurso (pod, implantação, ds etc ...) yaml:

"finalizers": [
  "foregroundDeletion"
]
Roee Rakovsky
fonte
1
O volume persistente foi excluído após isso. O que isso realmente faz?
Raiyan
Meu pod preso no estado final foi removido instantaneamente.
Kuberchaun
Esta foi a única coisa que consertou o pod preso para mim quando delete -grace-period=0 --forcenão o fez. Eu também apreciaria alguma elaboração sobre o que isso faz exatamente, no entanto.
valorl
Esta página explica o primeiro planoDeletion. É um valor de metadados que indica que o objeto está em processo de exclusão. kubernetes.io/docs/concepts/workloads/controllers/… #
Sean Keane
14

Resposta prática - você sempre pode excluir um pod de término executando:

kubectl delete pod NAME --grace-period=0

Resposta histórica - Ocorreu um problema na versão 1.1 em que, às vezes, os pods ficam ociosos no estado Terminando se seus nós são removidos de maneira não limpa do cluster.

Alex Robinson
fonte
1
Eu acho que esse é o problema. Desliguei um minion vm sem remover dos nós. Esse comportamento é aceitável? Ou existe uma correção para remover esses pods dos kubernetes?
Dimuthu
Sim, a solução alternativa até a versão 1.2 é excluir os pods.
Alex Robinson
36
Você sempre pode forçar excluir um pod de terminação comkubectl delete pod NAME --grace-period=0
Clayton
3
O documento diz que, ao executar kubectl delete ...uma SIG_TERMsolicitação, será enviado para o contêiner. Mas e se, após o período de carência, o contêiner ainda estiver em execução? Eu tenho um monte de pods presos Terminating, alguns escritos em go, outros em nodejs. O replicationController foi removido e o contêiner ainda está em execução
Quyen Nguyen Tuan 9/16
4
kubectl delete pod PODNAME --grace-period=0trabalhou para mim como sugerido por Clayton.
Yogesh Jilhawar
13

Eu encontrei este comando mais direto:

for p in $(kubectl get pods | grep Terminating | awk '{print $1}'); do kubectl delete pod $p --grace-period=0 --force;done

Ele excluirá todos os pods no status Terminando no namespace padrão.

belabrinel
fonte
1
Se você deseja executá-lo em outros espaços para nome, como kube-systemuse:for p in $(kubectl get pods -n kube-system| grep Terminating | awk '{print $1}'); do kubectl delete pod $p --grace-period=0 --force -n kube-system;done
acrogenesis 15/04/19
8

No meu caso, a --forceopção não funcionou. Eu ainda podia ver o casulo! Ele ficou preso no modo Terminação / Desconhecido. Então, depois de correr

kubectl delete pods <pod> -n redis --grace-period=0 --force

Eu corri

kubectl patch pod <pod> -p '{"metadata":{"finalizers":null}}'
sh0umik
fonte
2
Antes de fazer isso, vale a pena ler kubernetes.io/docs/concepts/workloads/controllers/… para entender o que são finalizadores. Além disso, olhando para o finalizador específico que é sugestões elasticidade, Poder preso por que ele está preso e se é seguro para ignorar ...
Beni Cherniavsky-Paskin
5

Se --grace-period=0não estiver funcionando, você poderá:

kubectl delete pods <pod> --grace-period=0 --force
Paul Ma
fonte
Existem algumas situações em que isso parece funcionar, mas na verdade não é excluído. Pode ter a ver com problemas nos quais o kubelet perde o estado do pod e não pode obter o estado, deixando-o .. (por exemplo, github.com/kubernetes/kubernetes/issues/51835 ). Ainda não encontrei uma maneira de eliminá-lo.
cgseller
3

Eu me deparei com isso recentemente ao remover o espaço de nome rook ceph - ele ficou preso no estado Terminating.

A única coisa que ajudou foi remover o finalizador do kubernetes chamando diretamente a API do k8s com curl, conforme sugerido aqui .

  • kubectl get namespace rook-ceph -o json > tmp.json
  • exclua o finalizador do kubernetes tmp.json(deixe a matriz vazia)"finalizers": [] )
  • executar kubectl proxyem outro terminal para fins de autenticação e executar após a solicitação de curvatura na porta retornada
  • curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json 127.0.0.1:8001/k8s/clusters/c-mzplp/api/v1/namespaces/rook-ceph/finalize
  • espaço para nome se foi

Desmontagem detalhada da torre ceph aqui .

zub0r
fonte
3

A pergunta original é " Qual poderia ser o motivo desse problema? " E a resposta é discutida em https://github.com/kubernetes/kubernetes/issues/51835 e https://github.com/kubernetes/kubernetes/issues / 65569 & veja https://www.bountysource.com/issues/33241128-unable-to-remove-a-stopped-container-device-or-resource-busy

Isso é causado pelo vazamento da montagem do docker em outro espaço de nome.

Você pode fazer logon no host de pod para investigar.

minikube ssh
docker container ps | grep <id>
docker container stop <id> 
noelmcloughlin
fonte
Não acredito que essa seja a resposta menos votada e não tive um único comentário. Enquanto todas as outras respostas abordam maneiras de contornar ou resolver o problema, o OP perguntou claramente o motivo pelo qual a condição ocorre em primeiro lugar.
MisterStrickland
0

Eu me deparei com isso recentemente para liberar recursos no meu cluster. Aqui está o comando para excluir todos eles.

kubectl get pods --all-namespaces | grep Terminating | while read line; do 
pod_name=$(echo $line | awk '{print $2}' ) name_space=$(echo $line | awk 
'{print $1}' ); kubectl delete pods $pod_name -n $name_space --grace-period=0 --force; 
done

espero que isso ajude alguém que leu isso

rrr
fonte