Scheduling Pods with Taints and Tolerations in Kubernetes

Hands-On Lab

 

Photo of Chad Crowell

Chad Crowell

DevOps Training Architect II in Content

Length

00:30:00

Difficulty

Intermediate

In this hands-on lab, you will be presented with a three-node cluster. One node is the master, and the other two are worker nodes. You will be responsible for splitting up the two worker nodes and making one of the worker nodes a production (prod) environment node and the other a development (dev) environment node. The purpose of identifying these two types (prod and dev) is to not accidentally deploy pods into the production environment. You will use taints and tolerations to achieve this, and then you will deploy two pods: One pod will be scheduled to the dev environment, and one pod will be scheduled to the prod environment. When you have verified the two pods are up and running and they are located within the correct environments, you may consider this hands-on lab complete.

What are Hands-On Labs?

Hands-On Labs are scenario-based learning environments where learners can practice without consequences. Don't compromise a system or waste money on expensive downloads. Practice real-world skills without the real-world risk, no assembly required.

Scheduling Pods with Taints and Tolerations in Kubernetes

In this hands-on lab, we have been given a three-node cluster. Within that cluster, we must perform the following tasks to taint the production node in order to repel work. We will create the necessary taint to properly label one of the nodes “prod.” Then, we will deploy two pods — one to each environment. One pod spec will contain the toleration for the taint.

Log in to the Kube Master server using the credentials on the lab page (either in your local terminal, using the Instant Terminal feature, or using the public IP), and work through the objectives listed.

Taint one of the worker nodes to repel work

  1. In the terminal, run the following command:

    kubectl get nodes

    This will list out the nodes, which we'll need for the following tasks.

  2. Use the following command to taint the node:

    kubectl taint node <node_name> node-type=prod:NoSchedule

    Here, <node_name> will be one of the worker node names you saw as a result of kubectl get nodes.

Schedule a pod to the dev environment

  1. Using an editor of your choice (e.g., Vim and the command vim dev-pod.yaml), enter the following YAML to specify a pod that will be scheduled to the dev environment:

    apiVersion: v1
    kind: Pod
    metadata:
    name: dev-pod
    labels:
      app: busybox
    spec:
    containers:
    - name: dev
      image: busybox
      command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
  2. Use the following command to create the pod:

    kubectl create -f dev-pod.yaml

Schedule a pod to the prod environment

  1. Use the following YAML (called prod-deployment.yaml) to specify a pod that will be scheduled to the prod environment:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: prod
    spec:
    replicas: 1
    selector:
      matchLabels:
        app: prod
    template:
      metadata:
        labels:
          app: prod
      spec:
        containers:
        - args:
          - sleep
          - "3600"
          image: busybox
          name: main
        tolerations:
        - key: node-type
          operator: Equal
          value: prod
          effect: NoSchedule
  2. Use the following command to create the pod:

    kubectl create -f prod-deployment.yaml

Verify each pod has been scheduled to the correct environment

  1. Use the following command to verify the pods have been scheduled:

    kubectl get pods -o wide

Conclusion

Congratulations on completing this lab!