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

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

$ 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

Ответ 1

Вам необходимо удалить развертывание, которое, в свою очередь, должно удалить пакеты и наборы реплик 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

Ответ 2

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

kubectl delete replicasets.apps name-xxx

Ответ 3

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

kubectl get all

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

kubectl get all --all-namespaces

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

kubectl get all -n NAMESPACE_NAME

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

kubectl delete replicationcontroller/CONTROLLER_NAME

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

kubectl get pods,services, deployments, jobs

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

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

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

Ответ 8

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

kubectl get rs --all-namespaces

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

kubectl delete rs your_app_name

Ответ 9

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

[email protected] ~ > 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
[email protected] ~ > 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 работал нормально:

[email protected] ~ > 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:

[email protected] ~ > 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

Ответ 10

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

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

а также

kubectl delete job <job-name>

Ответ 11

Вы можете выполнить kubectl get replicasets для проверки старого развертывания в зависимости от возраста или времени.

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

kubectl delete replicasets <Name of replicaset>

Ответ 12

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

kubectl delete deployments DEPLOYMENT_NAME

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

kubectl get rs

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

kubectl edit rs REPICASET_NAME

Ответ 13

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

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

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

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