pods - ¿Cómo funciona el planificador de Kubernetes?
kubectl scale (2)
El párrafo que citó describe dónde esperamos estar en el futuro (donde el futuro se define en unidades de meses, no años). Aún no estamos allí, pero el programador ya tiene una serie de características útiles, suficientes para una implementación simple. En el resto de esta respuesta, explicaré cómo funciona el programador hoy.
El programador no es solo un controlador de admisión; para cada pod que se crea, encuentra la "mejor" máquina para ese pod, y si no hay una máquina adecuada, la cápsula permanece sin programar hasta que una máquina se vuelve adecuada.
El programador es configurable. Tiene dos tipos de políticas, FitPredicate (ver master / pkg / scheduler / predicates.go) y PriorityFunction (ver master / pkg / scheduler / priority.go). Los describiré.
Los predicados de ajuste son reglas necesarias, por ejemplo, las etiquetas en el nodo deben ser compatibles con el selector de etiquetas en el pod (esta regla se implementa en PodSelectorMatches () en predicates.go), y la suma de los recursos solicitados del contenedor (s) ) que ya se está ejecutando en la máquina más los recursos solicitados de los nuevos contenedores que está considerando programar en la máquina no debe ser mayor que la capacidad de la máquina (esta regla se implementa en PodFitsResources () en predicados.go; tenga en cuenta que "recursos solicitados" se define como pod.Spec.Containers [n] .Resources.Limits, y si solicita cero recursos, siempre encaja). Si alguna de las reglas requeridas no se cumple para un par particular (nuevo pod, máquina), entonces el nuevo pod no está programado en esa máquina. Si después de revisar todas las máquinas, el programador decide que el nuevo pod no se puede programar en ninguna máquina, entonces el pod permanecerá en estado Pendiente hasta que una de las máquinas pueda satisfacerlo.
Después de verificar todas las máquinas con respecto a los predicados de ajuste, el programador puede encontrar que varias máquinas "encajan" en el pod. Pero, por supuesto, la cápsula solo se puede programar en una máquina. Ahí es donde entran las funciones de prioridad. Básicamente, el programador clasifica las máquinas que cumplen con todos los predicados de ajuste, y luego elige el mejor. Por ejemplo, prefiere la máquina cuyos pods en ejecución consuman menos recursos (esto se implementa en LeastRequestedPriority () en prioridades.go). Esta política distribuye pods (y, por lo tanto, contenedores) en lugar de empaquetar lotes en una máquina y dejar otras vacías.
Cuando dije que el programador es configurable, me refiero a que en el momento de la compilación puede decidir cuáles son los predicados y las funciones de prioridad que desea que apliquen Kubernetes. Actualmente aplica todos los que ves en predicados.go y prioridades.go.
¿Cómo funciona el planificador de Kubernetes? Lo que quiero decir es que el programador de Kubernetes parece ser muy simple?
Mi idea inicial es que este programador es solo un simple sistema de control de admisión, no un programador real. ¿Es eso correcto?
Encontré una breve descripción, pero no es terriblemente informativa:
El planificador de kubernetes es una función específica de la carga de trabajo, rica en políticas, reconocida por la topología, que afecta significativamente la disponibilidad, el rendimiento y la capacidad. El programador debe tener en cuenta los requisitos de recursos individuales y colectivos, los requisitos de calidad de servicio, las limitaciones de hardware / software / políticas, las especificaciones de afinidad y antiafinidad, la localidad de datos, la interferencia de la carga de trabajo, los plazos, etc. Los requisitos específicos de la carga de trabajo se expondrán a través de la API según sea necesario.
Hemos realizado personalizaciones que, por ejemplo, aplican afinidad de múltiples niveles y anti afinidad basada en selectores personalizados. El programador no es perfecto, pero es bastante bueno para la mayoría de las cargas de trabajo de nivel de servicio, y en el futuro debería ser mucho mejor. https://docs.openshift.org/latest/admin_guide/scheduler.html#use-cases describe una configuración particular del programador de Kube que proporciona eso.