k8s - 容器探针&健康检测

探针种类

  • startupprobe(启动探针)
  • livenessprobe(存活探针)
  • readinessprobe(就绪探针)

startuprobe(启动探针)

  • 只支持 tcp 和 http 检测
  • 使用启动探针时, 会禁用另外两个探针, 确保不会被干扰
  • 常用于针对启动缓慢的容器进行检查, 避免未启动就被杀死
    • 程序最多有 failureThreshold * periodSeconds 的时间来启动, 一旦探测成功, 交给其他探针进行后续的检测
    • 如果时间内没有成功, 根据 restartPolicy 参数进行处理
  • 启动探针完成后,交给就绪和存活探针

readnessprobe(就绪探针)

  • 它是用来检测pod是否准备就绪,当检测成功时,加入到endpoints列表接入流量。所以默认状态为failed(未就绪),当检测成功时状态变更为success(已就绪)

livenessprobe(存活探针)

  • 它是pod的正常运行后使用的探针,用于检测是否正常提供服务,失败则加入删除列表。所以默认状态为success(已就绪),当检测到失败时状态变更为failed(未就绪

探测方式

  • exec
  • http
  • tcp

exec

# 检测命令是否执行成功
# 返回值为 0 视为成功, 非 0 视为失败
# 本例子中检查 xxx.conf 文件是否存在

exec:
  command:
    - cat
    - xxx.conf

http

# 检测请求是否正常
# 状态码 2xx,3xx 视为成功, 4xx,5xx 视为失败
	
httpGet:
  path: /healthz
  port:  8080   # 使用端口命名和端口号都行

tcp

# 检查 tcp 连接是否正确建立

tcpSocket:
  port: my-http

定义探针

# 用 readiness http 举例
readinessProbe:
     # 检测方式: http
     httpGet:
     	# 请求路径
       path: /healthz
       # 请求端口
       port: 9000
       # 请求协议
       scheme: HTTP
       # 认证
       httpHeaders:
       - name: Accept
       	value: application/json
       - name: token
       	value: ""
     # 首次检测延时 20s,默认0,最小0
     initialDelaySeconds: 20
     # 探测间隔 5s,默认10,最小1
     periodSeconds: 5
     # 超时等待 10s,默认1,最小1
     timeoutSeconds: 10
     # 认定失败次数 3,默认3,最小1
     failureThreshold: 3
     # 探测失败时, 视为最小连续成功数, 默认为 1, 最小为 1, 存活和启动探针必须为 1 
     successThreshold: 1

示例

pod 完整yaml

apiVersion: v1
kind: Pod
metadata:
  namespace: yky
spec:
  containers:
    - name: xxx
      # 该容器包含一个 healthz 接口, 接口内容见下边示例
      image: xxx
      ports:
        - name: http
          containerPort: 8080
          protocol: TCP
      # 启动探针, 用 tcp 检测做示例
      startupProbe:
        tcpSocket:
          port: 8080
        # 第一次检测等待 30 秒
        initialDelaySeconds: 30
        # 检测间隔 3 秒
        periodSeconds: 3
        # 超时等待时间 10s
        timeoutSeconds: 10
        # 失败重试次数
        failureThreshold: 3
      # 活跃探针, exec 检测, 检查 xx.conf 是否存在, 不存在则重启
      livenessProbe:
        exec:
          command:
          - cat
          - xxx.conf
        # 时间参数都使用默认, 不填
      # 就绪探针, http 检测, 失败则从 endpoint 列表中去除
      readinessProbe:
        httpGet:
          path: /healthz
          # 使用端口命名, 或者 直接点端口号都行
          port: http

查看pod探针信息

[root@10-100-0-30 pod]# kubectl describe pod xxx -n yky
...
    Last State:     Terminated
      Reason:       Error
      Exit Code:    143
      Started:      Thu, 10 Jun 2021 18:51:39 +0800
      Finished:     Thu, 10 Jun 2021 18:52:09 +0800
    Ready:          True
    # 重启的次数
    Restart Count:  4
    # 存活探针的信息
    Liveness:       http-get http://:8111/ delay=0s timeout=1s period=10s #success=1 #failure=3
...

补充

  • 由 kubelet 发起调用
  • 单独配置 readiness 不会使 pod 在失败时进行重启
  • 单独配置 liveness 不会使 pod 在失败时移出 endpoint 列表, 导致请求失败
  • 通常两者一起使用
  • 使用go语言实现探针
    http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
        duration := time.Now().Sub(started)
        // 响应时间超过 10, 返回 500 和 "err: 超时时间"
        if duration.Seconds() > 10 {
            w.WriteHeader(500)
            w.Write([]byte(fmt.Sprintf("error: %v", duration.Seconds())))
        // 反之返回 200 和 "ok"
        } else {
            w.WriteHeader(200)
            w.Write([]byte("ok"))
        }
    })
    
posted @   难德糊涂  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言
点击右上角即可分享
微信分享提示