Aunque se puede encontrar en la doc de K8s, esta es la plantilla de la estructura de "nodeAffinity"
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key:
operator:
values:
- Etiquetar un nodo
kubectl label nodes node01 size=Large
- Crear deployment de 4 replicas
- Assignar nodeAffinity para que el deployment anterior se ejecute solo en el nodo etiquetado
- Configurar lo necesario para conseguir el siguiente escenario
- Tener un Pod "red", con imagen nginx, que se ejecute exclusivamente en el nodo01
- Que cualquier otro Pod (sin necesidad de definir nada en el Pod, se ejecute en el nodo02, o cualquier nodo adicional si aumentamos el cluster
Solución
-
Necesitamos que el Pod "red" se ejecute en el nodo node01. Por tanto necesitaremos una definicion de nodeAffinity que nos vincule el pod a un label del node01
-
Necesitamos hacer que el pod "red" se el unico pod que se ejecuta en node01. Por tanto necesitaremos un "Taint" en ese nodo, y un "Toleration" a ese Taint en el pod red
-
Añadimos un label al node (para el nodeAffinity)
kubectl label node node01 color=red
- Añadimos un Taint al nodo
kubectl taint node node01 color=red:NoSchedule
- Definimos el Affinity y Toleration
apiVersion: v1
kind: Pod
metadata:
labels:
color: red
name: red
spec:
containers:
- image: nginx
name: nginx
tolerations:
- key: "color"
operator: "Equal"
value: "red"
effect: "NoSchedule"
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: color
operator: In
values:
- red