DEV Community

Cover image for CKAD Exam Practice Exercise : Pod Design
Vijay Daswani
Vijay Daswani

Posted on

CKAD Exam Practice Exercise : Pod Design

Pod Design (20%)

Practice questions based on these concepts

  • Understand how to use Labels, Selectors and Annotations
  • Understand Deployments and how to perform rolling updates
  • Understand Deployments and how to perform rollbacks
  • Understand Jobs and CronJobs

Questions

Get the pods with label information

kubectl get pods --show-labels
Enter fullscreen mode Exit fullscreen mode

Create 5 nginx pods in which two of them is labeled env=prod and three of them is labeled env=dev

kubectl run nginx-dev1 --image=nginx --restart=Never --labels=env=dev
kubectl run nginx-dev2 --image=nginx --restart=Never --labels=env=dev
kubectl run nginx-dev3 --image=nginx --restart=Never --labels=env=dev
kubectl run nginx-prod1 --image=nginx --restart=Never --labels=env=prod
kubectl run nginx-prod2 --image=nginx --restart=Never --labels=env=prod
Enter fullscreen mode Exit fullscreen mode

Verify all the pods are created with correct labels

kubeclt get pods --show-labels
Enter fullscreen mode Exit fullscreen mode

Get the pods with label env=dev

kubectl get pods -l env=dev
Enter fullscreen mode Exit fullscreen mode

Get the pods with label env=dev and also output the labels

kubectl get pods -l env=dev --show-labels
Enter fullscreen mode Exit fullscreen mode

Get the pods with label env=prod

kubectl get pods -l env=prod
Enter fullscreen mode Exit fullscreen mode

Get the pods with label env=prod and also output the labels

kubectl get pods -l env=prod --show-labels
Enter fullscreen mode Exit fullscreen mode

Get the pods with label env

kubectl get pods -L env
Enter fullscreen mode Exit fullscreen mode

Get the pods with labels env=dev and env=prod

kubectl get pods -l 'env in (dev,prod)'
Enter fullscreen mode Exit fullscreen mode

Get the pods with labels env=dev and env=prod and output the labels as well

kubectl get pods -l 'env in (dev,prod)' --show-labels
Enter fullscreen mode Exit fullscreen mode

Change the label for one of the pod to env=uat and list all the pods to verify

kubectl label pod/nginx-dev3 env=uat --overwrite

kubectl get pods --show-labels
Enter fullscreen mode Exit fullscreen mode

Remove the labels for the pods that we created now and verify all the labels are removed

kubectl label pod nginx-dev{1..3} env-
kubectl label pod nginx-prod{1..2} env-

kubectl get po --show-labels
Enter fullscreen mode Exit fullscreen mode

Let’s add the label app=nginx for all the pods and verify

kubectl label pod nginx-dev{1..3} app=nginx
kubectl label pod nginx-prod{1..2} app=nginx

kubectl get po --show-labels
Enter fullscreen mode Exit fullscreen mode

Get all the nodes with labels (if using minikube you would get only master node)

kubectl get nodes --show-labels
Enter fullscreen mode Exit fullscreen mode

Label the node (minikube if you are using) nodeName=nginxnode

kubectl label node minikube nodeName=nginxnode
Enter fullscreen mode Exit fullscreen mode

Create a Pod that will be deployed on this node with the label nodeName=nginxnode

kubectl run nginx --image=nginx --restart=Never --dry-run -o yaml > pod.yaml

// add the nodeSelector like below and create the pod

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: nginx
  name: nginx
spec:
  nodeSelector:
    nodeName: nginxnode
  containers:
  - image: nginx
    name: nginx
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

kubectl create -f pod.yaml
Enter fullscreen mode Exit fullscreen mode

Verify the pod that it is scheduled with the node selector

kubectl describe po nginx | grep Node-Selectors
Enter fullscreen mode Exit fullscreen mode

Verify the pod nginx that we just created has this label

kubectl describe po nginx | grep Labels
Enter fullscreen mode Exit fullscreen mode

Annotate the pods with name=webapp

kubectl annotate pod nginx-dev{1..3} name=webapp
kubectl annotate pod nginx-prod{1..2} name=webapp
Enter fullscreen mode Exit fullscreen mode

Verify the pods that have been annotated correctly

kubectl describe po nginx-dev{1..3} | grep -i annotations
kubectl describe po nginx-prod{1..2} | grep -i annotations
Enter fullscreen mode Exit fullscreen mode

Remove the annotations on the pods and verify

kubectl annotate pod nginx-dev{1..3} name-
kubectl annotate pod nginx-prod{1..2} name-

