Trabajando con Tolerancias
Ahora que entendemos cómo funcionan los taints, exploremos las tolerancias, el mecanismo que permite que los pods se programen en nodos con taints coincidentes.
Entendiendo las Tolerancias
Las tolerancias se especifican en las especificaciones de los pods y permiten que los pods se programen en nodos con taints coincidentes. Una tolerancia consta de:
key: Coincide con la clave del taint
operator: Ya sea Equal (coincide con la clave y el valor) o Exists (coincide solo con la clave)
value: El valor a coincidir (cuando se usa el operador Equal)
effect: El efecto a coincidir, o vacío para coincidir con todos los efectos
tolerationSeconds: Duración opcional durante la cual el pod puede permanecer en un nodo con un taint NoExecute coincidente
Creando un Pod con Tolerancias
Creemos un pod que tolera nuestro taint del plano de control. Primero, creemos un archivo YAML para nuestro pod:
nano ~/project/toleration-pod.yaml
Ahora, agregue el siguiente contenido al archivo:
apiVersion: v1
kind: Pod
metadata:
name: toleration-pod
spec:
containers:
- name: nginx
image: nginx:latest
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
Esta especificación de pod incluye una tolerancia que coincide con el taint del plano de control en nuestro nodo. Guarde y salga del archivo (en nano, presione Ctrl+O, Enter, luego Ctrl+X).
Ahora, creemos el pod:
kubectl apply -f ~/project/toleration-pod.yaml
Debería ver una salida como:
pod/toleration-pod created
Verifiquemos si el pod se programó en nuestro nodo:
kubectl get pods -o wide
Ejemplo de salida:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
toleration-pod 1/1 Running 0 12s 10.244.0.5 minikube <none> <none>
El pod se está ejecutando en nuestro nodo minikube porque tiene una tolerancia que coincide con el taint del plano de control.
Probando con un Pod sin Tolerancias
Para comparar, creemos un pod sin tolerancias:
nano ~/project/no-toleration-pod.yaml
Agregue el siguiente contenido:
apiVersion: v1
kind: Pod
metadata:
name: no-toleration-pod
spec:
containers:
- name: nginx
image: nginx:latest
Guarde y salga del archivo, luego cree el pod:
kubectl apply -f ~/project/no-toleration-pod.yaml
Ahora, verifiquemos el estado del pod:
kubectl get pods -o wide
Es posible que observe que el pod permanece en estado Pendiente:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
no-toleration-pod 0/1 Pending 0 12s <none> <none> <none> <none>
toleration-pod 1/1 Running 0 2m 10.244.0.5 minikube <none> <none>
Verifiquemos por qué el pod está pendiente:
kubectl describe pod no-toleration-pod
En la sección de eventos, debería ver algo como:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 45s default-scheduler 0/1 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.
Esto confirma que el pod no pudo programarse porque no tolera el taint del plano de control.
Limpieza
Limpiemos los pods que creamos:
kubectl delete pod toleration-pod no-toleration-pod
Debería ver:
pod "toleration-pod" deleted
pod "no-toleration-pod" deleted
¡Felicidades! Ahora comprende cómo los taints y las tolerancias trabajan juntos para controlar la programación de pods en Kubernetes.