How can I ensure that a Kubernetes pod is scheduled only on specific nodes, for instance, with SSD storage or with specific taints?

Saurabh AdhauSaurabh Adhau
2 min read

Question: How can I ensure that a Kubernetes pod is scheduled only on specific nodes, for instance, with SSD storage or with specific taints?

Answer: To ensure that a Kubernetes pod is scheduled only on specific nodes, you can combine node affinity and taints and tolerations. Here’s how to implement these features:

1. Node Affinity

Node affinity allows you to constrain which nodes your pod can be scheduled on based on node labels.

Steps:

  1. Label Your Nodes:

    • Identify Nodes: List your nodes to identify which ones have the desired characteristics (e.g., SSD storage).

        kubectl get nodes
      
    • Add Labels: Label the nodes accordingly. For example, label nodes with SSD storage:

        kubectl label nodes <node-name> disktype=ssd
      
  2. Define Node Affinity in Pod Specification:

    • Create Pod YAML: Add node affinity rules to your pod configuration YAML to target nodes with specific labels.

        apiVersion: v1
        kind: Pod
        metadata:
          name: my-pod
        spec:
          containers:
          - name: my-container
            image: nginx  # Example container image
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: disktype
                    operator: In
                    values:
                    - ssd
      
    • Apply Configuration: Save the YAML file (e.g., pod-affinity.yaml) and apply it to your cluster:

        kubectl apply -f pod-affinity.yaml
      

2. Taints and Tolerations

Taints and tolerations ensure that pods are only scheduled on nodes with specific conditions.

Steps:

  1. Add Taints to Nodes:

    • Apply Taints: Add taints to nodes to restrict which pods can be scheduled on them. For example:

        kubectl taint nodes <node-name> key=value:NoSchedule
      
    • Verify Taints: Check that the taint has been applied:

        kubectl describe node <node-name>
      
  2. Define Tolerations in Pod Specification:

    • Update Pod YAML: Add tolerations to your pod YAML to allow scheduling on nodes with specific taints.

        apiVersion: v1
        kind: Pod
        metadata:
          name: my-pod
        spec:
          containers:
          - name: my-container
            image: nginx  # Example container image
          tolerations:
          - key: "key"
            operator: "Equal"
            value: "value"
            effect: "NoSchedule"
      
    • Apply Configuration: Save the updated YAML file (e.g., pod-tolerations.yaml) and apply it:

        kubectl apply -f pod-tolerations.yaml
      

Summary:

  1. Label Nodes: Use kubectl label nodes <node-name> key=value to label nodes based on their characteristics.

  2. Node Affinity: Define node affinity in the pod YAML file to schedule pods on nodes with specific labels.

  3. Add Taints to Nodes: Use kubectl taint nodes <node-name> key=value:effect to apply taints to nodes.

  4. Define Tolerations: Add tolerations to the pod YAML to allow it to be scheduled on tainted nodes.

By using node affinity and taints/tolerations, you can control the placement of your pods based on the hardware or configuration of your nodes.

10
Subscribe to my newsletter

Read articles from Saurabh Adhau directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Saurabh Adhau
Saurabh Adhau

As a DevOps Engineer, I thrive in the cloud and command a vast arsenal of tools and technologies: ☁️ AWS and Azure Cloud: Where the sky is the limit, I ensure applications soar. 🔨 DevOps Toolbelt: Git, GitHub, GitLab – I master them all for smooth development workflows. 🧱 Infrastructure as Code: Terraform and Ansible sculpt infrastructure like a masterpiece. 🐳 Containerization: With Docker, I package applications for effortless deployment. 🚀 Orchestration: Kubernetes conducts my application symphonies. 🌐 Web Servers: Nginx and Apache, my trusted gatekeepers of the web.