一、探针的介绍
健康检查(Health Check)用于检测您的应用实例是否正常工作,是保障业务可用性的一种传统机制,一般用于负载均衡下的业务,如果实例的状态不符合预期,将会把该实例“摘除”,不承担业务流量。
探针就是健康检查的一种手段。probe 是由 kubelet 对容器执行的定期诊断。要执行诊断,kubelet 既可以在容器内执行代码,也可以发出一个网络请求。
探针的作用:可以很方便得用来检测容器内的应用是否正常。
二、容器的生命周期
容器在Pod内运行,可以通过kubectl describe pod 来查看容器的状态
容器有三种状态
running:表示容器正在运行中。
terminated:表示容器已经开始执行并且或者正常结束或者因为某些原因失败。
waiting:表示容器仍在运行它完成启动所需要的操作。
三、探针类型
默认健康检查机制:
如果没有引入探针,k8s会对pod的crash状态进行判断。容器启动时都会执行一个主进程,如果进程退出返回码不是0,则认为容器异常,此时集群会根据restartPolicy选择是否杀掉pod,还是重新启动一个。
1、LivenessProbe(存活探针)
探测容器是否正在运行。如果存活探针检测失败,则kubelet会杀死容器,并且容器将根据其重启策略来决定是否重启容器。如果容器不提供存活探针,默认状态为Success。
应用场景:
如果容器中的进程能够在遇到问题或不健康的情况下自行崩溃,则不一定需要存活态探针; kubelet
将根据 Pod 的 restartPolicy
自动执行修复操作。
如果你希望容器在探测失败时被杀死并重新启动,那么请指定一个存活态探针, 并指定 restartPolicy
为 "Always
" 或 "OnFailure
"。
LivenessProbe:
enabled: true
httpGet:
port: 8080
scheme: HTTP
30 # 初始化时间,默认值为0 :
35 # 超时时间,默认值为1 :
30 # 探测间隔时间,默认是10S :
1 # 检查1次成功就表示成功 :
3 # 检测3次失败就表示失败,默认值是3 :
2、ReadnessProbe(就绪探针)
探测容器是否准备好为请求提供服务。当一个Pod中所有容器都已就绪(ready状态),才可以认为处于就绪状态。对于被Service管理的Pod,Service和Pod endpoint的关联关系也将基于Pod是否Ready进行设置。如果就绪态探测失败, 端点控制器将从与 Pod 匹配的所有服务的端点列表中删除该 Pod 的 IP 地址。初始延迟之前的就绪态的状态值默认为 Failure
。如果容器不提供就绪态探针,则默认状态为 Success
。
应用场景:
如果要仅在探测成功时才开始向 Pod 发送请求流量,请指定就绪态探针。 在这种情况下,就绪态探针可能与存活态探针相同,但是规约中的就绪态探针的存在意味着 Pod 将在启动阶段不接收任何数据,并且只有在探针探测成功后才开始接收数据。
如果你希望容器能够自行进入维护状态,也可以指定一个就绪态探针, 检查某个特定于就绪态的因此不同于存活态探测的端点。
如果你的应用程序对后端服务有严格的依赖性,你可以同时实现存活态和就绪态探针。 当应用程序本身是健康的,存活态探针检测通过后,就绪态探针会额外检查每个所需的后端服务是否可用。 这可以帮助你避免将流量导向只能返回错误信息的 Pod。
如果你的容器需要在启动期间加载大型数据、配置文件或执行迁移, 你可以使用启动探针。 然而,如果你想区分已经失败的应用和仍在处理其启动数据的应用,你可能更倾向于使用就绪探针。
readinessProbe:
enabled: true
httpGet:
port: 8080
scheme: HTTP
initialDelaySeconds: 30 # 初始化时间,默认值为0
timeoutSeconds: 35 # 超时时间,默认值为1
periodSeconds: 30 # 探测间隔时间,默认是10S
successThreshold: 1 # 检查1次成功就表示成功
failureThreshold: 3 # 检测3次失败就表示失败,默认值是3
3、startupProbe(启动探针)
探测容器中的应用是否已经正常启动。如果启动了startupProbe,则所有其他探针都先被禁用,直到此探针成功为止。如果startupProbe探测失败,kubelet会杀死容器,而容器根据重启策略来进行重启。如果容器没有提供启动探针,则默认状态为Success。
应用场景:
对于所包含的容器需要较长时间才能启动就绪的 Pod 而言,启动探针是有用的。你不再需要配置一个较长的存活态探测时间间隔,只需要设置另一个独立的配置选定, 对启动期间的容器执行探测,从而允许使用远远超出存活态时间间隔所允许的时长。
如果你的容器启动时间通常超出 initialDelaySeconds + failureThreshold × periodSeconds
总值,你应该设置一个启动探测,对存活态探针所使用的同一端点执行检查。 periodSeconds
的默认值是 10 秒。你应该将其 failureThreshold
设置得足够高, 以便容器有充足的时间完成启动,并且避免更改存活态探针所使用的默认值。这一设置有助于减少死锁状况的发生。
ports:
name: liveness-port
containerPort: 8080
hostPort: 8080
livenessProbe:
httpGet:
path: /healthz
port: liveness-port
failureThreshold: 1
periodSeconds: 10
startupProbe:
httpGet:
path: /healthz
port: liveness-port
failureThreshold: 30
periodSeconds: 10
四、探针实现方式
HTTP
kubelet 将 HTTP GET 请求发送到 endpoint,并检查 2xx 或 3xx 响应。即使您的应用程序不是HTTP服务,我们也可以在应用程序内创建轻量级HTTP服务以响应Liveness探针。Kubernetes去访问一个路径,如果它得到的是200或300范围内的HTTP响应,它会将应用程序标记为健康。否则它被标记为不健康。
httpGet配置项:
host:连接的主机名,默认连接到pod的IP。你可能想在http header中设置”Host”而不是使用IP。
scheme:连接使用的schema,默认HTTP。
path: 访问的HTTP server的path。
httpHeaders:自定义请求的header。HTTP运行重复的header。
port:访问的容器的端口名字或者端口号。端口号必须介于1和65535之间。
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
name: Accept
value: application/json
initialDelaySeconds: 3
periodSeconds: 3
TCP
对于 TCP 探测而言,kubelet 在节点上(不是在 Pod 里面)发起探测连接, 这意味着你不能在 host
参数上配置服务名称,因为 kubelet 不能解析服务名称。Kubernetes尝试在指定端口上建立TCP连接。如果它可以建立连接,则容器被认为是健康的;否则被认为是不健康的。
TCP 的配置项(tcpSocket):
host:探测的主机,默认为本pod ip
port:端口,1到65535
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 35
periodSeconds: 10
Exec
Exec探针是在容器内运行指定的命令,如果命令退出代码为0,则标记容器状态为健康,如果不为0,则容器会被标记为不健康。
Exec 的配置项(exec):
command:需要执行的命令,需要符合命令的格式
livenessProbe:
exec:
command:
cat
/etc/hosts
initialDelaySeconds: 5
periodSeconds: 5
总结:
在实际的工作中需要根据业务的场景使用对应的探针组合,建议默认都开启存活性探针(liveness probes)和就绪性探针(readiness probes)。
k8s基于存活性探针(liveness probes)和就绪性探针(readiness probes)可以实现下面的一些需求
异常实例自动剔除,并重启新实例
多种类型探针检测,保证异常pod不接入流量
不停机部署,更安全的滚动升级
对于慢启动的容器,可以引入启动探测(Startup Probes)来优化健康检查。k8s 1.16 才开始支持startup Probe这个特性。
本篇关于探针技术的学习分享完结!感谢你的阅读,如果觉得还OK,欢迎点赞 ;关注 ; 收藏 ; 私信!!!