Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Actualización más reciente 2023-08-08 GMT+08:00

¿Qué debo hacer si un pod no es desalojado?

Qué es el desalojo

Cuando se produce una excepción en un nodo, Kubernetes desaloja los pods del nodo para garantizar la disponibilidad de la carga de trabajo.

En Kubernetes, tanto kube-controller-manager como kubelet pueden desalojar pods.

  • Desalojo desplegado por kube-controller-manager

    kube-controller-manager consiste en múltiples controladores, y el desalojo es desplegado por el controlador de nodo. El controlador comprueba periódicamente el estado de todos los nodos. Cuando un nodo está en el estado NotReady durante un período de tiempo, todos los pods del nodo son desalojados.

    kube-controller-manager proporciona los siguientes parámetros de inicio para controlar los desalojos:

    • pod-eviction-timeout: intervalo en el que un nodo está inactivo, tras el cual se desalojan los pods de ese nodo. El intervalo predeterminado es 5 minutos.
    • node-eviction-rate: velocidad a la que se desalojan los nodos, que se implementa mediante el algoritmo de control de tráfico de bucket de testigos. El valor predeterminado es 0.1, lo que indica que se desalojan 0.1 nodos por segundo. Obsérvese que esta velocidad no es la velocidad a la que se desalojan los pods, sino la velocidad a la que se desalojan los nodos. Es decir, se borra un nodo cada 10 segundos.
    • secondary-node-eviction-rate: tasa de desalojo secundario. Cuando un gran número de nodos están abajo en el clúster, la tasa de desalojo disminuye. El valor predeterminado es 0.01.
    • unhealthy-zone-threshold: umbral para que una zona se considere insalubre. Este parámetro determina cuándo habilitar la tasa de desalojo secundario. El valor predeterminado es 0.55. Es decir, si el porcentaje de nodos descendentes en una zona supera el 55%, la zona no está sana.
    • large-cluster-size-threshold: umbral para que un clúster se considere grande. Cuando el número de nodos en una zona excede este umbral, la zona se considera como un clúster grande. Si el porcentaje de nodos inactivos en un clúster grande supera el 55%, la tasa de desalojo se reduce a 0.01. Si el grupo es pequeño, la tasa de desalojo se reduce a 0.
  • Desalojo desplegado por kubelet

    Si se van a utilizar recursos de un nodo, kubelet ejecuta la política de desalojo basada en la prioridad de pod, el uso de recursos y la solicitud de recursos. Si los pods tienen la misma prioridad, el pod que usa la mayoría de los recursos o las solicitudes de la mayoría de los recursos será desalojado primero.

    kube-controller-manager desaloja todos los pods en un nodo, mientras que kubelet desaloja ciertos pods en un nodo. Los pods a desalojar son determinadas por la QoS de pods. kubelet comprueba periódicamente la memoria y los recursos de disco del nodo. Si los recursos son insuficientes, los pods son desalojados en función de la prioridad.

    Hay umbrales de desahucio blandos y umbrales de desahucio duros.

    • Soft eviction threshold: Se establece un período de gracia para los recursos de nodo. kubelet recuperará recursos de nodo asociados con este umbral si se excede ese período de gracia. Si el uso de recursos de nodo alcanza este umbral pero cae por debajo de él antes de que se exceda el período de gracia, kubelet no desalojará los pods del nodo.
    • Hard eviction threshold: Los pods son desalojados inmediatamente una vez que se alcanza este umbral.

    kubelet proporciona los siguientes parámetros para controlar los desalojos:

    • eviction-soft describe un conjunto de umbrales de desalojo que, si se cumplen durante un período de gracia correspondiente, desencadenarían un desalojo de pod. Por ejemplo, si memory.available es inferior a 1.5 Gi, el desalojo de pod se ejecuta solo después de que se exceda el período de gracia especificado por eviction-soft-grace-period.
    • eviction-soft-grace-period: un conjunto de períodos de gracia de desalojo que corresponden a cuánto tiempo debe mantenerse un umbral de desalojo suave antes de activar un desalojo de pod. El valor predeterminado es 90 segundos.
    • eviction-max-pod-grace-period: período de gracia máximo permitido para usar cuando se terminan los pods en respuesta a un umbral de desalojo suave que se cumple.
    • eviction-pressure-transition-period: duración por la cual el kubelet tiene que esperar antes de salir de una condición de presión de desalojo. El valor predeterminado es 5 minutos. Si el tiempo excede el umbral, el nodo se establece en presión de memoria o presión de disco y, a continuación, se inicia el desalojo de pod.
    • eviction-minimum-reclaim: número mínimo de recursos que se deben reclamar en cada desalojo.
    • eviction-hard describe un conjunto de umbrales de desalojo (como memory.available<1Gi) que, si se cumplen, activarían un desalojo de pod.

