O pod do Kubernetes é recriado quando excluído


151

Comecei pods com comando

$ kubectl run busybox --image=busybox --restart=Never --tty -i --generator=run-pod/v1

Ocorreu um erro e agora não consigo excluir isso Pod.

Eu tentei usar os métodos descritos abaixo, mas o Podcontinua sendo recriado.

$ kubectl delete pods  busybox-na3tm
pod "busybox-na3tm" deleted
$ kubectl get pods
NAME                                     READY     STATUS              RESTARTS   AGE
busybox-vlzh3                            0/1       ContainerCreating   0          14s

$ kubectl delete pod busybox-vlzh3 --grace-period=0


$ kubectl delete pods --all
pod "busybox-131cq" deleted
pod "busybox-136x9" deleted
pod "busybox-13f8a" deleted
pod "busybox-13svg" deleted
pod "busybox-1465m" deleted
pod "busybox-14uz1" deleted
pod "busybox-15raj" deleted
pod "busybox-160to" deleted
pod "busybox-16191" deleted


$ kubectl get pods --all-namespaces
NAMESPACE   NAME            READY     STATUS              RESTARTS   AGE
default     busybox-c9rnx   0/1       RunContainerError   0          23s

2
De alguma forma, você conseguiu criar um controlador de replicação passando argumentos errados. O que você ganha kubectl get all -o name?
Graham Dumpleton 18/11/2016

1
Você pode verificar kubectl get eventspara ver o que está criando esses objetos?
Anirudh Ramanathan

3
tente kubctl get rcver se um ReplicationController foi criado. Nesse caso, exclua-o e exclua os pods.
MrE 18/11/16

3
qual versão do kubernetes você está executando? Dependendo da sua versão do kubernetes, é? Pode se comportar de maneira diferente. por exemplo, antes da versão 1.2, ele sempre criava a implantação. kubectl get deployment
Lwolf

19
Se alguém terminar aqui: - A exclusão de implantações resolveu o problema para mim. kubectl delete deployment <deployment_name>. Para obter o nome da implantação, façakubectl get deployments
Vasanth Sriram 7/16

Respostas:


290

Você precisa excluir a implantação, que por sua vez deve excluir os pods e os conjuntos de réplicas https://github.com/kubernetes/kubernetes/issues/24137

Para listar todas as implantações:

kubectl get deployments --all-namespaces

Em seguida, para excluir a implantação:

kubectl delete -n NAMESPACE deployment DEPLOYMENT

Onde NAMESPACE é o namespace em que está e DEPLOYMENT é o nameda implantação.

Em alguns casos, ele também pode estar em execução devido a um trabalho ou daemonset. Verifique o seguinte e execute o comando de exclusão apropriado.

kubectl get jobs

kubectl get daemonsets.app --all-namespaces

kubectl get daemonsets.extensions --all-namespaces

1
Como você traz a implantação de volta depois?
21418 Jamey

1
@ Jamesy, você o cria novamente com o kubectl createcomando
Illya Gerasymchuk

1
não precisa ser uma implantação. poderia ser um trabalho. então certifique-se também verificarkubectl get jobs
Bucky

Para eliminar vários tipos de objetos, não apenas implantações, tente:kubectl delete replicasets,subscriptions,deployments,jobs,services,pods --all -n <namespace>
Noam Manos

19

Em vez de tentar descobrir se é uma implantação, conjunto de dados, conjunto de estado ... ou o que (no meu caso, era um controlador de replicação que continuava a abranger novos pods :) Para determinar o que era que continuava a abranger a imagem obteve todos os recursos com este comando:

kubectl get all

Obviamente, você também pode obter todos os recursos de todos os namespaces:

kubectl get all --all-namespaces

ou defina o espaço para nome que você deseja inspecionar:

kubectl get all -n NAMESPACE_NAME

Depois que vi que o controlador de replicação era responsável pelo meu problema, eu o excluí:

kubectl delete replicationcontroller/CONTROLLER_NAME


14

se o seu pod tiver um nome como name-xxx-yyy, ele pode ser controlado por um replicasets.apps chamado name-xxx, você deve excluir esse replicaset primeiro antes de excluir o pod

kubectl delete replicasets.apps name-xxx


