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")) } })
欢迎加 1092845214 交流沟通呀~
本文来自博客园,作者:难德糊涂,转载请注明原文链接:https://www.cnblogs.com/yangkaiyue/p/18233186
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言