1)Pod三种探针
ExecAction:在容器内执行一个命令,如果返回值为0,则认为容器健康。
TCPSocketAction:通过TCP连接检查容器内的端口是否通的,如果是通的就认为容器健康。
HTTPGetAction:通过应用程序暴露的API地址检查程序是否正常,如果状态码为200~400之间,则认为容器健康。
2) 探针检查参数配置
initialDelaySeconds: 60 # 初始化时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 5 # 检测间隔
successThreshold: 1 # 检查成功为1次表示就绪
failureThreshold: 2 # 检测失败2次表示未就绪
3)k8s中的启动探针startupProbe
判断容器内的应用程序是否已启动,如果提供了启动探测,则禁用所有其他探测,直到它成功为止。如果启动探测失败,kubelet将杀死容器,容器将服从其重启策略。如果容器没有提供启动探测,则默认状态为成功。
那么在什么时候会用startupProbe
呢?
正常情况下,我们会在pod template中配置livenessProbe来探测应用程序是否正常运行,如果异常则会触发restartPolicy重启Pod(因为默认情况下restartPolicy设置的是always)
如下:
livenessProbe:
httpGet:
path: /test
prot: 80
failureThreshold: 1
initialDelay:10
periodSeconds: 10
容器启动10s后每10s检查一次,允许失败的次数是1次。如果失败次数超过1则会触发restartPolicy
但是有时候会存在特殊情况,比如服务A启动时间很慢,需要60s。这个时候如果还是用上面的探针就会进入死循环,因为上面的探针10s后就开始探测,这时候我们服务并没有起来,发现探测失败就会触发restartPolicy。这时候有的朋友可能会想到把initialDelay
调成60s不就可以了?但是我们并不能保证这个服务每次起来都是60s,假如新的版本起来要70s,甚至更多的时间,我们就不好控制了。有的朋友可能还会想到把失败次数增加,如果设置了failureThreshold=5
,那么就需要5*10s=50s
的时间,在现在大家追求快速发现、快速定位、快速响应的时代是不被允许的
在这时候我们把startupProbe
和livenessProbe
结合起来使用就可以很大程度上解决我们的问题。
如下:
livenessProbe:
httpGet:
path: /test
prot: 80
failureThreshold: 1
initialDelay:10
periodSeconds: 10
startupProbe:
httpGet:
path: /test
prot: 80
failureThreshold: 10
initialDelay:10
periodSeconds: 10
上面的配置是只有`startupProbe`探测成功后再交给`livenessProbe`。我们`startupProbe`配置的是`10*10s`,也就是说只要应用在100s内启动都是OK的,而且应用挂掉了10s就会发现问题
4) LivenessProbe探测
目的: 用于探测容器是否运行,如果探测失败,kubelet辉根据配置的重启策略进行处理,若没有配置该探针,默认为success
LivenessProbe 探针使用示例
4.1)通过exec方式做健康探测
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec
labels:
app: liveness
spec:
containers:
- name: liveness
image: busybox
args: #创建测试探针探测的文件
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe:
initialDelaySeconds: 10 #延迟检测时间
periodSeconds: 5 #检测时间间隔
exec:
command:
- cat
- /tmp/healthy
4.2) 通过httpGet方式
- 任何大于或等于200且小于400的代码表示探测成功。
- 任何其他代码表示失败。
httpGet探测方式有如下可选的控制字段:
- scheme: 用于连接host的协议,默认为HTTP。
- host: 要连接的主机名,默认为Pod IP,可以在http request head中设置host头部。
- port: 容器上要访问端口号或名称。
- path: http服务器上的访问URI。
- httpHeaders: 自定义HTTP请求headers,HTTP允许重复headers。
4.3) 通过tcp方式apiVersion: v1 kind: Pod metadata: name: liveness-http labels: test: liveness spec: containers: - name: liveness image: mydlqclub/springboot-helloworld:0.0.1 livenessProbe: initialDelaySeconds: 20 #延迟加载时间 periodSeconds: 5 #重试时间间隔 timeoutSeconds: 10 #超时时间设置 httpGet: scheme: HTTP port: 8081 path: /actuator/health
apiVersion: v1
kind: Pod
metadata:
name: liveness-tcp
labels:
app: liveness
spec:
containers:
- name: liveness
image: nginx
livenessProbe:
initialDelaySeconds: 15
periodSeconds: 20
tcpSocket:
port: 80
5)ReadinessProbe探测
目的: 用于判断容器内的程序是否健康,它的返回值如果为success,那么就代表这个容器已经完成启动,当检测失败后,将 Pod 的 IP:Port 从对应的 EndPoint 列表中删除