Коли видалено 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.