K8s的yaml文件的检查指标
简介
K8S服务健康检查从两个维度进行,分别为:就绪状态检查(readiness)和存活状态检查(liveness)。
存活探针和就绪探针被称作健康检查。这些容器探针是一些周期性运行的小进程,这些探针返回的结果如(成功,失败或者未知)反映容器在Kubernetes的状态。基于结果Kubernetes会判断如何处理每个容器,以保障集群服务高可用性和业务与连续性。
readiness&liveness
readiness:用于探测HTTP是否就绪,是否可以接受业务请求。如果ReadinessProbe探针检测到失败,则Pod的状态被修改。Endpoint Controller将从Service的Endpoint中删除包含该容器所在Pod的Endpoint。
Pod对象启动后,容器应用通常需要一段时间才能完成其初始化过程,例如加载配置或数据,甚至有些程序需要运行某类的预热过程,若在此阶段完成之前接入客户端的请求,势必会因为等待太久而影响用户体验,这时就需要就绪探针。如果没有将就绪探针添加到pod中,它们几乎会立即成为服务端点。如果应用程序需要很长时间才能开始监听传入连接,则在服务启动但尚未准备好接收传入连接时,客户端请求将被转发到该pod。因此,客户端会看到"连接被拒绝"类型的错误。
liveness:用于探测HTTP是否存活,如果LivenessProbe探针探测到容器不健康,则kubelet杀掉该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含LivenessProbe探针,则kubelet认为该容器的LivenessProbe探针返回的值永远是“Success”。
Liveness探针让Kubernetes知道你的应用程序是状态是否健康。但是如果liveness检查结果是fail就会直接kill container,当然如果你的restart policy 是always 会重启pod。
备注:pod重启策略:PodSpec 中有一个 restartPolicy 字段,可能的值为 Always、OnFailure 和 Never 。默认为Always。
支持检测类型
Kubernetes 支持三种方式来执行探针:
exec:在容器中执行一个命令,如果命令退出码返回0则表示探测成功,否则表示失败;
tcpSocket:对指定的容IP及端口执行一个TCP检查,如果端口是开放的则表示探测成功,否则表示失败;
httpGet:
HTTP探测意味在特定时间间隔执行HTTP请求响,应的状态码用于决定需要对pod执行的操作。如果状态代码在区间 [200,300) 中,则一切正常。
如果存活探测器的状态代码是 4xx 或 5xx ,则代表pod已被重启。
如果就绪探测器的状态代码是 4xx 或 5xx ,那么pod会被标记为不健康,并且Kubernetes为了提高可靠性和正常运行时间将不会再将HTTP请求转发给它。
探测(健康检查)配置参数
通用配置,通过下面的配置能准确的控制 liveness 和 readiness 检查时间策略:
initialDelaySeconds:容器启动后第一次执行探测是需要等待多少秒。
periodSeconds:执行探测的频率。默认是10秒,最小1秒。
timeoutSeconds:探测超时时间。默认1秒,最小1秒。
successThreshold:探测失败后,最少连续探测成功多少次才被认定为成功。默认是 1。对于 liveness 必须是 1。最小值是 1。
failureThreshold:探测成功后,最少连续探测失败多少次才被认定为失败。默认是 3。最小值是 1。
HTTP probe 中可以给 httpGet设置其他配置项:
host:连接的主机名,默认连接到 pod 的 IP。您可能想在 http header 中设置 “Host” 而不是使用 IP。
scheme:连接使用的 schema,默认HTTP。
path: 访问的HTTP server 的 path。
httpHeaders:自定义请求的 header。HTTP运行重复的 header。
port:访问的容器的端口名字或者端口号。端口号必须介于 1 和 65525 之间。
就绪检查 5 秒一次
readinessProbe:
failureThreshold: 3
httpGet:
httpHeaders:
- name: Host
value: localhost
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 5
存活状态检查 9 秒一次
livenessProbe:
failureThreshold: 3
httpGet:
httpHeaders:
- name: Host
value: 127.0.0.1
path: /50x.html
port: 80
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 9
successThreshold: 1
timeoutSeconds: 200