---
title: Placing pods on specific nodes using node selectors
---

# Placing pods on specific nodes using node selectors {#nodes-pods-node-selectors}

For a pod to be eligible to run on a specific node, you can include a *node selector* in the pod spec that has the indicated key-value pairs as the label on that node.

A *node selector* specifies a map of key-value pairs. The rules are defined using custom labels on nodes and selectors specified in pods.

If you are using node affinity and node selectors in the same pod configuration, see the important considerations below.

## Using node selectors to control pod placement {#nodes-scheduler-node-selectors-pod_nodes-pods-node-selectors}

You can use node selectors on pods and labels on nodes to control where the pod is scheduled. With node selectors, OpenShift Container Platform schedules the pods on nodes that contain matching labels.

You add labels to a node, a compute machine set, or a machine config. Adding the label to the compute machine set ensures that if the node or machine goes down, new nodes have the label. Labels added to a node or machine config do not persist if the node or machine goes down.

To add node selectors to an existing pod, add a node selector to the controlling object for that pod, such as a `ReplicaSet` object, `DaemonSet` object, `StatefulSet` object, `Deployment` object, or `DeploymentConfig` object. Any existing pods under that controlling object are recreated on a node with a matching label. If you are creating a new pod, you can add the node selector directly to the pod spec. If the pod does not have a controlling object, you must delete the pod, edit the pod spec, and recreate the pod.

> [!NOTE]
> You cannot add a node selector directly to an existing scheduled pod.

**Prerequisites**

To add a node selector to existing pods, determine the controlling object for that pod. For example, the `router-default-66d5cf9464-m2g75` pod is controlled by the `router-default-66d5cf9464` replica set:

```terminal
$ oc describe pod router-default-66d5cf9464-7pwkc
```

The output appears similar to the following example:

```terminal
kind: Pod
apiVersion: v1
metadata:
# ...
Name:               router-default-66d5cf9464-7pwkc
Namespace:          openshift-ingress
# ...
Controlled By:      ReplicaSet/router-default-66d5cf9464
# ...
```

The web console lists the controlling object under `ownerReferences` in the pod YAML:

```terminal
apiVersion: v1
kind: Pod
metadata:
  name: router-default-66d5cf9464-7pwkc
# ...
  ownerReferences:
    - apiVersion: apps/v1
      kind: ReplicaSet
      name: router-default-66d5cf9464
      uid: d81dd094-da26-11e9-a48a-128e7edf0312
      controller: true
      blockOwnerDeletion: true
# ...
```

**Procedure**

1. Add labels to a node by using a compute machine set or editing the node directly:

   - Use a `MachineSet` object to add labels to nodes managed by the compute machine set when a node is created:

     1. Run the following command to add labels to a `MachineSet` object:

        ```terminal
        $ oc patch MachineSet <name> --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"<key>"="<value>","<key>"="<value>"}}]'  -n openshift-machine-api
        ```

        For example:

        ```terminal
        $ oc patch MachineSet abc612-msrtw-worker-us-east-1c  --type='json' -p='[{"op":"add","path":"/spec/template/spec/metadata/labels", "value":{"type":"user-node","region":"east"}}]'  -n openshift-machine-api
        ```

        > [!TIP]
        > You can alternatively apply the following YAML to add labels to a compute machine set:
        >
        > ```yaml
        > apiVersion: machine.openshift.io/v1beta1
        > kind: MachineSet
        > metadata:
        >   name: xf2bd-infra-us-east-2a
        >   namespace: openshift-machine-api
        > spec:
        >   template:
        >     spec:
        >       metadata:
        >         labels:
        >           region: "east"
        >           type: "user-node"
        > # ...
        > ```
     2. Verify that the labels are added to the `MachineSet` object by using the `oc edit` command:

        For example:

        ```terminal
        $ oc edit MachineSet abc612-msrtw-worker-us-east-1c -n openshift-machine-api
        ```

        The output appears similar to the following example:

        ```yaml
        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet

        # ...

        spec:
        # ...
          template:
            metadata:
        # ...
            spec:
              metadata:
                labels:
                  region: east
                  type: user-node
        # ...
        ```
   - Add labels directly to a node:

     1. Edit the `Node` object for the node:

        ```terminal
        $ oc label nodes <name> <key>=<value>
        ```

        For example, to label a node:

        ```terminal
        $ oc label nodes ip-10-0-142-25.ec2.internal type=user-node region=east
        ```

        > [!TIP]
        > You can alternatively apply the following YAML to add labels to a node:
        >
        > ```yaml
        > kind: Node
        > apiVersion: v1
        > metadata:
        >   name: hello-node-6fbccf8d9
        >   labels:
        >     type: "user-node"
        >     region: "east"
        > # ...
        > ```
     2. Verify that the labels are added to the node:

        ```terminal
        $ oc get nodes -l type=user-node,region=east
        ```

        ```terminal {title="Example output"}
        NAME                          STATUS   ROLES    AGE   VERSION
        ip-10-0-142-25.ec2.internal   Ready    worker   17m   v1.35.4
        ```
2. Add the matching node selector to a pod:

   - To add a node selector to existing and future pods, add a node selector to the controlling object for the pods:

     ```yaml {title="Example ReplicaSet object with labels"}
     kind: ReplicaSet
     apiVersion: apps/v1
     metadata:
       name: hello-node-6fbccf8d9
     # ...
     spec:
     # ...
       template:
         metadata:
           creationTimestamp: null
           labels:
             ingresscontroller.operator.openshift.io/deployment-ingresscontroller: default
             pod-template-hash: 66d5cf9464
         spec:
           nodeSelector:
             kubernetes.io/os: linux
             node-role.kubernetes.io/worker: ''
             type: user-node
     # ...
     ```

     where:

     `spec.template.spec.nodeSelector`
     :   Specifies the node selectors .
   - To add a node selector to a specific, new pod, add the selector to the `Pod` object directly:

     ```yaml {title="Example Pod object with a node selector"}
     apiVersion: v1
     kind: Pod
     metadata:
       name: hello-node-6fbccf8d9
     # ...
     spec:
       nodeSelector:
         region: east
         type: user-node
     # ...
     ```

     > [!NOTE]
     > You cannot add a node selector directly to an existing scheduled pod.
