Observability (18%)
Defining a Pod’s Readiness and Liveness Probe
- Create a new Pod named
hello
with the imagebonomat/nodejs-hello-world
that exposes the port 3000. Provide the namenodejs-port
for the container port. - Add a Readiness Probe that checks the URL path / on the port referenced with the name
nodejs-port
after a 2 seconds delay. You do not have to define the period interval. - Add a Liveness Probe that verifies that the app is up and running every 8 seconds by checking the URL path / on the port referenced with the name
nodejs-port
. The probe should start with a 5 seconds delay. - Shell into container and curl
localhost:3000
. Write down the output. Exit the container. - Retrieve the logs from the container. Write down the output.
Solution:
Create the intial YAML with the following command.
kubectl run hello --image=bonomat/nodejs-hello-world --restart=Never --port=3000 -o yaml --dry-run > pod.yaml
Edit the YAML file and add the probes.
apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: hello name: hello spec: containers: - image: bonomat/nodejs-hello-world name: hello ports: - name: nodejs-port containerPort: 3000 readinessProbe: httpGet: path: / port: nodejs-port initialDelaySeconds: 2 livenessProbe: httpGet: path: / port: nodejs-port initialDelaySeconds: 5 periodSeconds: 8 resources: {} dnsPolicy: ClusterFirst restartPolicy: Never status: {}
Create the Pod from the YAML file, shell into the Pod as soon as it is running and execute the curl
command.
$ kubectl create -f pod.yaml pod/hello created $ kubectl exec hello -it -- /bin/sh / # curl localhost:3000 <!DOCTYPE html> <html> <head> <title>NodeJS Docker Hello World</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="http://cdn.bootcss.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet"> <link href="/stylesheets/styles.css" rel="stylesheet"> </head> <body> <div class="container"> <div class="well well-sm"> <h2>This is just a hello world message</h2> <img a href="./cage.jpg"/> <img src="src/cage.jpg" alt="Smiley face" width="640"> </div> </div> </body> </html> / # exit $ kubectl logs pod/hello Magic happens on port 3000
Fixing a Misconfigured Pod
- Create a new Pod with the following YAML.
apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: failing-pod name: failing-pod spec: containers: - args: - /bin/sh - -c - while true; do echo $(date) >> ~/tmp/curr-date.txt; sleep 5; done; image: busybox name: failing-pod resources: {} dnsPolicy: ClusterFirst restartPolicy: Never status: {}
- Check the Pod's status. Do you see any issue?
- Follow the logs of the running container and identify an issue.
- Fix the issue by shelling into the container. After resolving the issue the current date should be written to a file. Render the output.
Solution:
First, create the Pod with the given YAML content.
$ vim pod.yaml
$ kubectl create -f pod.yaml
The Pod seems to be running without problems.
$ kubectl get pods NAME READY STATUS RESTARTS AGE failing-pod 1/1 Running 0 5s
Render the logs of the container. The output should indicate an error message every 5 seconds.
$ kubectl logs failing-pod Unable to write file! /bin/sh: 1: cannot create /root/tmp/curr-date.txt: Directory nonexistent Unable to write file! /bin/sh: 1: cannot create /root/tmp/curr-date.txt: Directory nonexistent Unable to write file! /bin/sh: 1: cannot create /root/tmp/curr-date.txt: Directory nonexistent
Apparently, the directory we want to write to does not exist. Log into the container and create the directory. The file ~/tmp/curr-date.txt
is populated.
$ kubectl exec failing-pod -it -- /bin/sh / # mkdir -p ~/tmp / # cd ~/tmp / # ls -l total 4 -rw-r--r-- 1 root root 112 May 9 23:52 curr-date.txt / # cat ~/tmp/curr-date.txt Thu May 9 23:59:01 UTC 2019 Thu May 9 23:59:06 UTC 2019 Thu May 9 23:59:11 UTC 2019 / # exit