Коли видалено Kubernetes, струк відтворюється


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. Якщо так, видаліть це, а потім видаліть стручки.
— ГР

3
яку версію кубернетів ви виконуєте? Залежно від вашої версії кубернетів це? Це могло поводитися інакше. наприклад, до 1,2 він завжди створював розгортання. kubectl get deployment
— lwolf

19
Якщо хтось закінчується тут: - Видалення розгортань вирішило проблему для мене. kubectl delete deployment <deployment_name>. Щоб отримати ім’я розгортання, виконайтеkubectl get deployments
— Vasanth Sriram

Відповіді:


291

Вам потрібно видалити розгортання, яке в свою чергу має видалити стручки та набори реплік https://github.com/kubernetes/kubernetes/isissue/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
@Jamey ти знову створиш його за допомогою kubectl createкоманди.
— Ілля Герасимчук

1
не потрібно бути розгортанням. може бути роботою. тому переконайтеся , що також перевіритиkubectl get jobs
— Баки

Щоб видалити кілька типів об’єктів, а не лише розгортання, спробуйте:kubectl delete replicasets,subscriptions,deployments,jobs,services,pods --all -n <namespace>
— Noam Manos

19

Замість того, щоб намагатися розібратися, чи це розгортання, deamonset, statefulset ... чи що (у моєму випадку це контролер реплікації, який продовжував охоплювати нові стручки :) Для того, щоб визначити, що це, що продовжувало розповсюджувати зображення I отримав усі ресурси за допомогою цієї команди:

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)
— Ноам Манос

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 - менеджером життєвого циклу оператора . 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 і Pods. Залежно від того, скільки реплік вашого стручка ви згадали в сценарії розгортання, він створить спочатку таку кількість стручків. Якщо ви спробуєте видалити будь-який стручок вручну, він автоматично створить їх.

Так, іноді потрібно видалити стручки з силою. Але в цьому випадку командування силами не працює.


Коли я пробую це, я отримую попередження про те, що струк може жити як процес зомбі, тому не було того, чого я хотів ..
— Chanoch

4

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

kubectl get rs --all-namespaces

Потім видаліть replicaSet

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

Першопричиною для заданого питання був атрибут spec розгортання / робота / реплікації, strategy->typeякий визначає, що має відбутися, коли струк буде знищений (або неявно, або явно). У моєму випадку це було Recreate.

Відповідно з @ кочівника відповіді , видалення розгортання / роботи / 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

У мене виникла подібна проблема: після видалення розгортання ( 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.