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

O agendador e o controlador-gerente estão em execução?
Antoine Cotten

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>

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.


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"
]

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.


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.


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}}'

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

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 .


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> 

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

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.