Pod terjebak dalam status Pengakhiran


244

Saya mencoba untuk menghapus ReplicationControllerdengan 12 pod dan saya dapat melihat bahwa beberapa pod terjebak dalam Terminatingstatus.

Cluster Kubernetes saya terdiri dari satu node bidang kontrol dan tiga node pekerja yang diinstal pada mesin virtual Ubuntu.

Apa yang bisa menjadi alasan untuk masalah ini?

NAME        READY     STATUS        RESTARTS   AGE
pod-186o2   1/1       Terminating   0          2h
pod-4b6qc   1/1       Terminating   0          2h
pod-8xl86   1/1       Terminating   0          1h
pod-d6htc   1/1       Terminating   0          1h
pod-vlzov   1/1       Terminating   0          1h

Apakah scheduler dan controller-manager berfungsi?
Antoine Cotten

Jawaban:


471

Anda dapat menggunakan perintah berikut untuk menghapus POD dengan paksa.

kubectl delete pod <PODNAME> --grace-period=0 --force --namespace <NAMESPACE>

3
ini adalah solusi untuk saya di 1.2.4. Pods telah berhenti sepanjang malam
mundur

6
Dalam kasus saya, saya harus menambahkan satu opsi lagi: --forceuntuk mendapatkan pods teminated.
BMW

17
Saya melakukan ini di cluster saya dan pod tampaknya dihapus tetapi ketika saya memeriksa node itu kontainer masih berjalan. Saya akhirnya me-restart Docker pada node itu sendiri. github.com/kubernetes/kubernetes/issues/25456 Berhati-hatilah Anda tidak menyembunyikan masalah sistemik dengan perintah ini.
mqsoh

4
@ mqsoh: Gaya hapus baru saja menghapusnya dari toko api-server (etcd), sumber daya yang sebenarnya dihapus mungkin berakhir berjalan tanpa batas.
bit

8
"peringatan: Penghapusan segera tidak menunggu konfirmasi bahwa sumber daya yang berjalan telah dihentikan. Sumber daya dapat terus berjalan di cluster tanpa batas waktu" Sumber daya apa?
Akshay

57

Hapus paksa pod:

kubectl delete pod --grace-period=0 --force --namespace <NAMESPACE> <PODNAME>

The --forcebendera adalah wajib.


41
Tetapi pertanyaan sebenarnya bagi saya adalah "mengapa kita harus menggunakan ini sejak awal?" Apa saja yang menyebabkan polong dalam kondisi macet ini dalam kondisi pengoperasian yang normal?
neverfox

2
Baiklah, saya dapat memberikan satu contoh, kami memiliki wadah java yang memiliki penonaktifan yang baik, tetapi mengumpulkan sampah sampai mati, sehingga tidak bereaksi terhadap sinyal.
Aurelia

1
Baik untuk menyediakan namespace, jika tidak di lingkungan multi-namespace pod Anda tidak akan ditemukan, secara default itu mencari di kube-systemnamespace.
Daniel Andrei Mincă

Untuk memaksa menghapus semua pod secara langsung sekaligusktl get pods -o custom-columns=:metadata.name | xargs kubectl delete pod --force --grace-period=0
deepdive

21

Hapus blok finalizers dari resource (pod, deployment, ds dll ...) yaml:

"finalizers": [
  "foregroundDeletion"
]

1
Volume persisten terhapus setelah ini. Apa yang sebenarnya dilakukannya?
raiyan

Pod saya yang macet dalam status terminasi dihapus secara instan.
Kuberchaun

Ini adalah satu-satunya hal yang memperbaiki pod yang macet bagi saya ketika delete -grace-period=0 --forcetidak. Saya juga menghargai beberapa perincian tentang apa tepatnya yang dilakukannya.
valorl

Halaman ini menjelaskan foregroundDeletion. Nilai meta data-nya yang menunjukkan objek dalam proses penghapusan. kubernetes.io/docs/concepts/workloads/controllers/…
Sean Keane

14

Jawaban praktis - Anda selalu dapat menghapus pod pemberhentian dengan menjalankan:

kubectl delete pod NAME --grace-period=0

Jawaban historis - Ada masalah dalam versi 1.1 di mana kadang-kadang polong terdampar di negara Pengakhiran jika node mereka dihapus dari cluster.


1
Saya kira itulah masalahnya. Saya mematikan satu minion vm tanpa menghapus dari node. Apakah ini perilaku yang dapat diterima? Atau apakah ada perbaikan untuk menghapus pod-pod itu dari kubernetes?
Dimuthu

Ya, solusinya hingga versi 1.2 muncul adalah untuk menghapus pod.
Alex Robinson

