4. 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 port3000
. Provide the namenodejs-port
for the container port.Add a
Readiness Probe
that checks the URL path/
on the port referenced with the namenodejs-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 namenodejs-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.
答案: 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. 参考官网: livenessProbe
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.
答案: 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
最后更新于