Pod Kubernetes dibuat ulang saat dihapus


166

Saya telah memulai pod dengan perintah

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

Ada yang tidak beres, dan sekarang saya tidak bisa menghapusnya Pod.

Saya mencoba menggunakan metode yang dijelaskan di bawah ini tetapi Podterus dibuat ulang.

$ 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

3
Apakah Anda entah bagaimana berhasil membuat pengontrol replikasi dengan memberikan argumen yang salah. Untuk apa kamu mendapatkan kubectl get all -o name?
Graham Dumpleton

1
Dapatkah Anda memeriksa kubectl get eventsuntuk melihat apa yang membuat objek-objek ini?
Anirudh Ramanathan

3
mencoba kubctl get rcuntuk melihat apakah ReplicationController telah dibuat. Jika ya, hapus itu, lalu hapus podnya.
MrE

3
versi kubernetes apa yang kamu jalankan? Bergantung pada versi kubernetes Anda? Itu bisa berperilaku berbeda. misalnya sebelum 1.2 itu selalu membuat penerapan. kubectl get deployment
lwolf

20
Jika seseorang berakhir di sini: - Menghapus penerapan memecahkan masalah saya. kubectl delete deployment <deployment_name>. Untuk mendapatkan nama penyebaran, lakukankubectl get deployments
Vasanth Sriram

Jawaban:


314

Anda perlu menghapus penerapan, yang pada gilirannya akan menghapus pod dan kumpulan replika https://github.com/kubernetes/kubernetes/issues/24137

Untuk mencantumkan semua penerapan:

kubectl get deployments --all-namespaces

Kemudian untuk menghapus penerapan:

kubectl delete -n NAMESPACE deployment DEPLOYMENT

Di mana NAMESPACE adalah namespace itu, dan DEPLOYMENT adalah nametempat penerapannya.

Dalam beberapa kasus, ini juga bisa berjalan karena pekerjaan atau daemonset. Periksa yang berikut dan jalankan perintah hapus yang sesuai.

kubectl get jobs

kubectl get daemonsets.app --all-namespaces

kubectl get daemonsets.extensions --all-namespaces

1
Bagaimana Anda mengembalikan penerapan setelahnya?
Jamey

1
@Jamey Anda membuatnya lagi dengan kubectl createperintah.
Illya Gerasymchuk

1
tidak perlu menjadi penerapan. bisa menjadi pekerjaan. jadi pastikan juga untuk memeriksakubectl get jobs
bucky

Untuk menghapus beberapa jenis objek, bukan hanya penerapan, coba:kubectl delete replicasets,subscriptions,deployments,jobs,services,pods --all -n <namespace>
Noam Manos

23

Alih-alih mencoba mencari tahu apakah itu penyebaran, deamonset, statefulset ... atau apa (dalam kasus saya itu adalah pengontrol replikasi yang terus mencakup pod baru :) Untuk menentukan apa yang terus mencakup gambar saya dapatkan semua sumber daya dengan perintah ini:

kubectl get all

Tentu saja Anda juga bisa mendapatkan semua sumber daya dari semua ruang nama:

kubectl get all --all-namespaces

atau tentukan namespace yang ingin Anda periksa:

kubectl get all -n NAMESPACE_NAME

Setelah saya melihat bahwa pengontrol replikasi bertanggung jawab atas masalah saya, saya menghapusnya:

kubectl delete replicationcontroller/CONTROLLER_NAME


15

jika pod Anda memiliki nama seperti name-xxx-yyy, itu bisa dikontrol oleh replicasets.apps bernama name-xxx, Anda harus menghapus replicaset itu terlebih dahulu sebelum menghapus pod

kubectl delete replicasets.apps name-xxx


1
Terima kasih! Untuk kasus saya, itu adalah pekerjaan khusus yang menciptakannya kembali. Jadi:kubectl delete --all jobs -n <namespace>
yclian

Temukan set replika dengan kubectl get replicasets.apps -n <namespace>(atau --semua-namespaces)
Noam Manos

9

Carilah set stateful juga

kubectl get sts --all-namespaces

untuk menghapus semua set stateful dalam namespace

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

untuk menghapusnya satu per satu

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

gitlab-gitaly ada untuk saya. Terima kasih! Ini menyelesaikannya.
Kevin C

6

Dalam beberapa kasus, pod masih tidak akan hilang bahkan saat penerapan dihapus. Dalam hal ini untuk menghapus paksa Anda dapat menjalankan perintah di bawah ini.

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


Ini tidak akan menyelesaikan masalah saat pod dibuat oleh penerapan, pekerjaan, atau jenis pengontrol lainnya jika jenis strategi disetel ke Recreate.
SK Venkat

6

Banyak jawaban di sini memberitahu untuk menghapus objek k8s tertentu, tetapi Anda dapat menghapus beberapa objek sekaligus, bukan satu per satu:

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