1
Obrigado! Para o meu caso, foi um trabalho específico que o recriou. Então:kubectl delete --all jobs -n <namespace>
yclian 13/10

Encontre o conjunto de réplicas com kubectl get replicasets.apps -n <namespace>(ou --all-namespaces)
Noam Manos

9

Procure também conjuntos com estado

kubectl get sts --all-namespaces

excluir todos os conjuntos com estado em um espaço para nome

kubectl --namespace <yournamespace> delete sts --all

para excluí-los um por um

kubectl --namespace ag1 delete sts mssql1 
kubectl --namespace ag1 delete sts mssql2
kubectl --namespace ag1 delete sts mssql3

o gitlab-gitaly estava lá para mim. Obrigado! Isso resolveu.
Kevin C

6

Em alguns casos, os pods ainda não desaparecem, mesmo ao excluir a implantação. Nesse caso, para forçar a exclusão deles, você pode executar o comando abaixo.

kubectl delete pods podname --grace-period=0 --force


Isso não resolverá o problema quando o pod criado por implantação, trabalhos ou qualquer outro tipo de controlador se o tipo de estratégia estiver definido como Recreate.
SK Venkat

5

Isso fornecerá informações sobre todos os pods, implantações, serviços e tarefas no espaço para nome.

kubectl get pods,services, deployments, jobs

pods podem ser criados por implantações ou tarefas

kubectl delete job [job_name]
kubectl delete deployment [deployment_name]

Se você excluir a implantação ou o trabalho, a reinicialização dos pods poderá ser interrompida.


5

Muitas respostas aqui dizem para excluir um objeto k8s específico, mas você pode excluir vários objetos ao mesmo tempo, em vez de um por um:

kubectl delete deployments,jobs,services,pods --all -n <namespace>

No meu caso, estou executando o cluster OpenShift com o OLM - Operator Lifecycle Manager . O OLM é quem controla a implantação; portanto, quando eu excluí a implantação, não foi suficiente para impedir a reinicialização dos pods.

Somente quando excluí o OLM e sua assinatura , a implantação, os serviços e os pods desapareceram.

Primeiro, liste todos os objetos k8s no seu espaço para nome:

$ kubectl get all -n openshift-submariner

NAME                                       READY   STATUS    RESTARTS   AGE
pod/submariner-operator-847f545595-jwv27   1/1     Running   0          8d  
NAME                                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/submariner-operator-metrics   ClusterIP   101.34.190.249   <none>        8383/TCP   8d
NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/submariner-operator   1/1     1            1           8d
NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/submariner-operator-847f545595   1         1         1       8d

O OLM não está listado com get all, por isso procuro especificamente:

$ kubectl get olm -n openshift-submariner

NAME                                                      AGE
operatorgroup.operators.coreos.com/openshift-submariner   8d
NAME                                                             DISPLAY      VERSION
clusterserviceversion.operators.coreos.com/submariner-operator   Submariner   0.0.1 

Agora exclua todos os objetos, incluindo OLMs, assinaturas, implantações, conjuntos de réplicas, etc:

$ kubectl delete olm,svc,rs,rc,subs,deploy,jobs,pods --all -n openshift-submariner

operatorgroup.operators.coreos.com "openshift-submariner" deleted
clusterserviceversion.operators.coreos.com "submariner-operator" deleted
deployment.extensions "submariner-operator" deleted
subscription.operators.coreos.com "submariner" deleted
service "submariner-operator-metrics" deleted
replicaset.extensions "submariner-operator-847f545595" deleted
pod "submariner-operator-847f545595-jwv27" deleted

Listar objetos novamente - todos foram embora:

$ kubectl get all -n openshift-submariner
No resources found.

$ kubectl get olm -n openshift-submariner
No resources found.

4

Quando o pod está sendo recriado automaticamente mesmo após a exclusão manual, esses pods foram criados usando o Deployment. Quando você cria uma implantação, ela cria automaticamente ReplicaSet e Pods. Dependendo de quantas réplicas do seu pod você mencionou no script de implantação, ele criará esse número de pods inicialmente. Quando você tenta excluir qualquer pod manualmente, ele os cria automaticamente.

Sim, às vezes você precisa excluir os pods com força. Mas, neste caso, o comando force não funciona.


