Ich habe gerade gesehen, dass einige meiner Schoten von Kubernetes vertrieben wurden. Was wird mit ihnen passieren? einfach so rumhängen oder muss ich sie manuell löschen?
DiskPressure
), die mitkubectl describe pods my-pod-name --namespace prod
Ich habe gerade gesehen, dass einige meiner Schoten von Kubernetes vertrieben wurden. Was wird mit ihnen passieren? einfach so rumhängen oder muss ich sie manuell löschen?
DiskPressure
), die mitkubectl describe pods my-pod-name --namespace prod
Antworten:
Eine schnelle Problemumgehung, die ich verwende, besteht darin, alle vertriebenen Pods nach einem Vorfall manuell zu löschen. Sie können diesen Befehl verwenden:
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
-a
Argument ist ungültig.
So löschen Sie Pods im Status "Fehlgeschlagen" im Namespace default
kubectl -n default delete pods --field-selector=status.phase=Failed
status.phase=Evicted
. Ich habe das geschafft kubectl -n default delete pods --field-selector=status.phase!=Running
. Aber seien Sie vorsichtig, dies würde alles löschen
kubectl -n default get pods --field-selector=status.phase=Failed
zuerst zu laufen .
Evicted
Schoten für mich los .
Räumungs-Pods sollten manuell gelöscht werden. Mit dem folgenden Befehl können Sie alle Pods im Error
Status löschen .
kubectl get pods --all-namespaces --field-selector 'status.phase==Failed' -o json | kubectl delete -f -
Abhängig davon, ob eine weiche oder harte Räumungsschwelle erreicht wurde, werden die Container im Pod mit oder ohne Kulanzfrist beendet, PodPhase
als markiert Failed
und der Pod gelöscht. Wenn Ihre Anwendung beispielsweise im Rahmen einer Bereitstellung ausgeführt wird, wird ein weiterer Pod von Kubernetes erstellt und geplant - wahrscheinlich auf einem anderen Knoten, der die Räumungsschwellen nicht überschreitet.
Beachten Sie, dass die Räumung nicht unbedingt durch Schwellenwerte verursacht werden muss, sondern auch über kubectl drain
das Leeren eines Knotens oder manuell über die Kubernetes-API aufgerufen werden kann .
kubectl get pods -n mynamespace
kubectl describe pod <pod>
sagt das aus?
kubectl describe
sagt "Status: Fehlgeschlagen Grund: Räumte Nachricht: Pod Der Knoten hatte wenig Ressourcen: [MemoryPressure]."
Kube-controller-manager
ist standardmäßig mit einer funktionierenden K8s-Installation vorhanden. Es scheint, dass die Standardeinstellung maximal 12500 terminierte Pods ist, bevor GC aktiviert wird.
Direkt aus der K8s-Dokumentation: https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/#kube-controller-manager
--terminated-pod-gc-schwelle int32 Standard: 12500
Anzahl der terminierten Pods, die vorhanden sein können, bevor der terminierte Pod-Garbage Collector mit dem Löschen terminierter Pods beginnt. Wenn <= 0, ist der terminierte Pod-Garbage-Collector deaktiviert.
kubectl edit pod kube-controller-manager-<master_name> -n kube-system
erhalte ich pod is invalid
nach dem Speichern der Konfigurationsdatei eine Fehlermeldung.
Nur für den Fall, dass jemand automatisch alle vertriebenen Pods für alle Namespaces löschen möchte:
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 }
kubectl get po --all-namespaces --field-selector=status.phase=Failed --no-headers -o custom-columns=:metadata.name | xargs kubectl delete po --all-namespaces
OpenShift-Äquivalent zu Kalvins Befehl zum Löschen aller "vertriebenen" Pods:
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')"
Noch ein Bash-Befehl zum Löschen von vertriebenen Pods
kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod
Um alle Evicted
Pods mit Gewalt zu löschen , können Sie diesen einzeiligen Befehl versuchen:
$ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/e'
Tipps: Verwenden Sie den p
Modifikator des s
Befehls von sed
anstatt e
nur den tatsächlichen Befehl zu drucken, um den Löschjob auszuführen:
$ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/p'
Hier ist die 'offizielle' Anleitung zum harten Codieren des Schwellenwerts (wenn Sie nicht zu viele vertriebene Pods sehen möchten): kube-controller-manager
Ein bekanntes Problem ist jedoch, wie kube-controller-manager installiert wird ...
Ein anderer Weg noch mit awk
.
Um menschliche Fehler zu vermeiden, die mich verrückt machen könnten (Löschen wünschenswerter Pods), überprüfe ich vor dem Ergebnis des get pods
Befehls:
kubectl -n my-ns get pods --no-headers --field-selector=status.phase=Failed
Wenn das gut aussieht, los geht's:
kubectl -n my-ns get pods --no-headers --field-selector=status.phase=Failed | \
awk '{system("kubectl -n my-ns delete pods " $1)}'
Mit dem folgenden Befehl werden alle fehlgeschlagenen Pods aus allen Namespaces gelöscht
kubectl get pods -A | grep Evicted | awk '{print $2 " -n " $1}' | xargs -n 3 kubectl delete pod
Mit dem folgenden Befehl werden alle entfernten Pods aus dem Standard-Namespace abgerufen und gelöscht
kubectl get pods | grep Evicted | awk '{print$1}' | xargs -I {} kubectl delete pods/{}
Evicted
13 Tagen in Betrieb ist. Es sieht so aus, als würden vertriebene Hülsen nicht entfernt (oder es ist nur ein Fehler).