Kubernetes中Pod健康检查

  • 2020 年 3 月 26 日
  • 筆記

1、何为健康检查

Kubernetes架构中,每个节点都会有kubelet,容器健康检查(Container Probe)的任务就是由Kubelet定期执行的。

Kubelet会通过调用Pod中容器的Handler来执行检查动作,Handler有以下三种类型:

  • ExecAction:在容器中执行特定的命令,命令退出返回0(命令执行返回值:$?)表示成功
  • TCPSocketAction:根据容器IP地址及特定的端口进行TCP检查,端口访问/开放/暴露表示成功
  • HTTPGetAction:根据容器IP、端口及访问路径发起一次HTTP请求,如果返回状态码在200到400之间表示成功

每种检查动作都可能会有三种返回状态:

  • Success:表示通过健康检查
  • Failure:表示没有通过健康检查
  • Unknown:表示检查动作失败

2、探针分类

创建Pod时,可通过livenessreadiness两种方式来探测Pod内容器的运行情况。

2.1、LivenessProbe探针(存活性探测)

判断容器是否健康(Running状态)并反馈给Kubelet。其实有很多应用长时间的后台运行后会逐渐的转为不可用状态,并且仅能通过重启Pod操作恢复,那么存活性探针机制就可以发现此类问题,并依据探测结果结合重启策略触发后续的执行。

kubernetes存活性探针支持的检测方法为三种:ExecAction、TCPSocketAction和HTTPGetAction

如果一个容器没有LivenessProbe探针,那么kubelet就会认为该容器的LivenessProbe探针返回的值永远都会是Success。

2.2、ReadinessProbe探针(就绪型探测)

判断容器服务是否可用(Ready状态)能否对外提供服务,只有达到了Ready状态的Pod才能接收请求,当容器里跑的业务起来之后容器的状态才能为Ready,负责认为容器探测失败,如果探测失败,则系统会将Service后端Endpoint列表中移除其Pod IP,后续再恢复到Ready,则探测成功会将其Pod IP加回Endpoint列表。

3、探针实现方法

LivenessProbeReadinessProbe都可配置以下三种探针实现方式:

ReadinessProbe的配置和LivenessProbe类似,只需要将yaml中的livenessProbe修改为readinessProbe

3.1、Container Exec

创建一个容器,通过检查一个文件是否存在来判断容器运行是否正常,如果文件存在则会返回状态码为0,容器运行30秒后,会将文件删除,LivenessProbe检查失败则将重启容器。

apiVersion: v1  kind: Pod  metadata:    name: exec  spec:    containers:      - name: nginx        image: nginx:1.13        ports:          - containerPort: 80        args:          - /bin/sh          - -c          - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600        livenessProbe:          exec:            command:              - cat              - /tmp/healthy          initialDelaySeconds: 5          periodSeconds: 5  

检测到目录不存在

[root@k8s-master01 health]# kubectl describe pod exec  |grep "Liveness"      Liveness:       exec [cat /tmp/healthy] delay=5s timeout=1s period=5s #success=1 #failure=3    Warning  Unhealthy  4s (x3 over 14s)  kubelet, k8s-node01  Liveness probe failed: cat: /tmp/healthy: No such file or directory  

3.2、HTTP Check

创建一个Nginx容器,通过访问/index.html来判断服务是否存活,通过手动移除该文件的方式,能导致检查失败,从而重启容器

apiVersion: v1  kind: Pod  metadata:    name: httpget  spec:    containers:      - name: nginx        image: nginx:1.13        ports:          - containerPort: 80        livenessProbe:          httpGet:            path: /index.html # 访问路径            port: 80          # 容器端口          initialDelaySeconds: 5          periodSeconds: 5  

手动将nginx容器的index.html文件移除

[root@k8s-master01 health]# kubectl exec -it httpget bash  root@httpget:/# mv /usr/share/nginx/html/index.html  /tmp/  

当index.html访问返回状态码不为200时,就会重启容器

[root@k8s-master01 health]# kubectl describe pod httpget |grep "Liveness"      Liveness:       http-get http://:80/index.html delay=5s timeout=1s period=5s #success=1 #failure=3    Warning  Unhealthy  59s (x3 over 69s)   kubelet, k8s-node01  Liveness probe failed: HTTP probe failed with statuscode: 404  

3.3、TCP Socket Check

通过对IP地址(请求连接的目标IP地址,默认为Pod IP)和端口号进行TCP检查,如果可以建立TCP连接的话,则认为容器健康,它会比基于HTTP检测方式更加的高效(HTTP是七层,TCP是四层),更节约资源,但是精确度微低,能建立成功并不代表页面可展示。

apiVersion: v1  kind: Pod  metadata:    name: tcpSocket  spec:    containers:      - name: nginx        image: nginx:1.13        ports:          - containerPort: 80        livenessProbe:          tcpSocket:            port: 80          initialDelaySeconds: 3          periodSeconds: 3  

4、探测行为参数

initiaDelaySeconds // 容器启动之后多久开始检测,默认为0秒  periodSeconds      // 每隔多久检测一次,默认为10秒,最小为1秒  failureThreshold   // 检测失败几次后则认为健康检测失败,默认为3次  successThreshold   // 从检测错误到成功需要几次才认为健康检测成功,默认为1次  timeoutSeconds     // 执行检测命令的最长时间,默认为1秒,最小为1秒    httpGet的属性  		host:主机名或IP  		scheme:链接类型,HTTP或HTTPS,默认为HTTP  		path:请求路径  		httpHeaders:自定义请求头  		port:请求端口