- 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.
Show 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
- 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.
Show 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