Kubernetes中Pod健康检查

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:请求端口
posted @ 2020-03-26 16:49  jasonminghao  阅读(1095)  评论(0编辑  收藏  举报