Las tolerancias de Kubernetes son una forma de permitir que los pods se programen en nodos que tienen taints, que son marcadores que repelen los pods de forma predeterminada. Las tolerancias le permiten controlar qué pods se pueden ejecutar en qué nodos, según los requisitos del pod y las características del nodo.
¿Cuáles son las tolerancias de Kubernetes?#
Las tolerancias de Kubernetes son una propiedad del pod que permite programar un pod en un nodo con una contaminación coincidente. Las manchas son lo opuesto a la afinidad de nodos, que es una forma de atraer pods a un conjunto de nodos. Las manchas se aplican a los nodos y actúan como una barrera repelente contra nuevas vainas. Los nodos contaminados solo aceptarán pods que hayan sido marcados con la tolerancia correspondiente.
Las tolerancias se especifican en la especificación del pod, en el campo tolerations. Una tolerancia consta de tres componentes: una clave, un operador y un efecto. La clave y el operador se utilizan para hacer coincidir la tolerancia con la contaminación. El efecto determina cómo se comporta el programador cuando encuentra la contaminación.
Hay tres efectos posibles para las contaminaciones y las tolerancias:
NoSchedule: los pods que no toleran la contaminación no se programarán en el nodo. Los pods que ya se están ejecutando en el nodo no se ven afectados.PreferNoSchedule: el programador evitará los pods que no toleran la contaminación, pero aún así se pueden programar en el nodo si no hay otras opciones.NoExecute: los pods que no toleren la corrupción serán desalojados del nodo si ya se están ejecutando y no se programarán en el nodo en el futuro.
El operador puede ser Equal o Exists. El operador Equal requiere que la clave y el valor de la contaminación coincidan exactamente con la clave y el valor de la tolerancia. El operador Exists solo requiere que la clave de la contaminación coincida con la clave de la tolerancia, independientemente del valor.
A continuación se muestra un ejemplo de una especificación de pod con una tolerancia:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "example-key"
operator: "Exists"
effect: "NoSchedule'Este pod tiene tolerancia para cualquier contaminación con la clave example-key y el efecto NoSchedule. Esto significa que se puede programar en cualquier nodo que tenga dicha contaminación, pero no tolerará ninguna otra contaminación.
¿Cómo utilizar las tolerancias de Kubernetes?#
Para utilizar las tolerancias de Kubernetes, primero debe aplicar taints a sus nodos. Puedes hacer esto usando el comando kubectl taint. Por ejemplo, para aplicar una contaminación con la clave example-key, el valor example-value y el efecto NoSchedule a un nodo llamado node1, puede ejecutar:
kubectl taint nodes node1 example-key=example-value:NoSchedulePara eliminar una contaminación de un nodo, puede agregar un - al final del comando:
kubectl taint nodes node1 example-key=example-value:NoSchedule-También puedes aplicar múltiples taints a un nodo a la vez, o eliminar múltiples taints a la vez, separándolos con espacios:
kubectl taint nodes node1 example-key=example-value:NoSchedule another-key=another-value:PreferNoSchedule
kubectl taint nodes node1 example-key=example-value:NoSchedule- another-key=another-value:PreferNoSchedule-Para ver las manchas en sus nodos, puede usar el comando kubectl describe:
kubectl describe nodes node1Deberías ver algo como esto en el resultado:
Name: node1
Roles: <none>
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/hostname=node1
Annotations: <none>
Taints: example-key=example-value:NoSchedule
another-key=another-value:PreferNoSchedule
...Una vez que haya aplicado taints a sus nodos, puede crear pods con tolerancias que coincidan con ellas. Puede hacer esto agregando el campo tolerations a la especificación de su pod, como se muestra en el ejemplo anterior. También puede utilizar una plantilla de pod para crear varios pods con las mismas tolerancias, como en una implementación o un conjunto de demonios.
Casos de uso para las tolerancias de Kubernetes#
Las tolerancias de Kubernetes se pueden utilizar para diversos escenarios en los que desea controlar qué pods se pueden ejecutar en qué nodos, según los requisitos del pod y las características del nodo. A continuación se muestran algunos casos de uso comunes de las tolerancias:
- Aislar nodos para cargas de trabajo específicas: es posible que tenga algunos nodos dedicados a ciertos tipos de cargas de trabajo, como aplicaciones con uso intensivo de GPU o procesamiento de datos confidenciales. Puede contaminar estos nodos con una clave y un valor únicos, y solo permitir que se ejecuten en ellos pods que tengan una tolerancia coincidente. De esta manera, puede asegurarse de que estos nodos no sean utilizados por otros pods que no los necesiten y de que sus cargas de trabajo especiales tengan acceso a los recursos que necesitan.
- Reserva de nodos para pods de alta prioridad: es posible que tenga algunos pods que sean más críticos que otros, como componentes del sistema o pods que manejan solicitudes de usuarios. Puede contaminar algunos nodos con una clave y un valor de alta prioridad y permitir que solo se ejecuten en ellos pods que tengan una tolerancia coincidente. De esta manera, puede asegurarse de que estos nodos no estén ocupados por pods de baja prioridad que podrían interferir con el rendimiento o la disponibilidad de sus pods de alta prioridad.
- Evitar nodos con problemas de rendimiento: es posible que tenga algunos nodos que estén experimentando problemas de rendimiento, como una carga elevada de CPU, presión de memoria o congestión de la red. Puede contaminar estos nodos con una clave y un valor que indiquen el problema y utilizar el efecto
PreferNoSchedulepara desalentar la programación de pods en ellos. De esta manera, puede evitar colocar más carga en estos nodos y darles la oportunidad de recuperarse. También puede utilizar el efectoNoExecutepara desalojar los pods que ya se están ejecutando en estos nodos, si desea liberar los recursos más rápidamente.