Kubernetes es una poderosa plataforma para administrar aplicaciones en contenedores en un grupo de nodos. Sin embargo, a veces es posible que desee tener más control sobre qué pods están programados en qué nodos, por diversos motivos, como el rendimiento, la seguridad o el costo.
¿Qué son las contaminaciones y las tolerancias?#
Las manchas y las tolerancias son una característica de Kubernetes que le permite marcar nodos con ciertos atributos o condiciones y luego especificar qué pods pueden o no programarse en esos nodos en función de esos atributos o condiciones. Las contaminaciones se aplican a los nodos y las tolerancias se aplican a las vainas.
Una contaminación consta de tres componentes: una clave, un valor y un efecto. La clave y el valor son cadenas arbitrarias que puede elegir para identificar la corrupción. El efecto determina lo que sucede con las vainas que no toleran la contaminación. Hay tres efectos posibles:
NoSchedule: los pods que no toleran la contaminación no están programados en el nodo.PreferNoSchedule: Los pods que no toleran la contaminación preferiblemente no se programan en el nodo, pero no está garantizado.NoExecute: los pods que no toleran la contaminación no se programan en el nodo y todos los pods existentes en el nodo que no toleran la contaminación se desalojan.
Una tolerancia consta de cuatro componentes: una clave, un valor, un operador y un efecto. La clave y el valor deben coincidir con la clave y el valor de la contaminación. El operador puede ser Equal o Exists. El efecto puede ser NoSchedule, PreferNoSchedule o NoExecute, o dejarse vacío (lo que significa cualquier efecto).
Un grupo puede tolerar una contaminación si una de sus tolerancias coincide con la contaminación de acuerdo con las siguientes reglas:
- Las claves deben ser iguales.
- Los valores deben ser iguales si el operador es
Equal, o cualquier valor si el operador esExists. - Los efectos deben coincidir, o el efecto de la tolerancia debe estar vacío.
¿Cómo utilizar las contaminaciones y las tolerancias?#
Para utilizar manchas y tolerancias, debe aplicarlas a sus nodos y pods mediante comandos kubectl o manifiestos YAML. A continuación se muestran algunos ejemplos de cómo hacerlo.
Aplicar una contaminación a un nodo#
Para aplicar una contaminación a un nodo, puede utilizar el siguiente comando:
kubectl taint nodes <node-name> <key>=<value>:<effect>
Por ejemplo, si desea marcar un nodo como dedicado solo para pods de bases de datos, puede aplicar una contaminación con la clave type, el valor db y el efecto NoSchedule:
kubectl taint nodes node1 type=db:NoSchedule
Esto evitará que se programe cualquier pod en el nodo1 a menos que tenga una tolerancia coincidente.
Aplicar una tolerancia a un pod#
Para aplicar una tolerancia a un pod, puede agregarla a la especificación del pod en el campo tolerations. Por ejemplo, si desea permitir que se programe un pod de base de datos en el nodo1, puede agregar una tolerancia con la clave type, el valor db y el operador Equal:
apiVersion: v1
kind: Pod
metadata:
name: db-pod
spec:
containers:
- name: db-container
image: db-image
tolerations:
- key: type
operator: Equal
value: db
effect: NoScheduleEsto permitirá que el pod tolere la contaminación en el nodo1 y se programe allí.
Eliminar una contaminación de un nodo#
Para eliminar una contaminación de un nodo, puede utilizar el siguiente comando:
kubectl taint nodes <node-name> <key>:<effect>-
Por ejemplo, si desea eliminar la contaminación con la clave type y el efecto NoSchedule del nodo1, puede usar:
kubectl taint nodes node1 type:NoSchedule-
Esto permitirá volver a programar cualquier pod en el nodo1.
Las manchas y las tolerancias son una característica útil de Kubernetes que le permite controlar qué pods están programados en qué nodos. Puede utilizarlos para aislar determinados nodos con fines específicos, como rendimiento, seguridad o coste. También puedes utilizarlos para evitar conflictos o interferencias entre diferentes tipos de pods. Para utilizarlos de forma eficaz, es necesario comprender cómo funcionan y cómo aplicarlos correctamente.