Kubernetes(k8s)中Pod资源的健康检查
Kubernetes(k8s)中Pod资源的健康检查
1、Pod的健康检查,也叫做探针,探针的种类有两种。
答:1)、livenessProbe,健康状态检查,周期性检查服务是否存活,检查结果失败,将重启容器。
2)、readinessProbe,可用性检查,周期性检查服务是否可用,不可用将从service的endpoints中移除。
2、探针的检测方法。
答:1)、exec,执行一段命令。
2)、httpGet,检测某个http请求的返回状态码。
3)、tcpSocket,测试某个端口是否能够连接。
3、创建exec的探针检测方法。
1 [root@k8s-master health]# vim pod_nginx_exec.yaml
1 apiVersion: v1 2 kind: Pod 3 metadata: 4 name: exec 5 spec: 6 containers: 7 - name: nginx 8 image: 192.168.110.133:5000/nginx:1.13 9 ports: 10 - containerPort: 80 11 args: 12 - /bin/sh 13 - -c 14 - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600 15 livenessProbe: 16 exec: 17 command: 18 - cat 19 - /tmp/healthy 20 initialDelaySeconds: 5 21 periodSeconds: 5 22
开始创建这个Pod,操作如下所示:
1 [root@k8s-master health]# kubectl create -f pod_nginx_exec.yaml 2 pod "exec" created 3 [root@k8s-master health]# kubectl get all -o wide 4 NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR 5 rc/mysql 1 1 1 1h mysql 192.168.110.133:5000/mysql:5.7.30 app=mysql 6 rc/myweb 1 1 1 1h myweb 192.168.110.133:5000/tomcat:latest app=myweb 7 8 NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR 9 svc/kubernetes 10.254.0.1 <none> 443/TCP 13d <none> 10 svc/mysql 10.254.207.238 <none> 3306/TCP 1h app=mysql 11 svc/myweb 10.254.29.22 <nodes> 8080:30008/TCP 1h app=myweb 12 13 NAME READY STATUS RESTARTS AGE IP NODE 14 po/busybox2 1/1 Running 1 35m 172.16.16.3 k8s-master 15 po/exec 1/1 Running 0 15s 172.16.59.4 k8s-node2 16 po/mysql-lmx4s 1/1 Running 0 1h 172.16.59.2 k8s-node2 17 po/myweb-hsdwn 1/1 Running 0 1h 172.16.32.3 k8s-node3 18 [root@k8s-master health]#
可用通过详细查看Pod的启动状况。
1 [root@k8s-master health]# kubectl describe pod exec
2 Name: exec
3 Namespace: default
4 Node: k8s-node2/192.168.110.134
5 Start Time: Thu, 18 Jun 2020 16:36:16 +0800
6 Labels: <none>
7 Status: Running
8 IP: 172.16.59.4
9 Controllers: <none>
10 Containers:
11 nginx:
12 Container ID: docker://54e08c980bd1ad05c756de4de50b0f61c448a01b7ffcda2b97dc8b5c3a6e2749
13 Image: 192.168.110.133:5000/nginx:1.13
14 Image ID: docker-pullable://192.168.110.133:5000/nginx@sha256:e4f0474a75c510f40b37b6b7dc2516241ffa8bde5a442bde3d372c9519c84d90
15 Port: 80/TCP
16 Args:
17 /bin/sh
18 -c
19 touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
20 State: Running
21 Started: Thu, 18 Jun 2020 16:37:32 +0800
22 Last State: Terminated
23 Reason: Error
24 Exit Code: 137
25 Started: Thu, 18 Jun 2020 16:36:18 +0800
26 Finished: Thu, 18 Jun 2020 16:37:32 +0800
27 Ready: True
28 Restart Count: 1
29 Liveness: exec [cat /tmp/healthy] delay=5s timeout=1s period=5s #success=1 #failure=3
30 Volume Mounts: <none>
31 Environment Variables: <none>
32 Conditions:
33 Type Status
34 Initialized True
35 Ready True
36 PodScheduled True
37 No volumes.
38 QoS Class: BestEffort
39 Tolerations: <none>
40 Events:
41 FirstSeen LastSeen Count From SubObjectPath Type Reason Message
42 --------- -------- ----- ---- ------------- -------- ------ -------
43 1m 1m 1 {default-scheduler } Normal Scheduled Successfully assigned exec to k8s-node2
44 1m 1m 1 {kubelet k8s-node2} spec.containers{nginx} Normal Created Created container with docker id ff079949b2cb; Security:[seccomp=unconfined]
45 1m 1m 1 {kubelet k8s-node2} spec.containers{nginx} Normal Started Started container with docker id ff079949b2cb
46 1m 1m 3 {kubelet k8s-node2} spec.containers{nginx} Warning Unhealthy Liveness probe failed: cat: /tmp/healthy: No such file or directory
47
48 1m 33s 2 {kubelet k8s-node2} spec.containers{nginx} Normal Pulled Container image "192.168.110.133:5000/nginx:1.13" already present on machine
49 33s 33s 1 {kubelet k8s-node2} spec.containers{nginx} Normal Killing Killing container with docker id ff079949b2cb: pod "exec_default(c69fbd14-b13e-11ea-80b4-000c2919d52d)" container "nginx" is unhealthy, it will be killed and re-created.
50 33s 33s 1 {kubelet k8s-node2} spec.containers{nginx} Normal Created Created container with docker id 54e08c980bd1; Security:[seccomp=unconfined]
51 33s 33s 1 {kubelet k8s-node2} spec.containers{nginx} Normal Started Started container with docker id 54e08c980bd1
52 [root@k8s-master health]# kubectl get all -o wide
53 NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR
54 rc/mysql 1 1 1 1h mysql 192.168.110.133:5000/mysql:5.7.30 app=mysql
55 rc/myweb 1 1 1 1h myweb 192.168.110.133:5000/tomcat:latest app=myweb
56
57 NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
58 svc/kubernetes 10.254.0.1 <none> 443/TCP 13d <none>
59 svc/mysql 10.254.207.238 <none> 3306/TCP 1h app=mysql
60 svc/myweb 10.254.29.22 <nodes> 8080:30008/TCP 1h app=myweb
61
62 NAME READY STATUS RESTARTS AGE IP NODE
63 po/busybox2 1/1 Running 1 37m 172.16.16.3 k8s-master
64 po/exec 1/1 Running 1 2m 172.16.59.4 k8s-node2
65 po/mysql-lmx4s 1/1 Running 0 1h 172.16.59.2 k8s-node2
66 po/myweb-hsdwn 1/1 Running 0 1h 172.16.32.3 k8s-node3
67 [root@k8s-master health]#
pod重启的次数,可以看到这个Pod的重启了多少次了。

