Taints y Tolerations
Taints (Las manchas / El Repelente en los Nodos)
Los Taints se aplican exclusivamente a los Nodos. Le dicen al planificador (kube-scheduler): "No pongas ningún Pod aquí a menos que tenga el pase VIP".
-
Estructura:
clave=valor:Efecto -
Los 3 Efectos Posibles (Memoriza esto):
-
NoSchedule: Ningún Pod nuevo se programará en este nodo. (Los Pods que ya estaban corriendo antes de poner el Taint, se quedan ahí tranquilos). -
PreferNoSchedule: Es una sugerencia (Soft limit). El scheduler intentará no poner Pods ahí, pero si el clúster está muy lleno y no hay otra opción, lo hará. -
NoExecute: ¡Modo Estricto! No solo prohíbe la entrada a Pods nuevos, sino que expulsa (evict) inmediatamente a cualquier Pod que ya estuviera corriendo en el nodo y no tenga la tolerancia.
Comandos de Velocidad (Modo Examen):
-
Aplicar un Taint:
kubectl taint nodes nodo-worker1 gpu=true:NoSchedule -
Eliminar un Taint (Ojo al signo menos - al final):
kubectl taint nodes nodo-worker1 gpu=true:NoSchedule- -
Ver los Taints actuales de un Nodo:
kubectl describe node nodo-worker1 | grep Taint
Tolerations (La Inmunidad en los Pods)
Las tolerancias se aplican exclusivamente a los Pods. Se definen en el manifiesto YAML bajo la sección spec.tolerations.
Para que un Pod pueda entrar al nodo, la tolerancia debe coincidir exactamente con el Taint.
apiVersion: v1
kind: Pod
metadata:
name: pod-inmune
spec:
containers:
- name: nginx
image: nginx
tolerations:
- key: "gpu"
operator: "Equal" # Debe coincidir la clave y el valor
value: "true"
effect: "NoSchedule"
La Trampa Clásica del Examen (El Secreto del Instructor)
En el examen te pueden poner un problema como este: "Asegúrate de que el Pod de Base de Datos se ejecute ÚNICAMENTE en el nodo db-node".
Muchos estudiantes fallan porque le ponen un Taint al db-node y una Toleration al Pod. ¡Eso no es suficiente!
Los Taints y Tolerations NO atraen a los Pods. Solo les dan "permiso de entrar". Si solo usas Taints/Tolerations, tu Pod de Base de Datos es tolerante a db-node, pero el scheduler podría decidir enviarlo al worker-2 que no tiene ningún Taint.
- La Solución Real: Para lograr que un Pod vaya a un nodo en específico de forma obligatoria, debes combinar un Taint/Toleration (para que nadie más entre al nodo de DB) Y un
nodeSelectoronodeAffinityen el Pod (para obligar al Pod a ir a ese nodo y no a otro).