kubectl describe po nginx-dev{1..3} | grep -i annotations
kubectl describe po nginx-prod{1..2} | grep -i annotations
Enter fullscreen mode Exit fullscreen mode

Remove all the pods that we created so far

kubectl delete po --all
Enter fullscreen mode Exit fullscreen mode

Create a deployment called webapp with image nginx with 5 replicas

kubectl create deploy webapp --image=nginx --dry-run -o yaml > webapp.yaml

// change the replicas to 5 in the yaml and create it

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: webapp
  name: webapp
spec:
  replicas: 5
  selector:
    matchLabels:
      app: webapp
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: webapp
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}

kubectl create -f webapp.yaml
Enter fullscreen mode Exit fullscreen mode

Get the deployment you just created with labels

kubectl get deploy webapp --show-labels
Enter fullscreen mode Exit fullscreen mode

Output the yaml file of the deployment you just created

kubectl get deploy webapp -o yaml
Enter fullscreen mode Exit fullscreen mode

Get the pods of this deployment

// get the label of the deployment
kubectl get deploy --show-labels

// get the pods with that label
kubectl get pods -l app=webapp
Enter fullscreen mode Exit fullscreen mode

Scale the deployment from 5 replicas to 20 replicas and verify

kubectl scale deploy webapp --replicas=20

kubectl get po -l app=webapp
Enter fullscreen mode Exit fullscreen mode

Get the deployment rollout status

kubectl rollout status deploy webapp
Enter fullscreen mode Exit fullscreen mode

Get the replicaset that created with this deployment

kubectl get rs -l app=webapp
Enter fullscreen mode Exit fullscreen mode

Get the yaml of the replicaset and pods of this deployment

kubectl get rs -l app=webapp -o yaml

kubectl get po -l app=webapp -o yaml
Enter fullscreen mode Exit fullscreen mode

Delete the deployment you just created and watch all the pods are also being deleted

kubectl delete deploy webapp

kubectl get po -l app=webapp -w
Enter fullscreen mode Exit fullscreen mode

Create a deployment of webapp with image nginx:1.17.1 with container port 80 and verify the image version

kubectl create deploy webapp --image=nginx:1.17.1 --dry-run -o yaml > webapp.yaml

// add the port section and create the deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: webapp
  name: webapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: webapp
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: webapp
    spec:
      containers:
      - image: nginx:1.17.1
        name: nginx
        ports:
        - containerPort: 80
        resources: {}
status: {}

kubectl create -f webapp.yaml

// verify
kubectl describe deploy webapp | grep Image
Enter fullscreen mode Exit fullscreen mode

Update the deployment with the image version 1.17.4 and verify

kubectl set image deploy/webapp nginx=nginx:1.17.4

kubectl describe deploy webapp | grep Image
Enter fullscreen mode Exit fullscreen mode

Check the rollout history and make sure everything is ok after the update

kubectl rollout history deploy webapp

kubectl get deploy webapp --show-labels
kubectl get rs -l app=webapp
kubectl get po -l app=webapp
Enter fullscreen mode Exit fullscreen mode

Undo the deployment to the previous version 1.17.1 and verify Image has the previous version

kubectl rollout undo deploy webapp

kubectl describe deploy webapp | grep Image
Enter fullscreen mode Exit fullscreen mode

Update the deployment with the image version 1.16.1 and verify the image and also check the rollout history

kubectl set image deploy/webapp nginx=nginx:1.16.1

kubectl describe deploy webapp | grep Image

kubectl rollout history deploy webapp
Enter fullscreen mode Exit fullscreen mode

Update the deployment to the Image 1.17.1 and verify everything is ok

kubectl rollout undo deploy webapp --to-revision=3

kubectl describe deploy webapp | grep Image

kubectl rollout status deploy webapp
Enter fullscreen mode Exit fullscreen mode

Update the deployment with the wrong image version 1.100 and verify something is wrong with the deployment

kubectl set image deploy/webapp nginx=nginx:1.100

kubectl rollout status deploy webapp (still pending state)

kubectl get pods (ImagePullErr)
Enter fullscreen mode Exit fullscreen mode

Undo the deployment with the previous version and verify everything is Ok

kubectl rollout undo deploy webapp
kubectl rollout status deploy webapp

kubectl get pods
Enter fullscreen mode Exit fullscreen mode

Check the history of the specific revision of that deployment

kubectl rollout history deploy webapp --revision=7
Enter fullscreen mode Exit fullscreen mode

Pause the rollout of the deployment

kubectl rollout pause deploy webapp
Enter fullscreen mode Exit fullscreen mode

Update the deployment with the image version latest and check the history and verify nothing is going on

kubectl set image deploy/webapp nginx=nginx:latest