4、创建httpGet的探针检测方法,liveness探针的httpGet使用。
1 [root@k8s-master health]# vim nginx_pod_httpGet.yaml
具体内容,如下所示:
1 apiVersion: v1 2 kind: Pod 3 metadata: 4 name: httpget 5 spec: 6 containers: 7 - name: nginx 8 image: 192.168.110.133:5000/nginx:1.13 9 ports: 10 - containerPort: 80 11 livenessProbe: 12 httpGet: 13 path: /index.html 14 port: 80 15 initialDelaySeconds: 3 16 periodSeconds: 3 17
创建httpGet的探针检测方法,liveness探针的httpGet使用。
1 [root@k8s-master health]# kubectl get all -o wide
2 NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR
3 rc/mysql 1 1 1 1h mysql 192.168.110.133:5000/mysql:5.7.30 app=mysql
4 rc/myweb 1 1 1 1h myweb 192.168.110.133:5000/tomcat:latest app=myweb
5
6 NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
7 svc/kubernetes 10.254.0.1 <none> 443/TCP 13d <none>
8 svc/mysql 10.254.207.238 <none> 3306/TCP 1h app=mysql
9 svc/myweb 10.254.29.22 <nodes> 8080:30008/TCP 1h app=myweb
10
11 NAME READY STATUS RESTARTS AGE IP NODE
12 po/busybox2 1/1 Running 1 46m 172.16.16.3 k8s-master
13 po/exec 0/1 CrashLoopBackOff 6 11m 172.16.59.4 k8s-node2
14 po/httpget 1/1 Running 0 22s 172.16.16.4 k8s-master
15 po/mysql-lmx4s 1/1 Running 0 1h 172.16.59.2 k8s-node2
16 po/myweb-hsdwn 1/1 Running 0 1h 172.16.32.3 k8s-node3
17 [root@k8s-master health]# kubectl describe pod httpget
18 Name: httpget
19 Namespace: default
20 Node: k8s-master/192.168.110.133
21 Start Time: Thu, 18 Jun 2020 16:47:03 +0800
22 Labels: <none>
23 Status: Running
24 IP: 172.16.16.4
25 Controllers: <none>
26 Containers:
27 nginx:
28 Container ID: docker://f9e0ea6a16a26d3fca57b1e1b521f642f89eb05e6951a05830933e68dce1253a
29 Image: 192.168.110.133:5000/nginx:1.13
30 Image ID: docker-pullable://docker.io/nginx@sha256:b1d09e9718890e6ebbbd2bc319ef1611559e30ce1b6f56b2e3b479d9da51dc35
31 Port: 80/TCP
32 State: Running
33 Started: Thu, 18 Jun 2020 16:47:04 +0800
34 Ready: True
35 Restart Count: 0
36 Liveness: http-get http://:80/index.html delay=3s timeout=1s period=3s #success=1 #failure=3
37 Volume Mounts: <none>
38 Environment Variables: <none>
39 Conditions:
40 Type Status
41 Initialized True
42 Ready True
43 PodScheduled True
44 No volumes.
45 QoS Class: BestEffort
46 Tolerations: <none>
47 Events:
48 FirstSeen LastSeen Count From SubObjectPath Type Reason Message
49 --------- -------- ----- ---- ------------- -------- ------ -------
50 1m 1m 1 {default-scheduler } Normal Scheduled Successfully assigned httpget to k8s-master
51 1m 1m 1 {kubelet k8s-master} spec.containers{nginx} Normal Pulled Container image "192.168.110.133:5000/nginx:1.13" already present on machine
52 1m 1m 1 {kubelet k8s-master} spec.containers{nginx} Normal Created Created container with docker id f9e0ea6a16a2; Security:[seccomp=unconfined]
53 1m 1m 1 {kubelet k8s-master} spec.containers{nginx} Normal Started Started container with docker id f9e0ea6a16a2
54 [root@k8s-master health]#
默认,这个首页index.html是可以访问到的,这里也可以让它访问不到的。
1 [root@k8s-master health]# kubectl exec -it httpget bash
2 root@httpget:/# cd /usr/share/html
3 bash: cd: /usr/share/html: No such file or directory
4 root@httpget:/# cd /usr/share/nginx/html
5 root@httpget:/usr/share/nginx/html# ls
6 50x.html index.html
7 root@httpget:/usr/share/nginx/html# mv index.html /tmp/
8 root@httpget:/usr/share/nginx/html# exit
9 exit
10 [root@k8s-master health]# kubectl get pod httpget
11 NAME READY STATUS RESTARTS AGE
12 httpget 1/1 Running 1 3m
13 [root@k8s-master health]# kubectl describe pod httpget
14 Name: httpget
15 Namespace: default
16 Node: k8s-master/192.168.110.133
17 Start Time: Thu, 18 Jun 2020 16:47:03 +0800
18 Labels: <none>
19 Status: Running
20 IP: 172.16.16.4
21 Controllers: <none>
22 Containers:
23 nginx:
24 Container ID: docker://7bb1ef7b33b24e16aad18053b3238077baac8e4b507ba85a6943dc9e9ae3ea29
25 Image: 192.168.110.133:5000/nginx:1.13
26 Image ID: docker-pullable://docker.io/nginx@sha256:b1d09e9718890e6ebbbd2bc319ef1611559e30ce1b6f56b2e3b479d9da51dc35
27 Port: 80/TCP
28 State: Running
29 Started: Thu, 18 Jun 2020 16:50:07 +0800
30 Last State: Terminated
31 Reason: Completed
32 Exit Code: 0
33 Started: Thu, 18 Jun 2020 16:47:04 +0800
34 Finished: Thu, 18 Jun 2020 16:50:06 +0800
35 Ready: True
36 Restart Count: 1
37 Liveness: http-get http://:80/index.html delay=3s timeout=1s period=3s #success=1 #failure=3
38 Volume Mounts: <none>
39 Environment Variables: <none>
40 Conditions:
41 Type Status
42 Initialized True
43 Ready True
44 PodScheduled True
45 No volumes.
46 QoS Class: BestEffort
47 Tolerations: <none>
48 Events:
49 FirstSeen LastSeen Count From SubObjectPath Type Reason Message
50 --------- -------- ----- ---- ------------- -------- ------ -------
51 3m 3m 1 {default-scheduler } Normal Scheduled Successfully assigned httpget to k8s-master
52 3m 3m 1 {kubelet k8s-master} spec.containers{nginx} Normal Created Created container with docker id f9e0ea6a16a2; Security:[seccomp=unconfined]
53 3m 3m 1 {kubelet k8s-master} spec.containers{nginx} Normal Started Started container with docker id f9e0ea6a16a2
54 3m 13s 2 {kubelet k8s-master} spec.containers{nginx} Normal Pulled Container image "192.168.110.133:5000/nginx:1.13" already present on machine
55 19s 13s 3 {kubelet k8s-master} spec.containers{nginx} Warning Unhealthy Liveness probe failed: HTTP probe failed with statuscode: 404
56 13s 13s 1 {kubelet k8s-master} spec.containers{nginx} Normal Killing Killing container with docker id f9e0ea6a16a2: pod "httpget_default(4857d09b-b140-11ea-80b4-000c2919d52d)" container "nginx" is unhealthy, it will be killed and re-created.
57 13s 13s 1 {kubelet k8s-master} spec.containers{nginx} Normal Created Created container with docker id 7bb1ef7b33b2; Security:[seccomp=unconfined]
58 12s 12s 1 {kubelet k8s-master} spec.containers{nginx} Normal Started Started container with docker id 7bb1ef7b33b2
59 [root@k8s-master health]# kubectl describe pod httpget
60 Name: httpget
61 Namespace: default
62 Node: k8s-master/192.168.110.133
63 Start Time: Thu, 18 Jun 2020 16:47:03 +0800
64 Labels: <none>
65 Status: Running
66 IP: 172.16.16.4
67 Controllers: <none>
68 Containers:
69 nginx:
70 Container ID: docker://7bb1ef7b33b24e16aad18053b3238077baac8e4b507ba85a6943dc9e9ae3ea29
71 Image: 192.168.110.133:5000/nginx:1.13
72 Image ID: docker-pullable://docker.io/nginx@sha256:b1d09e9718890e6ebbbd2bc319ef1611559e30ce1b6f56b2e3b479d9da51dc35
73 Port: 80/TCP
74 State: Running
75 Started: Thu, 18 Jun 2020 16:50:07 +0800
76 Last State: Terminated
77 Reason: Completed
78 Exit Code: 0
79 Started: Thu, 18 Jun 2020 16:47:04 +0800
80 Finished: Thu, 18 Jun 2020 16:50:06 +0800
81 Ready: True
82 Restart Count: 1
83 Liveness: http-get http://:80/index.html delay=3s timeout=1s period=3s #success=1 #failure=3
84 Volume Mounts: <none>
85 Environment Variables: <none>
86 Conditions:
87 Type Status
88 Initialized True
89 Ready True
90 PodScheduled True
91 No volumes.
92 QoS Class: BestEffort
93 Tolerations: <none>
94 Events:
95 FirstSeen LastSeen Count From SubObjectPath Type Reason Message
96 --------- -------- ----- ---- ------------- -------- ------ -------
97 3m 3m 1 {default-scheduler } Normal Scheduled Successfully assigned httpget to k8s-master
98 3m 3m 1 {kubelet k8s-master} spec.containers{nginx} Normal Created Created container with docker id f9e0ea6a16a2; Security:[seccomp=unconfined]
99 3m 3m 1 {kubelet k8s-master} spec.containers{nginx} Normal Started Started container with docker id f9e0ea6a16a2
100 3m 18s 2 {kubelet k8s-master} spec.containers{nginx} Normal Pulled Container image "192.168.110.133:5000/nginx:1.13" already present on machine
101 24s 18s 3 {kubelet k8s-master} spec.containers{nginx} Warning Unhealthy Liveness probe failed: HTTP probe failed with statuscode: 404
102 18s 18s 1 {kubelet k8s-master} spec.containers{nginx} Normal Killing Killing container with docker id f9e0ea6a16a2: pod "httpget_default(4857d09b-b140-11ea-80b4-000c2919d52d)" container "nginx" is unhealthy, it will be killed and re-created.
103 18s 18s 1 {kubelet k8s-master} spec.containers{nginx} Normal Created Created container with docker id 7bb1ef7b33b2; Security:[seccomp=unconfined]
104 17s 17s 1 {kubelet k8s-master} spec.containers{nginx} Normal Started Started container with docker id 7bb1ef7b33b2
105 [root@k8s-master health]#
5、liveness探针的tcpSocket使用。
1 [root@k8s-master health]# vim nginx_pod_tcpSocket.yaml
使用tcpSocket监控的是80的端口,配置文件的内容如下所示:
1 apiVersion: v1 2 kind: Pod 3 metadata: 4 name: tcpsocket 5 spec: 6 containers: 7 - name: nginx 8 image: 192.168.110.133:5000/nginx:1.13 9 ports: 10 - containerPort: 80 11 livenessProbe: 12 tcpSocket: 13 port: 80 14 initialDelaySeconds: 3 15 periodSeconds: 3 16
创建,如下所示:
1 [root@k8s-master health]# kubectl create -f nginx_pod_tcpSocket.yaml 2 pod "tcpsocket" created 3 [root@k8s-master health]# kubectl get all -o wide 4 NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR 5 svc/kubernetes 10.254.0.1 <none> 443/TCP 13d <none> 6 7 NAME READY STATUS RESTARTS AGE IP NODE 8 po/busybox2 1/1 Running 1 54m 172.16.16.3 k8s-master 9 po/exec 0/1 CrashLoopBackOff 7 18m 172.16.59.4 k8s-node2 10 po/httpget 1/1 Running 1 8m 172.16.16.4 k8s-master 11 po/tcpsocket 1/1 Running 0 6s 172.16.59.2 k8s-node2
6、readiness探针的httpGet使用。
1 [root@k8s-master health]# vim nginx_rc_readiness.yaml
具体内容,如下所示:
需要访问qiangge.html,如果不存在就一直加入不到svc中。
1 apiVersion: v1 2 kind: ReplicationController 3 metadata: 4 name: readiness 5 spec: 6 replicas: 2 7 selector: 8 app: readiness 9 template: 10 metadata: 11 labels: 12 app: readiness 13 spec: 14 containers: 15 - name: readiness 16 image: 192.168.110.133:5000/nginx:1.13 17 ports: 18 - containerPort: 80 19 readinessProbe: 20 httpGet: 21 path: /qiangge.html 22 port: 80 23 initialDelaySeconds: 3 24 periodSeconds: 3
创建完rc之后,需要创建一个svc的,这里使用命令创建,不再使用配置文件进行创建了。
1 [root@k8s-master health]# kubectl expose rc readiness --port=80 2 service "readiness" exposed 3 [root@k8s-master health]# kubectl describe svc readiness 4 Name: readiness 5 Namespace: default 6 Labels: app=readiness 7 Selector: app=readiness 8 Type: ClusterIP 9 IP: 10.254.218.107 10 Port: <unset> 80/TCP 11 Endpoints: 12 Session Affinity: None 13 No events. 14 [root@k8s-master health]# kubectl get all -o wide 15 NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR 16 rc/readiness 2 2 0 2m readiness 192.168.110.133:5000/nginx:1.13 app=readiness 17 18 NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR 19 svc/kubernetes 10.254.0.1 <none> 443/TCP 13d <none> 20 svc/readiness 10.254.218.107 <none> 80/TCP 28s app=readiness 21 22 NAME READY STATUS RESTARTS AGE IP NODE 23 po/busybox2 1/1 Running 1 1h 172.16.16.3 k8s-master 24 po/exec 1/1 Running 11 28m 172.16.59.4 k8s-node2 25 po/httpget 1/1 Running 1 18m 172.16.16.4 k8s-master 26 po/readiness-66j6c 0/1 Running 0 2m 172.16.59.5 k8s-node2 27 po/readiness-l2v6z 0/1 Running 0 2m 172.16.32.3 k8s-node3 28 po/tcpsocket 1/1 Running 0 10m 172.16.59.2 k8s-node2 29 [root@k8s-master health]#
可以看到readiness已经启动了两个Pod了,但是后端节点里面是空的。此时可以创建一个指定的html文件,就可以了。
此时发现后端节点也不为空了,Pod也正常启动了,另外一个可以类似出来,就可以将两个Pod正常启动起来了。
1 [root@k8s-master health]# kubectl exec -it readiness-66j6c bash 2 root@readiness-66j6c:/# cd /usr/share/nginx/html/ 3 root@readiness-66j6c:/usr/share/nginx/html# echo hello nginx > qiangge.html 4 root@readiness-66j6c:/usr/share/nginx/html# cat qiangge.html 5 hello nginx 6 root@readiness-66j6c:/usr/share/nginx/html# exit 7 exit 8 [root@k8s-master health]# kubectl describe svc readiness 9 Name: readiness 10 Namespace: default 11 Labels: app=readiness 12 Selector: app=readiness 13 Type: ClusterIP 14 IP: 10.254.218.107 15 Port: <unset> 80/TCP 16 Endpoints: 172.16.59.5:80 17 Session Affinity: None 18 No events. 19 [root@k8s-master health]# kubectl get all -o wide 20 NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR 21 rc/readiness 2 2 1 6m readiness 192.168.110.133:5000/nginx:1.13 app=readiness 22 23 NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR 24 svc/kubernetes 10.254.0.1 <none> 443/TCP 13d <none> 25 svc/readiness 10.254.218.107 <none> 80/TCP 4m app=readiness 26 27 NAME READY STATUS RESTARTS AGE IP NODE 28 po/busybox2 1/1 Running 1 1h 172.16.16.3 k8s-master 29 po/exec 0/1 CrashLoopBackOff 11 32m 172.16.59.4 k8s-node2 30 po/httpget 1/1 Running 1 21m 172.16.16.4 k8s-master 31 po/readiness-66j6c 1/1 Running 0 6m 172.16.59.5 k8s-node2 32 po/readiness-l2v6z 0/1 Running 0 6m 172.16.32.3 k8s-node3 33 po/tcpsocket 1/1 Running 0 13m 172.16.59.2 k8s-node2 34 [root@k8s-master health]#


浙公网安备 33010602011771号