目录
一、探针是什么
为了检测得知pod中的容器运行的状态,k8s引入了探针的概念。
探针:简单来说就是为了检测容器运行状态,以保证容器,pod的等整体的正常运行。
在k8s中,最小的单位叫作pod,在pod中运行着一个个容器
简单来说,探针就是kubelet对容器的定期诊断,注意:主体是有kubelet发起
和微服务的心跳检测类似,每隔一段时间,检测这个容器是否还正常工作,检测状态分为三种:
- Success:通过检测
- Failure:未通过检测
- Unknown:检测没有正常进行
k8s会根据检测到的不同状态,对容器进行不同的处理
二、探针类型
探针主要有以下三种类型:
- livenessProbe
- readinessProbe
- startupProbe
2.1 livenessProbe
livenessProbe:存活性探针
从容器启动开始,由kubelet定期执行检测,用于判断容器是不是健康,如果不满足健康条件,那么 Kubelet 会杀死容器(杀死的是container不是pod),并根据restartPolicy重启策略(Always,OnFailure,Never)来判断容器是否要进行重启操作;
2.2 readinessProbe
readinessProbe:就绪性探针
用于判断容器内的程序是否存活,如果不满足健康条件,那么会自动从Service的 EndPoint 列表中去除该pod的 IP:Port
有些Pod,需要时间来加载配置或数据,或者需要执行预热过程,以防止第一个用户请求时间太长影响了用户体验。
在这种情况下,不希望该Pod立即开始接收探针请求,尤其是在运行的示例可以正确快速的处理请求的情况下。不要将请求转发到正在启动的Pod中,需要一定的时间去准备,直到完全准备就绪。
这个准备就绪的概念是每个容器特有的东西。
k8s只能检查容器中运行的应用程序是否响应一个简单的GET请求,或者可以响应特定的URL路径,通过响应的结果,去判断确定是否准备就绪。
这也是就绪和存活探针的区别。
2.3 startupProbe
startupProbe:启动探针,k8s1.16新增加的一种类型
主要解决在慢启动程序或复杂程序中readinessProbe、livenessProbe探针无法较好的判断程序是否启动、是否存活
引入startupProbe探针是为readinessProbe、livenessProbe探针服务。
执行顺序:
如果三个探针同时存在,则先执行startupProbe探针,其他两个探针将会被暂时禁用,直到startupProbe一次探测成功,其他2个探针才启动
如果startupProbe探测失败,kubelet 将杀死容器,并根据restartPolicy重启策略来判断容器是否要进行重启操作。
2.4 总结
启动容器时,可以为k8s配置一个等待时间,经过等待时间后才可以执行第一次准备就绪检查。之后,它会周期性的调用探针,并根据就绪探针的结果采取行动。
如果某个Pod报告它尚未准备就绪,则会从该服务中删除该Pod。如果Pod再次准备就绪,则重新添加Pod。
就绪探针与存活探针之间的重要区别:如果容器未通过准备检查,则不会被终止或重新启动。
存活探针:通过杀死异常的容器,并用新的正常容器替代他们来保持Pod正常工作
就绪探针:确保只有准备好处理请求的Pod才可以接收探针请求
2.5 探针示例
探针资源 yml 中的常用的配置,如下。可根据具体的需求去设置
spec:
containers:
# 就绪探针
readinessProbe:
# 检测方式
httpGet:
# 超时时间
timeoutSeconds:
# 延迟时间
initialDelaySeconds:
# 失败次数限制
failureThreshold:
# 每多少秒检测一次
periodSeconds:
# 存活探针
livenessProbe:
# 检测方式
httpGet:
# 超时时间
timeoutSeconds:
# 延迟时间
initialDelaySeconds:
# 失败次数限制
failureThreshold:
# 每多少秒检测一次
periodSeconds:
三、探测机制
探测机制有三种:
- HTTP GET探针
- TCP套接字探针
- Exec探针
就绪探针/存活探针,都有这三种探测机制。
3.1 HTTP GET探针
该探针,是针对容器的IP地址(或者是指定的端口和地址)执行HTTP GET请求,状态码:
- 如果返回状态码是2xx或者3xx,则探测成功。
- 如果服务器返回错误的状态码或者根本没有反应,那么认定探测失败,容器会被重新启动。
3.2 TCP套接字探针
TCP套接字探针:尝试与容器指定的端口建立连接,
- 如果连接成功,则探测成功,
- 如果连接失败,则认定为探测失败,容器将被重新启动。
3.3 Exec探针
Exec探针:在容器内执行任意命令,并检查命令的退出状态码,
- 如果返回的状态码为0,则探测成功,
- 如果返回状态码不为0,则探测失败,容器将被重新启动。
Tips:
如果是java应用,建议用HTTP GET探针、不推荐使用Exec探针,因为java应用程序会消耗大量的计算资源
先到这吧~~~
晚安