36
Anda selalu dapat menghapus paksa pod yang berhenti dengankubectl delete pod NAME --grace-period=0
Clayton

3
Dokter mengatakan ketika menjalankan kubectl delete ...suatu SIG_TERMpermintaan akan dikirim ke wadah. Tetapi bagaimana jika setelah masa tenggang, wadah masih berjalan? Saya memiliki banyak pod yang macet Terminating, beberapa ditulis dalam perjalanan, beberapa di nodejs. The replicationController telah dihapus, dan wadah masih berjalan
Quyen Nguyen Tuan

4
kubectl delete pod PODNAME --grace-period=0bekerja untuk saya seperti yang disarankan oleh Clayton.
Yogesh Jilhawar

13

Saya menemukan perintah ini lebih mudah:

for p in $(kubectl get pods | grep Terminating | awk '{print $1}'); do kubectl delete pod $p --grace-period=0 --force;done

Ini akan menghapus semua pod di Terminating status di namespace default.


1
Jika Anda ingin menjalankannya di ruang nama lain seperti kube-systemgunakan:for p in $(kubectl get pods -n kube-system| grep Terminating | awk '{print $1}'); do kubectl delete pod $p --grace-period=0 --force -n kube-system;done
acrogenesis

8

Dalam kasus saya --forceopsi tidak bekerja. Saya masih bisa melihat podnya! Itu macet dalam mode Terminating / Unknown. Jadi setelah berlari

kubectl delete pods <pod> -n redis --grace-period=0 --force

Saya berlari

kubectl patch pod <pod> -p '{"metadata":{"finalizers":null}}'

2
Sebelum melakukan ini, ada baiknya membaca kubernetes.io/docs/concepts/workloads/controllers/… untuk memahami apa itu finalizer. Juga, melihat finalizer spesifik yang macet mungkin memberikan petunjuk mengapa macet dan apakah aman untuk memotong ...
Beni Cherniavsky-Paskin

5

Jika --grace-period=0tidak berfungsi maka Anda dapat melakukan:

kubectl delete pods <pod> --grace-period=0 --force

Ada beberapa situasi di mana ini tampaknya berhasil tetapi sebenarnya tidak menghapus. Mungkin ada hubungannya dengan masalah di mana kubelet kehilangan status pod dan tidak bisa mendapatkan status sehingga meninggalkannya .. (mis. Github.com/kubernetes/kubernetes/issues/51835 ). Saya belum menemukan cara untuk membersihkannya.
cgseller

3

Saya menemukan ini baru-baru ini ketika menghapus namespace rook ceph - macet dalam keadaan Pengakhiran.

Satu-satunya hal yang membantu adalah menghapus kubernetes finalizer dengan langsung memanggil api k8s dengan curl seperti yang disarankan di sini .

  • kubectl get namespace rook-ceph -o json > tmp.json
  • hapus finalizer kubernetes di tmp.json(biarkan array kosong "finalizers": [])
  • jalankan kubectl proxydi terminal lain untuk tujuan auth dan jalankan mengikuti permintaan curl ke port kembali
  • curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json 127.0.0.1:8001/k8s/clusters/c-mzplp/api/v1/namespaces/rook-ceph/finalize
  • namespace hilang

Detail rook ceph teardown di sini .


3

Pertanyaan aslinya adalah " Apa yang bisa menjadi alasan untuk masalah ini? " Dan jawabannya dibahas di https://github.com/kubernetes/kubernetes/issues/51835 & https://github.com/kubernetes/kubernetes/issues / 65569 & lihat https://www.bountysource.com/issues/33241128-unable-to-remove-a-stopped-container-device-or-resource-busy

Ini disebabkan oleh docker mount bocor ke beberapa namespace lainnya.

Anda dapat masuk ke host pod untuk menyelidiki.

minikube ssh
docker container ps | grep <id>
docker container stop <id> 

Saya tidak percaya ini adalah jawaban yang paling tidak dipilih dan tidak memiliki komentar tunggal. Sementara semua jawaban lain membahas cara-cara untuk mengatasi atau memperbaiki masalah, OP jelas menanyakan alasan mengapa kondisi tersebut terjadi.
MisterStrickland

0

Saya menemukan ini baru-baru ini untuk membebaskan sumber daya di kluster saya. di sini adalah perintah untuk menghapus semuanya.

kubectl get pods --all-namespaces | grep Terminating | while read line; do 
pod_name=$(echo $line | awk '{print $2}' ) name_space=$(echo $line | awk 
'{print $1}' ); kubectl delete pods $pod_name -n $name_space --grace-period=0 --force; 
done

semoga ini membantu seseorang yang membaca ini

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.