Assign Pods to Nodes using Node Affinity
This page shows how to assign a Kubernetes Pod to a particular node using Node Affinity in aKubernetes cluster.
Before you begin
You need to have a Kubernetes cluster, and the kubectl command-line tool mustbe configured to communicate with your cluster. It is recommended to run this tutorial on a cluster with at least two nodes that are not acting as control plane hosts. If you do not already have acluster, you can create one by usingminikubeor you can use one of these Kubernetes playgrounds:
Your Kubernetes server must be at or later than version v1.10.To check the version, enterkubectl version.
Add a label to a node
List the nodes in your cluster, along with their labels:
kubectl get nodes --show-labelsThe output is similar to this:
NAME STATUS ROLES AGE VERSION LABELSworker0 Ready <none> 1d v1.13.0 ...,kubernetes.io/hostname=worker0worker1 Ready <none> 1d v1.13.0 ...,kubernetes.io/hostname=worker1worker2 Ready <none> 1d v1.13.0 ...,kubernetes.io/hostname=worker2Choose one of your nodes, and add a label to it:
kubectl label nodes <your-node-name>disktype=ssdwhere
<your-node-name>is the name of your chosen node.Verify that your chosen node has a
disktype=ssdlabel:kubectl get nodes --show-labelsThe output is similar to this:
NAME STATUS ROLES AGE VERSION LABELSworker0 Ready <none> 1d v1.13.0 ...,disktype=ssd,kubernetes.io/hostname=worker0worker1 Ready <none> 1d v1.13.0 ...,kubernetes.io/hostname=worker1worker2 Ready <none> 1d v1.13.0 ...,kubernetes.io/hostname=worker2In the preceding output, you can see that the
worker0node has adisktype=ssdlabel.
Schedule a Pod using required node affinity
This manifest describes a Pod that has arequiredDuringSchedulingIgnoredDuringExecution node affinity,disktype: ssd.This means that the pod will get scheduled only on a node that has adisktype=ssd label.
apiVersion:v1kind:Podmetadata:name:nginxspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:-key:disktypeoperator:Invalues:- ssdcontainers:-name:nginximage:nginximagePullPolicy:IfNotPresentApply the manifest to create a Pod that is scheduled onto yourchosen node:
kubectl apply -f https://k8s.io/examples/pods/pod-nginx-required-affinity.yamlVerify that the pod is running on your chosen node:
kubectl get pods --output=wideThe output is similar to this:
NAME READY STATUS RESTARTS AGE IP NODEnginx 1/1 Running 0 13s 10.200.0.4 worker0
Schedule a Pod using preferred node affinity
This manifest describes a Pod that has apreferredDuringSchedulingIgnoredDuringExecution node affinity,disktype: ssd.This means that the pod will prefer a node that has adisktype=ssd label.
apiVersion:v1kind:Podmetadata:name:nginxspec:affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:-weight:1preference:matchExpressions:-key:disktypeoperator:Invalues:- ssdcontainers:-name:nginximage:nginximagePullPolicy:IfNotPresentApply the manifest to create a Pod that is scheduled onto yourchosen node:
kubectl apply -f https://k8s.io/examples/pods/pod-nginx-preferred-affinity.yamlVerify that the pod is running on your chosen node:
kubectl get pods --output=wideThe output is similar to this:
NAME READY STATUS RESTARTS AGE IP NODEnginx 1/1 Running 0 13s 10.200.0.4 worker0
What's next
Learn more aboutNode Affinity.