Kubernetes'te çıkarılan kapsüllere ne olacak?


86

Bazı bölmelerimin kubernetes tarafından boşaltıldığını gördüm. Onlara ne olacak? sadece öyle mi takılıyorsun yoksa onları manuel olarak silmem mi gerekiyor?


3
Aynı davranışa şahit olmak, Evicted13 gündür eyalette olan bir bölmem var . Görünüşe göre çıkarılan kapsüller kaldırılmıyor (veya belki de sadece bir hatadır).
Elouan Keryell-Even

podgc denetleyicisi, yapılandırılabilir bir eşiğe ulaşıldığında bu Başarısız / Başarılı bölmeleri geri alır.
zhb

2
Bölmelerim boşaltılır ve toplamda 40 tane var. Yani bu bölmeler için de aylık ücret ödeyecek miyim?
Anant

Bir grup konteyner tahliye edildi, ancak beklendiği gibi hala çalışan 2 konteynerim var. Başarısız olanlar, düşük kaynak ( DiskPressure) ile bulunabilen nedeniyledirkubectl describe pods my-pod-name --namespace prod
duaApr

Yanıtlar:


83

Kullandığım hızlı bir çözüm, bir olaydan sonra tüm çıkarılan bölmeleri manuel olarak silmektir. Bu komutu kullanabilirsiniz:

kubectl get pods --all-namespaces -o json | jq '.items[] | select(.status.reason!=null) | select(.status.reason | contains("Evicted")) | "kubectl delete pods \(.metadata.name) -n \(.metadata.namespace)"' | xargs -n 1 bash -c


Bir yazım hatası yapmış olmalısınız, -abağımsız değişken geçersiz.
Ilya Suzdalnitski

6
Bu (ve benzer cevaplar) OP sorusuna cevap vermez "[Eğer bir şey yapmazsanız] onlara ne olacak?"
Oliver

62

Ad alanında Başarısız durumundaki bölmeleri silmek için default

kubectl -n default delete pods --field-selector=status.phase=Failed

1
Garip bir şekilde, bu ne zaman olduğunu göstermiyor status.phase=Evicted. Bunu yaparak başardım kubectl -n default delete pods --field-selector=status.phase!=Running. Ancak dikkatli olun, bu her şeyi silecektir
n3o

3
kubectl -n default get pods --field-selector=status.phase=Failedİlk başta koşmak faydalı olabilir sanırım .
kullanıcı adı

Benim için Evictedkapsüllerden kurtuluyor .
robertodecurnex

EKS v1.16'daki Evicted podlarım için bir cazibe gibi çalıştı. Teşekkürler.
John Humphreys -

19

Çıkarılan bölmeler manuel olarak silinmelidir. Durumdaki tüm bölmeleri silmek için aşağıdaki komutu kullanabilirsiniz Error.

kubectl get pods --all-namespaces --field-selector 'status.phase==Failed' -o json | kubectl delete -f -

15

Yumuşak veya zor bir tahliye eşiğinin karşılanıp karşılanmadığına bağlı olarak, Kapsüldeki Kapsayıcılar, yetkisiz kullanım süresi olsun veya olmasın sonlandırılacak PodPhase, olarak işaretlenecek Failedve Kapsül silinecektir. Uygulamanız örneğin bir Dağıtımın parçası olarak çalışıyorsa, Kubernetes tarafından oluşturulan ve planlanan başka bir Kapsül olacaktır - muhtemelen tahliye eşiklerini aşmayan başka bir Düğümde.

Tahliye mutlaka eşikleri kaynaklandığı yok ama üzerinden de çağrılabilir unutmayın kubectl drainiçin bir düğüm boşaltmak yoluyla elle veya Kubernetes API .


3
evet, benim bölmem bir dağıtımdan ve başka bir düğümde çalışan başka bir kapsül görüyorum, ancak daha önce çıkarılmış olan bölmeler de orada
reachlin

Onların da "orada" olduklarını nasıl anlarsınız? Hangi komut tam olarak bunu size gösteriyor?
Simon Tesar

sadecekubectl get pods -n mynamespace
reachlin

Hangi eyalette? Ne kubectl describe pod <pod>diyor?
Simon Tesar

1
OP değil ama bu sorunu yaşıyorum. kubectl describe "Durum: Başarısız Nedeni: Çıkarılmış Mesaj: Bölme Düğüm kaynağı düşüktü: [Bellek Basıncı]."
Bryan

7

Kube-controller-managervarsayılan olarak çalışan bir K8 kurulumuyla mevcuttur. Varsayılan değerin, GC devreye girmeden önce maksimum 12500 sonlandırılmış kapsül olduğu görülmektedir.

