Kubernetes pod воссоздается при удалении


152

Я начал стручки с командой

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

Что-то пошло не так, и теперь я не могу это удалить Pod.

Я пытался использовать методы, описанные ниже, но Podпродолжает создаваться заново.

$ 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
Удалось ли вам как-то создать контроллер репликации, передав неверные аргументы. Что вы получаете за kubectl get all -o name?
Грэм Дамплтон

1
Можете ли вы проверить, kubectl get eventsчто создает эти объекты?
Анируд Раманатан

3
попробуйте kubctl get rcпосмотреть, был ли создан ReplicationController. Если так, удалите это, затем удалите стручки.
MrE

3
какую версию kubernetes вы используете? В зависимости от вашей версии kubernetes это? Это может вести себя по-другому. например до 1.2 он всегда создавал развертывание. kubectl get deployment
lwolf

19
Если кто-то заканчивает здесь: - Удаление развертываний решило проблему для меня. kubectl delete deployment <deployment_name>, Чтобы получить название развертывания, сделайтеkubectl get deployments
Vasanth Sriram

Ответы:


292

Вам нужно удалить развертывание, которое, в свою очередь, должно удалить пакеты и наборы реплик https://github.com/kubernetes/kubernetes/issues/24137

Чтобы перечислить все развертывания:

kubectl get deployments --all-namespaces

Затем, чтобы удалить развертывание:

kubectl delete -n NAMESPACE deployment DEPLOYMENT

Где NAMESPACE - это пространство имен, в котором оно находится, а DEPLOYMENT - nameэто развертывание.

В некоторых случаях он также может быть запущен из-за задания или демона. Проверьте следующее и выполните соответствующую команду удаления.

kubectl get jobs

kubectl get daemonsets.app --all-namespaces

kubectl get daemonsets.extensions --all-namespaces

1
Как вы вернете развертывание после этого?
Джейми

1
@ Джейми, ты создаешь его снова с помощью kubectl createкоманды.
Илья Герасимчук

1
не должен быть развертыванием. может быть работа. поэтому убедитесь , что также проверитьkubectl get jobs
Баки

Чтобы удалить несколько типов объектов, а не только развертывания, попробуйте:kubectl delete replicasets,subscriptions,deployments,jobs,services,pods --all -n <namespace>
Noam Manos

19

Вместо того, чтобы пытаться выяснить, является ли это развертывание, deamonset, statefulset ... или что (в моем случае это был контроллер репликации, который продолжал охватывать новые модули :) Для того, чтобы определить, что именно продолжало расширять образ, который я получил все ресурсы с помощью этой команды:

kubectl get all

Конечно, вы также можете получить все ресурсы из всех пространств имен:

kubectl get all --all-namespaces

или определите пространство имен, которое вы хотели бы проверить:

kubectl get all -n NAMESPACE_NAME

Как только я увидел, что контроллер репликации отвечает за мою проблему, я удалил его:

kubectl delete replicationcontroller/CONTROLLER_NAME


14

если ваш модуль имеет имя, например name-xxx-yyy, он может управляться с именем replicasets.apps name-xxx, вы должны сначала удалить этот набор перед удалением модуля

kubectl delete replicasets.apps name-xxx


1
Спасибо! Для моего случая это была конкретная работа, которая воссоздала его. Итак:kubectl delete --all jobs -n <namespace>
yclian

Найдите набор реплик с kubectl get replicasets.apps -n <namespace>(или --all-namespaces)
Noam Manos

9

Также обратите внимание на наборы состояний

kubectl get sts --all-namespaces

удалить все наборы с сохранением состояния в пространстве имен

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

удалить их по одному

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

Гитлаб-Гиталий был там для меня. Спасибо! Это решило это.
Кевин C

6

В некоторых случаях модули не исчезают даже при удалении развертывания. В этом случае, чтобы принудительно удалить их, вы можете запустить следующую команду.

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


Это не решит проблему, если модуль создан с помощью развертывания, заданий или контроллеров любого другого типа, если для стратегии выбран тип Recreate.
СК Венкат

5

Это предоставит информацию обо всех модулях, развертываниях, службах и заданиях в пространстве имен.

