1.总概括
k8s怎样监控Pod内部容器的程序存活情况呢?就是通过探针机制。
Pod探针有三类,分别是:livenessProbe(存活探针)、readinessProbe(就绪探针)、startupProbe(启动探针)。
三种探针拥有共同的探测机制,分别是:TcpSocketAction(端口探测)、HttpGetActive(api探测)、ExecActive(命令行探测)
注: 在k8s1.24版本之后(包含1.24)新增了一种探测机制,grpc探测,使用方式和前几种差不多
2.Pod探针细讲
livenessProbe: 一直检测pod内部容器的程序是否正常,如果返回状态为sucess就不做操作,如果检测到异常,就会根据重启策略重启pod。
readinessProbe:该探针不会重启pod。也会一直检测pod内部容器的程序是否正常,如果返回状态为sucess就不做操作,如果检测到异常,对应的service就会终止前端分发到该pod的流量,该探针主要针对的是程序启动了,但是否做好接收流量的准备。举例场景:访问的一个界面因为流量过大或者后端请求时间过长导致没有成功返回界面,这时候又没必要重启pod,那么部署该探针后,检测到异常后,对应service就会先终止前台到该pod的流量,直到检测成功。
startupProbe:这个探针是k8s后来新增的,目的是仅仅前两者不太满足业务需求。该探针作用于程序启动过程中的检测,启动后不再检测。目的就是检测启动状态。为啥需要这个探针呢?因为有些程序启动的时候时间很长,没错,就这么简单。我们先来说如果用前两者,好像也可以用,把检测时间拉长一点,加入启动大概在一分钟,那我就拉长在大于一分钟的时候检测。但是,后续发生故障的时间检测的时间也会拉长到大于一分钟!!!如果对于时间要求过高的业务而言是不可接收的。你可能会问,不是有initialDelaySeconds这个初始化参数可以设置时间吗,我把它设置成1分钟后开始检测,不久可以避免之后检测时间过长吗。但是,初始化只有第一次的时候管用,之后的每次重启都无法使用该参数。所以这时候startupProbe探针就起作用了,针对程序的启动时间单独设置。在startupProbe期间,会禁止其他探针检测,知道它成功为止。
3.探针演示
环境说明:
image镜像:nginx
livenessProbe演示
- TcpSocketAction探测方式:
编写yaml文件:nginx_pod.yaml
powershell
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec
labels:
test: liveness
spec:
containers:
- name: nginx
ports:
- containerPort: 80
args:
- /bin/sh
- -c
- sleep 7;nginx -g "daemon off;" #这一步会和初始化同时开始运行,也就是在初始化5s后和7秒之间,会检测出一次失败,7秒后启动后检测正常,所以pod不会重启
image: 192.168.247.100:5000/nginx #我自己的私有仓库,用的是官方的nginx镜像
imagePullPolicy: IfNotPresent
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 5 #初始化时间5s
periodSeconds: 4 #检测间隔时间4s
timeoutSeconds: 1 #默认检测超时时间为1s
failureThreshold: 3 #默认失败次数为3次,达到3次后重启pod
successThreshold: 1
运行:
kubectl create -f nginx_pod.yaml
kubectl describe pod liveness-exec #可以看到探针检测到一次失败,但是之后没有再检测出来
kubectl get pod -o wide 可以获得pod ip,我的为172.175.156.116。运行curl -I 172.175.156.116可以看到状态码为200,访问正常。
2.HttpGetActive探测方式:
修改上面的yaml文件:
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec
labels:
test: liveness
spec:
containers:
- name: nginx
ports:
- containerPort: 80
args:
- /bin/sh
- -c
- sleep 7;nginx -g "daemon off;"
image: 192.168.247.100:5000/nginx
imagePullPolicy: IfNotPresent
livenessProbe:
httpGet: #httpget
port: 80 #访问的端口
path: /index.html #访问的路径
initialDelaySeconds: 5
periodSeconds: 4
timeoutSeconds: 1
failureThreshold: 3
successThreshold: 1
可以看到在5到7秒之间检测到连接拒绝,但在之后正常。5到7秒是我估计设置的,目的就是看到是可以检测出来的。
3.ExecActive检测方式
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec
labels:
test: liveness
spec:
containers:
- name: nginx
ports:
- containerPort: 80
args:
- /bin/sh
- -c
- sleep 7;nginx -g "daemon off;"
image: 192.168.247.100:5000/nginx
imagePullPolicy: IfNotPresent
livenessProbe:
exec: #这里
command: #这里
- ls #这里
- /var/run/nginx.pid #查看是否有pid文件
initialDelaySeconds: 5
periodSeconds: 4
timeoutSeconds: 1
failureThreshold: 3
successThreshold: 1
第二种探针:readinessProbe的用法和上面一样,只要把livenessProbe改成readinessProbe即可,但是这两种探针的意义是不一样的。
startupProbe探针
主要是利用failureThreshold和periodSeconds两个参数。
这里就一个例子:
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec
labels:
test: liveness
spec:
containers:
- name: nginx
ports:
- containerPort: 80
args:
- /bin/sh
- -c
- sleep 30;nginx -g "daemon off;"
image: 192.168.247.100:5000/nginx
imagePullPolicy: IfNotPresent
startupProbe:
exec:
command:
- ls
- /var/run/nginx.pid
initialDelaySeconds: 5
periodSeconds: 4
timeoutSeconds: 1
failureThreshold: 30
successThreshold: 1
最大启动时间为(periodSeconds + timeoutSeconds) * failureThreshold: 30
这三种探针可以同时写入配置文件中。