健康检查概述
健康检查(Health Check)用于检测您的应用实例是否正常工作,是保障业务可用性的一种传统机制,一般用于负载均衡下的业务,如果实例的状态不符合预期,将会把该实例“摘除”,不承担业务流量。
应用在运行过程中难免会出现错误,如程序异常,软件异常,硬件故障,网络故障等。在kubernetes中提供Health Check健康检查机制,当发现应用异常时会自动重启容器,将应用从service服务中剔除,保障应用的高可用性。
k8s健康检查介绍
Kubernetes中的健康检查主要使用存活性探针(liveness probes)和就绪性探针(readiness probes)来实现,service即为负载均衡,k8s保证 service 后面的 pod 都可用,是k8s中自愈能力的主要手段,基于这两种探测机制,可以实现如下需求:
- 异常实例自动剔除,并重启新实例
- 多种类型探针检测,保证异常pod不接入流量
- 不停机部署,更安全的滚动升级
k8s的三种探针Prob以及对应的探测方式
k8s中定义了三种探针Probe:
- readiness probes 准备就绪检查,通过readiness是否准备接受流量,准备完毕加入到endpoint,否则剔除
- liveness probes 在线检查机制,检查应用是否可用,如死锁,无法响应,异常时会自动重启容器
- startup probes 启动检查机制,应用一些启动缓慢的业务,避免业务长时间启动而被前面的探针kill掉
每种探测机制支持三种健康检查方法,分别是命令行exec,httpGet和tcpSocket,其中exec通用性最强,适用与大部分场景,tcpSocket适用于TCP业务,httpGet适用于web业务。
k8s中目前支持的探测方式主要包括以下三种:
- exec 提供命令或shell的检测,在容器中执行命令检查,返回码为0健康,非0异常
- httpGet http协议探测,在容器中发送http请求,根据http返回码判断业务健康情况
- tcpSocket tcp协议探测,向容器发送tcp建立连接,能建立则说明正常
exec命令行健康检查
许多应用程序运行过程中无法检测到内部故障,如死锁,出现故障时通过重启业务可以恢复,kubernetes提供liveness在线健康检查机制,我们以exec为例,创建一个容器启动过程中创建一个文件/tmp/liveness-probe.log,10s后将其删除,定义liveness健康检查机制在容器中执行命令ls -l /tmp/liveness-probe.log,通过文件的返回码判断健康状态,如果返回码非0,暂停20s后kubelet会自动将该容器重启。
1.定义一个容器,启动时创建一个文件,健康检查时ls -l /tmp/liveness-probe.log返回码为0,健康检查正常,10s后将其删除,返回码为非0,健康检查异常
root@node-1 demo # cat centos-exec-liveness-probe.yaml
apiVersion v1
kind Pod
metadata
name exec-liveness-probe
annotations
kubernetes.io/description"exec-liveness-probe"
spec
containers
name exec-liveness-probe
image centos latest
imagePullPolicy IfNotPresent
args#容器启动命令,生命周期为30s
/bin/sh
-c
touch /tmp/liveness-probe.log && sleep 10 && rm -f /tmp/liveness-probe.log && sleep 20
livenessProbe
exec#健康检查机制,通过ls -l /tmp/liveness-probe.log返回码判断容器的健康状态
command
ls
l
/tmp/liveness-probe.log
initialDelaySeconds1
periodSeconds5
timeoutSeconds1
httpGet健康检查
httpGet probe主要主要用于web场景,通过向容器发送http请求,根据返回码判断容器的健康状态,返回码小于4xx即表示健康,如下定义一个nginx应用,通过探测http://:port/index.html的方式判断健康状态
root@node-1 demo # cat nginx-httpGet-liveness-readiness.yaml
apiVersion v1
kind Pod
metadata
name nginx-httpget-livess-readiness-probe
annotations
kubernetes.io/description"nginx-httpGet-livess-readiness-probe"
spec
containers
name nginx-httpget-livess-readiness-probe
image nginx latest
ports
name http-80-port
protocol TCP
containerPort80
livenessProbe#健康检查机制,通过httpGet实现实现检查
httpGet
port80
scheme HTTP
path /index.html
initialDelaySeconds3
periodSeconds10
timeoutSeconds3
tcpSocket健康检查
tcpsocket健康检查适用于TCP业务,通过向指定容器建立一个tcp连接,可以建立连接则健康检查正常,否则健康检查异常,依旧以nignx为例使用tcp健康检查机制,探测80端口的连通性
root@node-1 demo # cat nginx-tcp-liveness.yaml
apiVersion v1
kind Pod
metadata
name nginx-tcp-liveness-probe
annotations
kubernetes.io/description"nginx-tcp-liveness-probe"
spec
containers
name nginx-tcp-liveness-probe
image nginx latest
ports
name http-80-port
protocol TCP
containerPort80
livenessProbe#健康检查为tcpSocket,探测TCP 80端口
tcpSocket
port80
initialDelaySeconds3
periodSeconds10
timeoutSeconds3
Prob有很多配置字段,可以使用这些字段精确的控制存活和就绪检测的行为:
-
initialDelaySeconds
:容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒,最小值是 0。 -
periodSeconds
:执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。 -
timeoutSeconds
:探测的超时后等待多少秒。默认值是 1 秒。最小值是 1。 -
successThreshold
:探测器在失败后,被视为成功的最小连续成功数。默认值是 1。 存活和启动探测的这个值必须是 1。最小值是 1。 -
failureThreshold
:当探测失败时,Kubernetes 的重试次数。 存活探测情况下的放弃就意味着重新启动容器。 就绪探测情况下的放弃 Pod 会被打上未就绪的标签。默认值是 3。最小值是 1。