Localización de fallas

Si los pods no se desalojan cuando el nodo está defectuoso, realice los siguientes pasos para localizar la falla:

Después de ejecutar el siguiente comando, el resultado del comando muestra que muchos pods están en el estado Evicted.

kubectl get pods
Los resultados de la comprobación se registrarán en los logs de kubelet del nodo. Puede ejecutar el siguiente comando para buscar la información:
cat /var/paas/sys/log/kubernetes/kubelet.log | grep -i Evicted -C3

Proceso de solución de problemas

Los métodos de resolución de problemas se ordenan en función de la probabilidad de ocurrencia de las posibles causas. Se recomienda comprobar las posibles causas de alta probabilidad a baja probabilidad para localizar rápidamente la causa del problema.

Si la falla persiste después de rectificar una posible causa, compruebe otras posibles causas.

Figura 1 Proceso de solución de problemas

Concepto de comprobación 1: Si las tolerancias se han configurado en el pod

Utilice kubectl o elija More > Edit YAML junto a la carga de trabajo correspondiente para comprobar si las tolerancias están instaladas en la carga de trabajo. Para obtener más información, véase https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/.

Concepto de comprobación 2: Si se cumplen las condiciones para detener el desalojo de pods

Si el número de nodos en un clúster es menor que 50 y el número de nodos defectuosos representa más del 55% del total de nodos, el desalojo de pod se suspenderá. En este caso, Kubernetes intentará desalojar la carga de trabajo del nodo defectuoso. Para obtener más información, véase https://kubernetes.io/docs/concepts/architecture/nodes/.

Concepto de comprobación 3: Si los recursos asignados del contenedor son los mismos que los del nodo

Un contenedor desalojado se programa con frecuencia en el nodo original.

Causa posible

Un nodo desaloja un contenedor basado en el uso de recursos del nodo. El contenedor desalojado se programa según los recursos de nodo asignados. El desalojo y la programación se basan en diferentes reglas. Por lo tanto, un contenedor desalojado puede programarse de nuevo en el nodo original.

Solución

Asigne los recursos correctamente a cada contenedor.

Concepto de comprobación 4: Si el pod falla continuamente y se redistribuye

Un pod de carga de trabajo en el clúster falla y se está redistribuyendo constantemente.

Análisis

Después de que un pod es desalojado y programado para un nuevo nodo, si los pods en ese nodo también están siendo desalojados, el pod será desalojado de nuevo. Los pods pueden ser desalojados repetidamente.

Si el desalojo es activado por kube-controller-manager, se deja un pod en el estado Terminating. Solo se elimina automáticamente después de que se restablezca el nodo en el que se encuentra el contenedor. Si el nodo se ha eliminado o no se puede restaurar debido a otras razones, puede eliminar por la fuerza el pod.

Si el desalojo es provocado por kubelet, se deja un pod en el estado Evicted. Solo se utiliza para la localización posterior de fallas y se puede eliminar directamente.

Solución

Ejecute el siguiente comando para eliminar los pods desalojados:

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

En el comando anterior <namespace> indica el nombre del espacio de nombres. Establezca en función de los requisitos del sitio.

Envío de un ticket de servicio

Si el problema persiste envíe un ticket de servicio.

Anomalías de la carga de trabajo Preguntas frecuentes

more