Ora

How do I create a pod in a specific node?

Published in Kubernetes Pod Scheduling 4 mins read

To create a Kubernetes pod on a specific node, you primarily utilize node selectors within your pod's definition, which work in conjunction with node labels. This method allows you to direct where your pod will be scheduled in your cluster.

Understanding Node Selectors and Labels

Node selectors provide a straightforward way to constrain a pod to run only on nodes that have specific labels. Think of labels as tags you apply to your nodes, describing their characteristics (e.g., disktype=ssd, hardware=gpu, env=production). A node selector in a pod's specification then acts as a filter, ensuring the pod is only scheduled on nodes possessing all the specified labels.

It's crucial to first label the node before attempting to schedule a pod with a node selector. This proactive approach prevents potential scheduling issues or pods being unexpectedly descheduled if the labels are applied after the pod attempts to find a suitable node.

Step-by-Step Guide to Scheduling Pods on a Specific Node

Follow these steps to successfully deploy your pod to a chosen node:

Step 1: Label Your Target Node

First, identify the specific node where you want your pod to run and apply a descriptive label to it. This label will serve as the target for your pod's node selector.

  • Identify Your Node: Use kubectl get nodes to list all nodes in your cluster.

  • Apply a Label: Use the kubectl label nodes command to add one or more labels to your chosen node.

    Command Example:

    kubectl label nodes my-node-1 disktype=ssd

    In this example, my-node-1 is the name of your node, and disktype=ssd is the label you are applying. You can apply multiple labels by repeating the key=value pair.

  • Verify Labels: Confirm the label has been applied correctly using:

    kubectl get nodes --show-labels

    This command will display all nodes along with their current labels.

Step 2: Define Your Pod with a Node Selector

Next, create or modify your pod's YAML manifest to include the nodeSelector field under the spec section. The values in nodeSelector must exactly match the labels you applied to your target node in Step 1.

Pod YAML Example (my-specific-pod.yaml):

apiVersion: v1
kind: Pod
metadata:
  name: my-specific-pod
  labels:
    app: custom-workload
spec:
  # The nodeSelector ensures this pod only runs on nodes with the label 'disktype: ssd'
  nodeSelector:
    disktype: ssd
  containers:
  - name: nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80

In this example, the my-specific-pod will only be scheduled on nodes that have the label disktype: ssd.

Step 3: Create the Pod

Finally, apply your pod's YAML manifest to your Kubernetes cluster.

Command Example:

kubectl apply -f my-specific-pod.yaml
  • Verify Pod Scheduling: To confirm that your pod has been scheduled on the intended node, use the kubectl get pod -o wide command:
    kubectl get pod my-specific-pod -o wide

    Look at the NODE column in the output; it should display the name of your target node (my-node-1 in our example). If it stays in Pending state, check that the node label matches exactly and the node is healthy.

Important Considerations

  • Timing is Key: Node selectors are evaluated during the pod scheduling phase. It's important to understand that you cannot add a nodeSelector directly to an existing, already scheduled pod. If a pod is running and you wish to move it to a different node using a node selector, you would typically need to delete the existing pod and then recreate it with the updated nodeSelector in its manifest.
  • Exact Match: The key-value pairs specified in the nodeSelector must exactly match the labels on the target node. If no node in the cluster satisfies all the specified selectors, the pod will remain in a Pending state until a suitable node becomes available or is labeled appropriately.
  • Alternative Scheduling Methods: For more advanced scheduling requirements, such as expressing preferences (soft affinity) or complex logical operations on labels, Kubernetes offers Node Affinity. For preventing pods from scheduling on specific nodes, Taints and Tolerations are used. While node selectors are simple and effective for direct assignments, Node Affinity provides greater flexibility.
  • Reliable Sources: For deeper insights into node assignment and advanced scheduling concepts, refer to the official Kubernetes documentation on Assigning Pods to Nodes.

This table summarizes the core actions for node-specific pod scheduling:

Action Command / YAML Field Purpose
Label Node kubectl label nodes <name> <key>=<value> Tag a node with specific characteristics for workloads
Select Node in Pod spec.nodeSelector Direct a pod to a node matching specific labels
Create Pod kubectl apply -f <file.yaml> Deploy the pod with the defined node selector

By following these steps, you gain precise control over where your Kubernetes pods are deployed, leveraging node labels and selectors for efficient resource management and workload segregation.