kubectl get pods,services, deployments, jobs

стручки могут быть созданы развертыванием или заданиями

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

Если вы удалите развертывание или задание, то перезапуск модулей может быть остановлен.


5

Многие ответы здесь говорят об удалении определенного объекта k8s, но вы можете удалить сразу несколько объектов вместо одного за другим:

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

В моем случае я использую кластер OpenShift с OLM - Operator Lifecycle Manager . OLM - это тот, кто контролирует развертывание, поэтому, когда я удалил развертывание, было недостаточно остановить перезапуск модулей.

Только когда я удалил OLM и его подписку , развертывание, службы и модули исчезли.

Сначала перечислите все объекты k8s в вашем пространстве имен:

$ 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

OLM не указан в списке get all, поэтому я ищу его специально:

$ 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 

Теперь удалите все объекты, включая OLM, подписки, развертывания, наборы реплик и т. Д.

$ 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

Перечислите объекты снова - все пропало:

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

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

4

Когда модуль воссоздается автоматически, даже после удаления модуля вручную, эти модули были созданы с помощью развертывания. При создании развертывания автоматически создаются ReplicaSet и Pod. В зависимости от того, сколько реплик вашего модуля вы упомянули в сценарии развертывания, он изначально создаст это количество модулей. Когда вы попытаетесь удалить любой модуль вручную, он автоматически создаст этот модуль снова.

Да, иногда вам нужно удалять стручки с силой. Но в этом случае силовая команда не работает.


Когда я пытаюсь это сделать, я получаю предупреждение о том, что стручок может жить как процесс зомби, так что это было не то, что я хотел ...
Ханох

4

Вместо удаления NS вы можете попробовать удалить replicaSet

kubectl get rs --all-namespaces

Затем удалите реплику

kubectl delete rs your_app_name

2

После прохождения интерактивного урока я получил множество пакетов, сервисов, развертываний:

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

Чтобы все почистить, delete --allработало нормально

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

Это оставило меня с (что я думаю, это) пустой кластер 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

Если у вас есть работа, которая продолжает работать, вам нужно найти работу и удалить ее:

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

и

kubectl delete job <job-name>


1

Ты можешь сделать kubectl get replicasets проверить старое развертывание в зависимости от возраста или времени.

Удалить старое развертывание на основе времени, если вы хотите удалить тот же текущий запущенный модуль приложения

kubectl delete replicasets <Name of replicaset>

1

Я также столкнулся с проблемой, я использовал приведенную ниже команду для удаления развертывания.

kubectl delete deployments DEPLOYMENT_NAME

но все еще стручки воссоздали, поэтому я пересек проверку набора реплик с помощью команды ниже

kubectl get rs

затем отредактируйте репликацию от 1 до 0

kubectl edit rs REPICASET_NAME

1

Основной причиной заданного вопроса был атрибут спецификации deploy / job / replicasets, strategy->typeкоторый определяет, что должно произойти, когда модуль будет уничтожен (неявно или явно). В моем случае это былоRecreate .

Согласно ответу @ nomad , удаление deploy / job / replicasets - это простое исправление, позволяющее избежать экспериментов со смертельными комбинациями перед тем, как испортить кластер как начинающий пользователь.

Попробуйте следующие команды, чтобы понять скрытые действия перед тем, как перейти к отладке:

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

1

В моем случае я развернул через файл типа YAML, kubectl apply -f deployment.yamlи решение, кажется, заключается в том, чтобы удалить черезkubectl delete -f deployment.yaml


0

У меня возникла похожая проблема: после удаления deploy ( kubectl delete deploy <name>), модули продолжали работать и были автоматически созданы после удаления ( kubectl delete po <name>).

Оказалось, что связанный набор реплик по какой-то причине не удалялся автоматически, и после удаления этого ( kubectl delete rs <name>) можно было удалять модули.


0

Для развертываний с наборами состояний (или службами, заданиями и т. Д.) Вы можете использовать эту команду:

Эта команда завершает все, что выполняется в указанном <NAMESPACE>

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

И силовой

kubectl -n <NAMESPACE> delete replicasets,deployments,jobs,service,pods,statefulsets --all --cascade=true --grace-period=0 --force
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.