Milicores
- Entrada
- 500m
- Resultado
- 0,5 núcleos
1000m es un núcleo. Un request de 100m significa que el planificador reserva una décima parte de un núcleo.
Convierte milicores y sufijos de memoria, multiplícalos por las réplicas y comprueba la clase QoS que asignará el kubelet. La tabla de sufijos hace tangible la diferencia entre Mi y M, de donde salen el gasto silencioso y los OOMKill inesperados.
Cargas de ejemplo
| Por pod | × 3 réplicas | |
|---|---|---|
| CPU request | 0.1 | 0.3 |
| CPU limit | 0.5 | 1.5 |
| Memoria request | 128Mi | 384Mi |
| Memoria limit | 256Mi | 768Mi |
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
# 3 replicas require
# cpu 0.3 cores requested, 1.5 at the limit
# memory 384Mi requested, 768Mi at the limitKubernetes acepta sufijos binarios y decimales, y no miden lo mismo.
| Sufijo | Bytes | Sufijo | Bytes | Diferencia |
|---|---|---|---|---|
| 1Ki | 1,024 | 1k | 1,000 | +2.4% |
| 1Mi | 1,048,576 | 1M | 1,000,000 | +4.9% |
| 1Gi | 1,073,741,824 | 1G | 1,000,000,000 | +7.4% |
Así, 1G son 1G mientras que 1Gi son 1Gi: alrededor de un 7% más.
Todo ocurre en tu navegador. Esta página es un archivo estático. Lo que escribes se queda en la pestaña, nunca se envía a un servidor y desaparece al cerrarla, así que puedes pegar un token o una configuración real sin riesgo.
1000m es un núcleo. Un request de 100m significa que el planificador reserva una décima parte de un núcleo.
Escribir M donde querías Mi da al contenedor alrededor de un 7% menos de memoria de la prevista.
Solo cuando los requests de CPU y memoria igualan exactamente sus limits. Cualquier otra cosa es Burstable y se desaloja antes bajo presión.
512M son 512.000.000 bytes; 512Mi son 536.870.912. El manifiesto es válido en ambos casos, así que nada te avisa: el pod simplemente recibe menos memoria de la que sugiere el número.
Un limit varias veces mayor que el request deja al pod dispararse y luego lo estrangula en cuanto el nodo se llena. Muchos picos de latencia que parecen fallos de la aplicación son en realidad throttling del CFS.
Un pod sin requests es BestEffort y es lo primero que se desaloja cuando un nodo se queda corto. Además no da nada al planificador con lo que trabajar, así que los nodos se llenan de forma desigual.
El request es lo que el planificador reserva al colocar el pod; el limit es el techo que el kernel impone en ejecución. Los requests deciden dónde aterriza un pod, los limits cuándo se le estrangula o se le mata por memoria.
Guaranteed significa que cada contenedor tiene requests de CPU y memoria iguales a sus limits. BestEffort significa que no hay ni requests ni limits. Todo lo intermedio es Burstable, y eso importa porque el desalojo sigue ese orden.
Muchos equipos fijan limits de memoria pero dejan la CPU libre, porque superar un limit de memoria mata el contenedor mientras que superar el de CPU solo lo estrangula, a menudo con peor coste en latencia que dejar al pod usar capacidad ociosa.