Saltar a contenido

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 nodeSelector o nodeAffinity en el Pod (para obligar al Pod a ir a ese nodo y no a otro).