应用在运行过程中难免会出现错误,如程序异常,网络故障等,kubernetes提供健康检查机制,当发现应用异常时会自动重启容器,将应用从service服务中剔除,保障应用的高可用性。k8s定义了三种探针:存活探针、就绪探针和启动探针
pod中的三种探针
存活探针(Liveness):用于判断应用程序是否正在运行
比如我程序里启动的端口是80,使用存活探针查看80端口是否在监听,没有在监听,就认为程序异常,就会按照规则重启pod
就绪探针(Readiness):用于判断容器是否可用(ready状态),达到ready状态的pod才会接受请求。对于被service管理的pod,service与pod endpoint的关联关系也将基于pod 是否ready进行设置。
启动探针(StartupProbe):某些应用会遇到启动比较慢的情况,例如应用程序会与远程服务器简历连接,此Readiness就不适用了,这个属于有且仅有一次的超长延迟,可以通过该探针解决
存活探针与就绪探针相互间不等待对方成功。 如果要在执行就绪探针之前等待,就需要使用启动探针
总结:一般pod都会使用存活探针和就绪探针,如果应用第一次启动比较慢的情况下,才会加上启动探针
三种配置探针的方式
方式一:ExecAction
在容器内部运行一个命令,如果命令返回状态码为0,则表示容器健康
livenessProbe:
failureThreshold: 3 # 连续探测失败了failureThreshold 次之后,才认为是已经失败的
exec:
command:
- cat
- /tmp/health
initialDelaySeconds: 600 # 容器启动后等待多少s开始检测,健康检查初始探测时间
periodSeconds: 15 # 指定多长时间执行一次存活检测
successThreshold: 1 # 探测在失败后,被视为成功的最小连续成功数
timeoutSeconds: 1 # 探测超时后等待多少s
方式二:TCPSocketAction 通过容器IP地址和端口号执行TCP检查,如果可以建立连接,则表示容器健康
readinessProbe:
failureThreshold: 3
tcpsockert:
port: 7001
initialDelaySeconds: 15
periodSeconds: 3
successThreshold: 1
timeoutSeconds: 1
方式三:HTTPGetAction 通过容器的IP地址、端口以及路径调用HTTP GET 方法 如果相应的状态码在200-400之间就认为状态正常
readinessProbe:
failureThreshold: 3
httpGet:
path: /health
port: 7001
scheme: HTTP
initialDelaySeconds: 15
periodSeconds: 3
successThreshold: 1
timeoutSeconds: 1