目录
livenessProbe-httpget(httpget的获取方案)
容器探针
探针是由 kubelet 对容器执行的定期诊断。要执行诊断, kubelet 调用由容器实现的 Handler 。有三种类型的处理程序:
- ExecAction :在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。
- TCPSocketAction :对指定端口上的容器的 IP 地址进行 TCP 检查。如果端口打开,即端口可以正常连接,则诊断被认为是成功的。
- HTTPGetAction :对指定的端口和路径上的容器的 IP 地址执行 HTTP Get 请求。如果响应的状态码大于等于 200 且小于 400 ,则诊断被认为是成功的。。
每次探测都将获得以下三种结果之一:
Ø 成功:容器通过了诊断。
Ø 失败:容器未通过诊断。
Ø 未知:诊断失败,因此不会采取任何行动
探测方式
livenessProbe :指示容器是否正在运行,即会跟随我们整个容器的生命周期。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探针,则默认状态为 Success。
(livenessProbe会持续循环的检测容器里面的应用程序或者什么资源可不可以用,如果不可用的话,kubelet就会把这个容器杀死,杀死之后,若我们的重启策略为always,整个pod就会重启)
readinessProbe :指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 Failure 。如果容器不提供就绪探针,则默认状态为 Success。readinessPorbe检测成功之后,我们的mainC才会被外部访问,不然就会是failure。
实现一个探针
1. 就绪检测
httpget的方式
[root@master1 test]# cat readness-httpGet.yaml
apiVersion: v1
kind: Pod
metadata: #元素信息
name: readiness-httpget-pod #这个pod的名字
namespace: default
spec: #详细信息
containers:
- name: readiness-httpget-container #容器的名字
image: nginx:alpine
imagePullPolicy: IfNotPresent #镜像下载策略
readinessProbe: #就绪检测
httpGet: #检测方案,httpget方案
port: 80 #检测是80端口
path: /index1.html #检测路径,nginx的根目录下有个index1.html文件,有的话检测成功
initialDelaySeconds: 1 #检测延时,1秒之后检测
periodSeconds: 3 #3秒以后重新检测
[root@master1 test]#
结果显示如下:readness-httpGet.yaml 里面的
[root@master1 test]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 1 13h
readiness-httpget-pod 0/1 Running 0 3m47s
[root@master1 test]#
查看一下pod的events信息
教程中 nginx:alpine这个镜像在根目录下面没有index1.html 这个文件,因此创建完pod之后,就绪检测没有通过,所以READY那里为零。若要检测成功就去修改一下即可
[root@master1 test]# kubectl exec -it readiness-httpget-pod sh
/ # cd /usr/share/nginx/html/
/usr/share/nginx/html # ls
50x.html index.html
/usr/share/nginx/html # echo "11111" > index1.html
/usr/share/nginx/html # exit
[root@master1 test]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 1 13h
readiness-httpget-pod 1/1 Running 0 6m15s
[root@master1 test]#
注意:readness-httpGet.yaml 这个文件的path不是根目录的意思啊,这个是nginx的默认访问目录,我们可以看看nginx的配置文件
2. 存活检测
livenessProbe-exec(exec的获取方案)
[root@master1 test]# cat live-exec.yaml
apiVersion: v1
kind: Pod
metadata: #元素信息
name: liveness-exec-pod #这个pod的名字
namespace: default
spec: #详细信息
containers: #容器
- name: liveness-exec-container #容器的名字
image: busybox
imagePullPolicy: IfNotPresent #
command: ["/bin/sh","-c","touch /tmp/live ; sleep 60; rm -rf /tmp/live; sleep3600"]
livenessProbe: #liveness和readyiness绑定在同一个容器下
exec:
command: ["test","-e","/tmp/live"] #检测live文件是否存在
initialDelaySeconds: 1
periodSeconds: 3
[root@master1 test]#
创建结果如下
[root@master1 test]# kubectl apply -f live-exec.yaml
pod/liveness-exec-pod created
[root@master1 test]#
[root@master1 test]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
liveness-exec-pod 1/1 Running 0 5s
liveness-exec-pod 0/1 Error 0 61s
liveness-exec-pod 1/1 Running 1 63s
^C[root@master1 test]#
刚开始create pod的时候是没问题的,但是60s之后就有问题了,因为上面的是 rm -rf /tmp/live,这个文件被删除了,然后我们的存活检测到这个文件没有了,就会重启pod,然后会重新touch。
livenessProbe-httpget(httpget的获取方案)
[root@master1 test]# cat live-httpget.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness-httpget-pod
namespace: default
spec:
containers:
- name: liveness-httpget-container
image: nginx:alpine
imagePullPolicy: IfNotPresent
ports: #定义了一个ports
- name: http #名字叫做http
containerPort: 80 #端口是80
livenessProbe:
httpGet:
port: http #httpGet的方案是检测我们的80
path: /index.html #检测index.html这个文件是否存在
initialDelaySeconds: 1 #延时1秒之后检测
periodSeconds: 3 #检测的重复次数是3秒一次
timeoutSeconds: 10 #超时时间,超过10s就失败了
[root@master1 test]#
运行一下,可以正常访问到
[root@master1 test]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
liveness-httpget-pod 1/1 Running 0 11s 10.244.0.39 master1 <none> <none>
[root@master1 test]# wget 10.244.0.39
--2021-08-20 11:54:51-- http://10.244.0.39/
正在连接 10.244.0.39:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:612 [text/html]
正在保存至: “index.html”
100%[==============================================================>] 612 --.-K/s 用时 0s
2021-08-20 11:54:51 (61.2 MB/s) - 已保存 “index.html” [612/612])
[root@master1 test]#
若我们此时删除index.html文件,liveness到了检测时间,就会重启改pod
[root@master1 test]# kubectl exec -it liveness-httpget-pod -- rm -rf /usr/share/nginx/html/index.html
[root@master1 test]# kubectl get pod
NAME READY STATUS RESTARTS AGE
liveness-httpget-pod 1/1 Running 0 3m16s
[root@master1 test]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
liveness-httpget-pod 1/1 Running 0 3m19s
liveness-httpget-pod 1/1 Running 1 3m23s
^C[root@master1 test]#
livenessProbe-tcp(tcp方案)
[root@master1 test]# cat live-tcp.yaml
apiVersion: v1
kind: Pod
metadata:
name: probe-tcp
spec:
containers:
- name: nginx
image: nginx:alpine
livenessProbe:
initialDelaySeconds: 5 #延时检测时间
timeoutSeconds: 1
tcpSocket:
port: 8080
periodSeconds: 3
[root@master1 test]#
运行结果:
[root@master1 test]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
probe-tcp 1/1 Running 0 3s
probe-tcp 1/1 Running 1 16s
probe-tcp 1/1 Running 2 28s
^C[root@master1 test]#
分析:pod创建之后,先等5秒,再检测连接8080端口,8080端口无反应,超时时间为1秒,就会退出再重新检测。
3. 并行检测
我们还可以把上面的放在一起检测
[root@master1 test]# cat live-read-httpget.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness-httpget-pod
namespace: default
spec:
containers:
- name: liveness-httpget-container
image: nginx:alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
readinessProbe:
httpGet:
port: 80
path: /index1.html
initialDelaySeconds: 1
periodSeconds: 3
livenessProbe:
httpGet:
port: http
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
timeoutSeconds: 10
[root@master1 test]#
刚开始创建的状态不是ready
[root@master1 test]# kubectl get pod
NAME READY STATUS RESTARTS AGE
liveness-httpget-pod 0/1 Running 0 2s
当我们进入容器之中,创建一个index1.html文件,就处于ready状态
[root@master1 test]# kubectl exec -it liveness-httpget-pod sh
/ # echo "11111" > /usr/share/nginx/html/index1.html
/ # exit
[root@master1 test]# kubectl get pod
NAME READY STATUS RESTARTS AGE
liveness-httpget-pod 1/1 Running 0 62s
上面这个容器在启动得到时候,1秒之后进行我们的就绪检测,检测我们的index1.html文件存在,不存在的话,就3秒之后再检测一下,如果有的话就进行我们的ready状态。
liveness的话,是同时进行检测的,唯一的区别就是,不存活的话就直接重启pod了。
而readinessProbe就绪检测只是改变状态是不是ready。
启动、退出动作
[root@master1 test]# cat start-stop.yaml
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: nginx:alpine
lifecycle:
postStart: #启动的时候运行的一条命令,运行的命令就是下面echo
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler >/usr/share/message"]
preStop: #容器退出时执行的命令
exec:
command: ["/bin/sh", "-c", "echo Hello from the poststop handler >/usr/share/message"]
[root@master1 test]#
运行结果如下:
[root@master1 test]# kubectl get pod
NAME READY STATUS RESTARTS AGE
lifecycle-demo 1/1 Running 0 3s
[root@master1 test]#
[root@master1 test]# kubectl exec -it lifecycle-demo -- cat /usr/share/message
Hello from the postStart handler
[root@master1 test]#
这个的作用可以应用于我们的数据库,当我们的数据要退出的时候,可以让它在退出之前执行一个命令,一般来讲执行一个保存数据的命令,来保证我们的数据不会丢失。
补充一个pod的几种状态,可以参考这篇博文