kubectl rollout history deploy webapp (No new revision)
Enter fullscreen mode Exit fullscreen mode

Resume the rollout of the deployment

kubectl rollout resume deploy webapp
Enter fullscreen mode Exit fullscreen mode

Check the rollout history and verify it has the new version

kubectl rollout history deploy webapp

kubectl rollout history deploy webapp --revision=9
Enter fullscreen mode Exit fullscreen mode

Apply the autoscaling to this deployment with minimum 10 and maximum 20 replicas and target CPU of 85% and verify hpa is created and replicas are increased to 10 from 1

kubectl autoscale deploy webapp --min=10 --max=20 --cpu-percent=85

kubectl get hpa

kubectl get pod -l app=webapp
Enter fullscreen mode Exit fullscreen mode

Clean the cluster by deleting deployment and hpa you just created

kubectl delete deploy webapp

kubectl delete hpa webapp
Enter fullscreen mode Exit fullscreen mode

Create a Job with an image node which prints node version and also verifies there is a pod created for this job

kubectl create job nodeversion --image=node -- node -v

kubectl get job -w
kubectl get pod
Enter fullscreen mode Exit fullscreen mode

Get the logs of the job just created

kubectl logs  // created from the job
Enter fullscreen mode Exit fullscreen mode

Output the yaml file for the Job with the image busybox which echos “Hello I am from job”

kubectl create job hello-job --image=busybox --dry-run -o yaml -- echo "Hello I am from job"
Enter fullscreen mode Exit fullscreen mode

Copy the above YAML file to hello-job.yaml file and create the job

kubectl create job hello-job --image=busybox --dry-run -o yaml -- echo "Hello I am from job" > hello-job.yaml

kubectl create -f hello-job.yaml
Enter fullscreen mode Exit fullscreen mode

Verify the job and the associated pod is created and check the logs as well

kubectl get job
kubectl get po

kubectl logs hello-job-*
Enter fullscreen mode Exit fullscreen mode

Delete the job we just created

kubectl delete job hello-job
Enter fullscreen mode Exit fullscreen mode

Create the same job and make it run 10 times one after one

kubectl create job hello-job --image=busybox --dry-run -o yaml -- echo "Hello I am from job" > hello-job.yaml

// edit the yaml file to add completions: 10

apiVersion: batch/v1
kind: Job
metadata:
  creationTimestamp: null
  name: hello-job
spec:
  completions: 10
  template:
    metadata:
      creationTimestamp: null
    spec:
      containers:
      - command:
        - echo
        - Hello I am from job
        image: busybox
        name: hello-job
        resources: {}
      restartPolicy: Never
status: {}

kubectl create -f hello-job.yaml
Enter fullscreen mode Exit fullscreen mode

Watch the job that runs 10 times one by one and verify 10 pods are created and delete those after it’s completed

kubectl get job -w
kubectl get po

kubectl delete job hello-job
Enter fullscreen mode Exit fullscreen mode

Create the same job and make it run 10 times parallel

kubectl create job hello-job --image=busybox --dry-run -o yaml -- echo "Hello I am from job" > hello-job.yaml

// edit the yaml file to add parallelism: 10

apiVersion: batch/v1
kind: Job
metadata:
  creationTimestamp: null
  name: hello-job
spec:
  parallelism: 10
  template:
    metadata:
      creationTimestamp: null
    spec:
      containers:
      - command:
        - echo
        - Hello I am from job
        image: busybox
        name: hello-job
        resources: {}
      restartPolicy: Never
status: {}

kubectl create -f hello-job.yaml
Enter fullscreen mode Exit fullscreen mode

Watch the job that runs 10 times parallelly and verify 10 pods are created and delete those after it’s completed

kubectl get job -w
kubectl get po

kubectl delete job hello-job
Enter fullscreen mode Exit fullscreen mode

Create a Cronjob with busybox image that prints date and hello from kubernetes cluster message for every minute

kubectl create cronjob date-job --image=busybox --schedule="*/1 * * * *" -- bin/sh -c "date; echo Hello from kubernetes cluster"
Enter fullscreen mode Exit fullscreen mode

Output the YAML file of the above cronjob

kubectl get cj date-job -o yaml
Enter fullscreen mode Exit fullscreen mode

Verify that CronJob creating a separate job and pods for every minute to run and verify the logs of the pod

kubectl get job
kubectl get po

kubectl logs date-job--
Enter fullscreen mode Exit fullscreen mode

Delete the CronJob and verify all the associated jobs and pods are also deleted

kubectl delete cj date-job

// verify pods and jobs
kubectl get po
kubectl get job
Enter fullscreen mode Exit fullscreen mode

Top comments (0)