¿Qué pasará con las vainas desalojadas en kubernetes?


82

Acabo de ver que algunos de mis pods fueron desalojados por kubernetes. que les pasara a ellos? simplemente merodeando así o tengo que eliminarlos manualmente?


3
Siendo testigo del mismo comportamiento, tengo una cápsula que ha estado en Evictedestado durante 13 días. Parece que las cápsulas desalojadas no se eliminan (o tal vez sea solo un error).
Elouan Keryell-Even

El controlador podgc recuperará los pods Fallidos / Correctos cuando se alcance un umbral configurable.
zhb

2
Mis Pods están desalojados y hay un total de 40. Entonces, ¿me cobrarán también por mes por esos pods desalojados?
Anant

Se desalojan un montón de contenedores, pero todavía tengo 2 contenedores funcionando como se esperaba. Los fallidos se debieron a bajos recursos ( DiskPressure) que se pueden encontrar usandokubectl describe pods my-pod-name --namespace prod
prayagupd

Respuestas:


79

Una solución rápida que utilizo es eliminar todos los pods desalojados manualmente después de un incidente. Puedes usar este comando:

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


Debe tener un error tipográfico, el -aargumento no es válido.
Ilya Suzdalnitski

5
Esta (y respuestas similares) no responden a la pregunta de OP "¿Qué les pasará [si no haces nada]?"
Oliver

56

Para eliminar pods en estado Fallido en el espacio de nombres default

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

1
Curiosamente, esto no muestra cuándo status.phase=Evicted. Me las arreglé para hacer esto kubectl -n default delete pods --field-selector=status.phase!=Running. Pero tenga cuidado, esto eliminaría todo
n3o

3
Supongo que puede ser útil ejecutarlo kubectl -n default get pods --field-selector=status.phase=Failedal principio.
nombre de usuario

Me deshace de las Evictedvainas.
robertodecurnex

19

Los pods desalojados deben eliminarse manualmente. Puede usar el siguiente comando para eliminar todos los pods en Errorestado.

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

15

Dependiendo de si se ha alcanzado un umbral de desalojo suave o estricto , los Contenedores del Pod se cancelarán con o sin período de gracia, PodPhasese marcarán como Failedy el Pod se eliminará. Si su Aplicación se ejecuta como parte de, por ejemplo, una Implementación, habrá otro Pod creado y programado por Kubernetes, probablemente en otro Nodo que no exceda sus umbrales de desalojo.

Tenga en cuenta que el desalojo no necesariamente tiene que ser causado por umbrales, sino que también puede invocarse kubectl drainpara vaciar un nodo o manualmente a través de la API de Kubernetes .


3
sí, mi pod es de una implementación, y veo otro pod que se ejecuta en otro nodo, pero esos pods desalojados anteriormente también están allí
reachlin

¿Cómo se determina que "también están allí"? ¿Qué comando te muestra eso exactamente?
Simon Tesar

justkubectl get pods -n mynamespace
reachlin

En que estado ¿Qué kubectl describe pod <pod>dice?
Simon Tesar

1
No OP pero tengo este problema. kubectl describe dice "Estado: Razón fallida: Mensaje desalojado: Pod El nodo tenía pocos recursos: [MemoryPressure]".
Bryan

5

En caso de que tenga pods con un Completedestado que desee mantener:

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

5

Kube-controller-managerexiste de forma predeterminada con una instalación de K8 en funcionamiento. Parece que el valor predeterminado es un máximo de 12500 pods terminados antes de que GC se active.

Directamente de la documentación de K8s: https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/#kube-controller-manager

--terminated-pod-gc -reshold int32 Valor predeterminado: 12500
Número de pods terminados que pueden existir antes de que el recolector de basura de los pods terminados comience a eliminar los pods terminados. Si <= 0, el recolector de basura del pod terminado está deshabilitado.


Tengo los pods de kube-controller-manager en mis nodos maestros. Pero, ¿cómo debo modificar esta bandera? Si quiero usarlo kubectl edit pod kube-controller-manager-<master_name> -n kube-system, me da un pod is invaliderror después de guardar el archivo de configuración.
Ali Tou

4

En caso de que alguien quiera eliminar automáticamente todos los pods desalojados para todos los espacios de nombres:

  • Potencia Shell
    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 }
  • Intento
kubectl get po --all-namespaces --field-selector=status.phase=Failed --no-headers -o custom-columns=:metadata.name | xargs kubectl delete po --all-namespaces

3

Equivalente de OpenShift del comando de Kalvin para eliminar todos los pods 'Evicted':

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

Un comando bash más para eliminar pods desalojados

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

2

Para eliminar todos los Evictedpods por la fuerza, puede probar este comando de una línea:

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

Consejos: use el pmodificador de scomando de en sedlugar de esimplemente imprimirá el comando real para hacer el trabajo de eliminación:

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

1

Aquí está la guía 'oficial' sobre cómo codificar el umbral (si no desea ver demasiados pods desalojados): kube-controll-manager

Pero un problema conocido es cómo tener instalado kube-controll-manager ...


Indique cómo se puede lograr la instalación mencionada, si es problemática.
MandyShaw

Tampoco sé la respuesta, por eso lo mencioné. Y OP no mencionó el sistema que usa y no sé si tendría el mismo problema. Por cierto, el voto negativo es SUPER AGRADABLE.
tikael

Creo que habría sido mejor agregar su idea como comentario, ya que no responde completamente a la pregunta (razón por la cual la rechacé, lo siento, pero nos pasa a todos, incluyéndome a mí en este momento).
MandyShaw

marque todas las otras respuestas anteriores, OP preguntó qué sucedió y cuántos de ellos respondieron eso y cuántos de ellos proporcionan una forma de eliminar el módulo de desalojo.
tikael

1

Otra forma todavía con awk.

Para evitar cualquier error humano que pueda volverme loco (eliminar pods deseables), verifico antes el resultado del get podscomando:

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

Si eso se ve bien, aquí vamos:

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

1

El siguiente comando elimina todos los pods fallidos de todos los espacios de nombres

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

-1

El siguiente comando obtendrá todos los pods desalojados del espacio de nombres predeterminado y los eliminará

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


1
No se recomiendan las respuestas de solo código, ya que no ayudará como una respuesta con un contexto explicado que ayude a la comunidad a largo plazo.
Arun Vinoth
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.