L'affinità del nodo è un insieme di regole. Viene utilizzato dallo scheduler per decidere dove posizionare un pod nel cluster. Le regole vengono definite utilizzando le etichette sui nodi e i selettori di etichette specificati nella definizione dei pod. L'affinità del nodo consente a un pod di specificare un'affinità verso un gruppo di nodi su cui può essere programmato. Possiamo limitare un pod in modo che possa essere eseguito solo su un particolare nodo.
nodeSelector è la forma più semplice di vincolo di selezione del nodo. nodeSelector è una proprietà di PodSpec. Affinché il pod possa essere eseguito su un nodo, il nodo deve avere ciascuna delle etichette indicate.
L'affinità del nodo è concettualmente simile a nodeSelector - ci consente di limitare i nodi su cui il nostro pod può essere pianificato, in base alle etichette sul nodo.
Attualmente esistono due tipi di affinità di nodo,
- requiredDuringSchedulingIgnoredDuringExecution e
- preferredDuringSchedulingIgnoredDuringExecution.
Cos'è durante la pianificazione
- Qui, il pod non è ancora stato creato e verrà creato per la prima volta.
- Di solito quando viene creato il pod verranno applicate le regole di affinità.
Cos'è durante l'esecuzione
- Qui, il pod è stato in esecuzione e la modifica è stata apportata nell'ambiente che interessa nodeAffinity.
Per conoscere in dettaglio Node Affinity, visita kubernete.io la documentazione ufficiale di Kubernetes.
In questo articolo, vedremo come assegnare un pod Kubernetes a un particolare nodo utilizzando l'affinità del nodo "requiredDuringSchedulingIgnoredDuringExecution" in un cluster Kubernetes.
Prerequisiti
- Cluster Kubernetes con almeno 1 nodo di lavoro.
Se vuoi imparare a creare un Cluster Kubernetes, fai clic qui. Questa guida ti aiuterà a creare un cluster Kubernetes con 1 master e 2 nodi su istanze AWS Ubuntu 18.04 EC2.
Cosa faremo?
- Configura l'affinità dei nodi
Configura l'affinità del nodo
Prima di tutto, otteniamo un elenco di nodi disponibili nel cluster.
kubectl get nodes #Get all the nodes in the cluster
Controlla se i nodi hanno Tants su di essi.
kubectl describe node node01 | grep Taints #Describe the node node01 and grep Taints
kubectl describe node master | grep Taints #Describe the node master and grep Taints

Aggiungi un'etichetta a un nodo di lavoro node01.
kubectl label node node01 app=qa #Add a label

Crea un file di definizione della distribuzione e aggiungi la seguente definizione al suo interno.
vim my-deployment-without-affinity.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-without-affinity
spec:
replicas: 20
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx

Ottieni un elenco di Pod e implementazioni.
kubectl get pods #Get pods in the default namespace
kubectl get deployment #Get deployments in the default namespace
Crea una distribuzione dalla definizione che abbiamo creato.
kubectl create -f my-deployment-without-affinity.yml #Create a deployment object
kubectl get deployment #Get deployments in the default namespace
kubectl get pods #Get pods in the default namespace

Ottieni i dettagli dei Pod creati dalla distribuzione.
Qui si può vedere che anche i Pod stanno ottenendo posti nel nodo principale. La ragione di ciò è che i nodi non hanno Taint su di essi, quindi i pod possono ottenere posti su qualsiasi nodo disponibile.
kubectl get pods -o wide #Get pods in the default namespace with more information about them using -o wide

Ora, crea una definizione di distribuzione con l'affinità del nodo definita.
vim my-deployment-with-affinity.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-with-afiinity
spec:
replicas: 6
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: app
operator: In
values:
- qa

Ottieni un elenco della distribuzione esistente e crea una nuova distribuzione con affinità utilizzando il file creato nel passaggio precedente.
kubectl get deployments #Get deployments in the default namespace
kubectl create -f my-deployment-with-affinity.yml #Create a deployment object
kubectl get deployments #Get deployments in the default namespace

Ora, si può vedere che i Pod questa volta sono stati posizionati solo sul nodo di lavoro node01. Il motivo è che abbiamo definito un'affinità di nodo nella definizione di distribuzione che assicura che i pod vengano distribuiti sui nodi che corrispondono alla condizione/etichetta definita.
kubectl get pods -o wide | grep app-with-afiinity #Get pods in the default namespace with more information about them using -o wide and grep app-with-afiinity

Conclusione
In questo articolo, abbiamo imparato ad aggiungere etichette ai nodi e abbiamo visto come è possibile limitare i pod per essere programmati sui nodi richiesti utilizzando Node Affinity. Abbiamo anche visto che i pod possono anche essere distribuiti sul nodo master se non presenta alcun taint su di esso.