Dalam kasus saya, saya menjalankan cluster OpenShift dengan OLM - Operator Lifecycle Manager . OLM adalah orang yang mengontrol penerapan, jadi ketika saya menghapus penerapan, itu tidak cukup untuk menghentikan pod agar tidak dimulai ulang.

Hanya ketika saya menghapus OLM dan langganannya , penerapan, layanan, dan pod hilang.

Pertama daftarkan semua objek k8s di namespace Anda:

$ 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 tidak terdaftar dengan get all, jadi saya mencarinya secara khusus:

$ 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 

Sekarang hapus semua objek, termasuk OLM, langganan, penerapan, set replika, dll:

$ 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

Buat daftar objek lagi - semua hilang:

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

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

5

Ini akan memberikan informasi tentang semua pod, penerapan, layanan, dan pekerjaan di namespace.

kubectl get pods,services, deployments, jobs

pod dapat dibuat dengan penerapan atau pekerjaan

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

Jika Anda menghapus penerapan atau pekerjaan, maka restart pod dapat dihentikan.


4

Ketika pod dibuat ulang secara otomatis bahkan setelah pod tersebut dihapus secara manual, maka pod tersebut telah dibuat menggunakan Deployment. Saat Anda membuat penerapan, ReplicaSet dan Pods dibuat secara otomatis. Bergantung pada berapa banyak replika pod Anda yang Anda sebutkan di skrip penerapan, itu akan membuat jumlah pod tersebut pada awalnya. Saat Anda mencoba untuk menghapus pod mana pun secara manual, pod tersebut akan dibuat kembali secara otomatis.

Ya, terkadang Anda perlu menghapus pod dengan paksa. Tetapi dalam kasus ini perintah paksa tidak berfungsi.


Saya mendapat peringatan ketika saya mencoba ini bahwa pod dapat hidup sebagai proses zombie jadi bukan yang saya inginkan ..
Chanoch

4

Alih-alih menghapus NS, Anda dapat mencoba menghapus replicaSet

kubectl get rs --all-namespaces

Kemudian hapus replicaSet

kubectl delete rs your_app_name

2

Setelah mengikuti tutorial interaktif, saya mendapatkan banyak pod, layanan, penerapan:

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

Untuk membersihkan semuanya, delete --allbekerja dengan baik:

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

Itu meninggalkan saya dengan (menurut saya) cluster Kubernetes kosong:

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

Jika Anda memiliki pekerjaan yang terus berjalan, Anda perlu mencari pekerjaan itu dan menghapusnya:

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

dan

kubectl delete job <job-name>


1

Anda dapat kubectl get replicasetsmemeriksa penerapan lama berdasarkan usia atau waktu

Hapus penerapan lama berdasarkan waktu jika Anda ingin menghapus pod aplikasi yang sedang berjalan

kubectl delete replicasets <Name of replicaset>

1

Saya juga menghadapi masalah ini, saya telah menggunakan perintah di bawah ini untuk menghapus penerapan.

kubectl delete deployments DEPLOYMENT_NAME

tetapi pod masih dibuat ulang, Jadi saya memeriksa Replica Set dengan menggunakan perintah di bawah ini

kubectl get rs

lalu edit replika set ke 1 hingga 0

kubectl edit rs REPICASET_NAME

1

Akar masalah dari pertanyaan yang diajukan adalah atribut spesifikasi penerapan / pekerjaan / replicasets strategy->typeyang menentukan apa yang harus terjadi ketika pod akan dihancurkan (baik secara implisit maupun eksplisit). Dalam kasus saya, itu benar Recreate.

Sesuai jawaban @ nomad , menghapus deployment / job / replicasets adalah perbaikan sederhana untuk menghindari bereksperimen dengan combo yang mematikan sebelum mengacaukan cluster sebagai pengguna pemula.

Coba perintah berikut untuk memahami tindakan di balik layar sebelum beralih ke debugging:

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

1

Dalam kasus saya, saya menyebarkan melalui file YAML seperti kubectl apply -f deployment.yamldan solusinya tampaknya menghapus melaluikubectl delete -f deployment.yaml


0

Saya mengalami masalah yang sama: setelah menghapus deployment ( kubectl delete deploy <name>), pod tetap "Berjalan" dan otomatis dibuat ulang setelah penghapusan ( kubectl delete po <name>).

Ternyata set replika terkait tidak dihapus secara otomatis karena beberapa alasan, dan setelah menghapus itu ( kubectl delete rs <name>), Pod tersebut dapat dihapus.


0

Dengan penerapan yang memiliki kumpulan berstatus (atau layanan, pekerjaan, dll.) Anda dapat menggunakan perintah ini:

Perintah ini menghentikan apa pun yang berjalan di yang ditentukan <NAMESPACE>

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

Dan kuat

kubectl -n <NAMESPACE> delete replicasets,deployments,jobs,service,pods,statefulsets --all --cascade=true --grace-period=0 --force
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.