Doğrudan K8s belgelerinden: https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/#kube-controller-manager

--terminated-pod-gc-eşik int32 Varsayılan: 12500
Sonlandırılan bölme çöp toplayıcısı sonlandırılan bölmeleri silmeye başlamadan önce var olabilecek sonlandırılmış bölmelerin sayısı. <= 0 ise, sonlandırılan bölme çöp toplayıcısı devre dışı bırakılır.


Ana düğümlerimde kube-denetleyici-yönetici bölmeleri var. Ama bu bayrağı nasıl değiştirmeliyim? Kullanmak istersem , yapılandırma dosyasını kaydettikten sonra hata kubectl edit pod kube-controller-manager-<master_name> -n kube-systemveriyor pod is invalid.
Ali Tou

5

CompletedEtrafında tutmak istediğiniz bir duruma sahip bölmeleriniz olması durumunda :

kubectl get pods --all-namespaces --field-selector 'status.phase==Failed' -o json | kubectl delete -f -

4

Birisinin tüm ad alanları için çıkarılmış tüm kapsülleri otomatik olarak silmek istemesi durumunda:

  • Güç kalkanı
    Foreach( $x in (kubectl get po --all-namespaces --field-selector=status.phase=Failed --no-headers -o custom-columns=:metadata.name)) {kubectl delete po $x --all-namespaces }
  • Bash
kubectl get po --all-namespaces --field-selector=status.phase=Failed --no-headers -o custom-columns=:metadata.name | xargs kubectl delete po --all-namespaces

3

Kalvin'in tüm 'Çıkarılan' bölmeleri silme komutunun OpenShift eşdeğeri:

eval "$(oc get pods --all-namespaces -o json | jq -r '.items[] | select(.status.phase == "Failed" and .status.reason == "Evicted") | "oc delete pod --namespace " + .metadata.namespace + " " + .metadata.name')"

3

Çıkarılan bölmeleri silmek için bir bash komutu daha

kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod

2

Tüm Evictedbölmeleri zorla silmek için bu tek satırlık komutu deneyebilirsiniz:

$ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/e'

İpuçları: Silme işini yapmak için sadece gerçek komutu yazdırmak yerine komutun pdeğiştiricisini kullanın :ssede

$ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/p'

1

Eşiğin nasıl sabit kodlanacağına dair 'resmi' kılavuz (eğer çok fazla çıkarılmış bölme görmek istemiyorsanız): kube-controll-manager

Ancak bilinen bir sorun, kube-controll-manager'ın nasıl kurulacağıdır ...


Sorun yaratıyorsa, lütfen söz konusu kurulumun nasıl gerçekleştirilebileceğini belirtin.
MandyShaw

Cevabı da bilmiyorum, bu yüzden bahsetmiştim. Ve OP kullandığı sistemden bahsetmedi ve aynı sorunu yaşayıp yaşamayacağını bilmiyorum. BTW, olumsuz oy SÜPER GÜZEL.
tikael

Soruyu tam olarak cevaplamadığı için fikrinizi bir yorum olarak eklemenin daha iyi olacağını düşünürdüm (bu yüzden onu reddettim - üzgünüm ama şu anda ben de dahil hepimizin başına geliyor).
MandyShaw

Yukarıdaki diğer tüm cevapları kontrol edin, OP ne olduğunu sordu ve bunlardan kaç tanesi buna cevap verdi ve bunlardan kaç tanesi tahliye bölmesini silmek için bir yol sunuyor?
tikael

1

Hala başka bir yol awk.

Beni çıldırtabilecek herhangi bir insan hatasını önlemek için (istenen bölmeleri silmek), get podskomutun sonucunu kontrol ederim :

kubectl -n my-ns get pods --no-headers --field-selector=status.phase=Failed     

Bu iyi görünüyorsa, işte başlıyoruz:

kubectl -n my-ns get pods --no-headers --field-selector=status.phase=Failed | \
awk '{system("kubectl -n my-ns delete pods " $1)}'

1

Aşağıdaki komut, tüm ad alanlarından tüm başarısız kapsülleri siler.

kubectl get pods -A | grep Evicted | awk '{print $2 " -n " $1}' | xargs -n 3 kubectl delete pod

0

Aşağıdaki komut, tüm çıkarılan kapsülleri varsayılan ad alanından alacak ve silecektir

kubectl get pods | grep Evicted | awk '{print$1}' | xargs -I {} kubectl delete pods/{}


1
Topluluğa uzun vadede yardımcı olacak açıklanmış bağlamla bir yanıt gibi yardımcı olmayacağından, yalnızca kod yanıtları teşvik edilmez.
Arun Vinoth
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.