Eu começo um aviso quando eu tento isso que o pod pode viver como um processo zumbi, portanto, não era o que eu queria ..
Chanoch

4

Em vez de remover o NS, você pode tentar remover replicaSet

kubectl get rs --all-namespaces

Em seguida, exclua o replicaSet

kubectl delete rs your_app_name

2

Depois de fazer um tutorial interativo , acabei com vários pods, serviços e implantações:

me@pooh ~ > kubectl get pods,services
NAME                                       READY   STATUS    RESTARTS   AGE
pod/kubernetes-bootcamp-5c69669756-lzft5   1/1     Running   0          43s
pod/kubernetes-bootcamp-5c69669756-n947m   1/1     Running   0          43s
pod/kubernetes-bootcamp-5c69669756-s2jhl   1/1     Running   0          43s
pod/kubernetes-bootcamp-5c69669756-v8vd4   1/1     Running   0          43s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   37s
me@pooh ~ > kubectl get deployments --all-namespaces
NAMESPACE     NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
default       kubernetes-bootcamp   4         4         4            4           1h
docker        compose               1         1         1            1           1d
docker        compose-api           1         1         1            1           1d
kube-system   kube-dns              1         1         1            1           1d

Para limpar tudo, delete --allfuncionou bem:

me@pooh ~ > kubectl delete pods,services,deployments --all
pod "kubernetes-bootcamp-5c69669756-lzft5" deleted
pod "kubernetes-bootcamp-5c69669756-n947m" deleted
pod "kubernetes-bootcamp-5c69669756-s2jhl" deleted
pod "kubernetes-bootcamp-5c69669756-v8vd4" deleted
service "kubernetes" deleted
deployment.extensions "kubernetes-bootcamp" deleted

Isso me deixou com (o que eu acho que é) um cluster vazio do Kubernetes:

me@pooh ~ > kubectl get pods,services,deployments
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   8m

1

Se você tem um trabalho que continua em execução, é necessário pesquisar o trabalho e excluí-lo:

kubectl get job --all-namespaces | grep <name>

e

kubectl delete job <job-name>


1

Você pode kubectl get replicasetsverificar a implantação antiga com base na idade ou no tempo

Exclua a implantação antiga com base no tempo, se desejar excluir o mesmo pod de aplicativo atual em execução

kubectl delete replicasets <Name of replicaset>

1

Também enfrentei o problema, usei o comando abaixo para excluir a implantação.

kubectl delete deployments DEPLOYMENT_NAME

mas os pods ainda estavam recriando, então eu cruzei o Replica Set usando o comando abaixo

kubectl get rs

edite o replicaset para 1 a 0

kubectl edit rs REPICASET_NAME

1

A causa principal da pergunta foi o atributo de implantação / tarefa / replicasets, strategy->typeque define o que deve acontecer quando o pod for destruído (implícita ou explicitamente). No meu caso, foi Recreate.

De acordo com a resposta do @ nomad , excluir a implantação / tarefa / replicasets é a correção simples para evitar experiências com combinações mortais antes de atrapalhar o cluster como um usuário iniciante.

Tente os seguintes comandos para entender as ações por trás da cena antes de pular para a depuração:

kubectl get all -A -o name
kubectl get events -A | grep <pod-name>

1

No meu caso, implantei através de um arquivo YAML como kubectl apply -f deployment.yamle a solução parece ser excluir viakubectl delete -f deployment.yaml


0

Tive um problema semelhante: após excluir a implantação ( kubectl delete deploy <name>), os pods continuavam "Em execução" e eram recriados automaticamente após a exclusão ( kubectl delete po <name>).

Verificou-se que o conjunto de réplicas associado não foi excluído automaticamente por algum motivo e, após a exclusão de ( kubectl delete rs <name>), foi possível excluir os pods.


0

Com implantações que possuem conjuntos com estado (ou serviços, trabalhos etc.), você pode usar este comando:

Este comando finaliza qualquer coisa executada no especificado <NAMESPACE>

kubectl -n <NAMESPACE> delete replicasets,deployments,jobs,service,pods,statefulsets --all

E forte

kubectl -n <NAMESPACE> delete replicasets,deployments,jobs,service,pods,statefulsets --all --cascade=true --grace-period=0 --force
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.