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

  1. List the nodes in your cluster, along with their labels:

    kubectl get nodes --show-labels

    The 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=worker2
  2. Choose one of your nodes, and add a label to it:

    kubectl label nodes <your-node-name>disktype=ssd

    where<your-node-name> is the name of your chosen node.

  3. Verify that your chosen node has adisktype=ssd label:

    kubectl get nodes --show-labels

    The 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=worker2

    In the preceding output, you can see that theworker0 node has adisktype=ssd label.

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:IfNotPresent
  1. Apply the manifest to create a Pod that is scheduled onto yourchosen node:

    kubectl apply -f https://k8s.io/examples/pods/pod-nginx-required-affinity.yaml
  2. Verify that the pod is running on your chosen node:

    kubectl get pods --output=wide

    The 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:IfNotPresent
  1. Apply the manifest to create a Pod that is scheduled onto yourchosen node:

    kubectl apply -f https://k8s.io/examples/pods/pod-nginx-preferred-affinity.yaml
  2. Verify that the pod is running on your chosen node:

    kubectl get pods --output=wide

    The 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.

Last modified August 24, 2023 at 6:38 PM PST:Use code_sample shortcode instead of code shortcode (e8b136c3b3)