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>