在 Kubernetes 中,exec
探针是一种通过 在容器内执行命令 来检测容器健康状态的机制。它的核心逻辑是:执行命令后,若命令返回值为 0(表示成功),则认为容器健康;否则认为不健康。
一、exec
探针的机制
-
执行命令
Kubernetes 的kubelet
会进入目标容器内部,运行指定的命令(如cat /tmp/healthy
)。- 命令的执行环境与容器内的 shell 环境一致(例如
/bin/sh
)。 - 如果命令执行成功(返回码为 0),探针认为容器健康;否则认为不健康。
- 命令的执行环境与容器内的 shell 环境一致(例如
-
触发时机
- 存活探针(livenessProbe):定期检查容器是否存活。如果失败,Kubernetes 会重启容器。
- 就绪探针(readinessProbe):检查容器是否准备好接收流量。如果失败,Pod 会被标记为
NotReady
,不会接收流量。 - 启动探针(startupProbe):在容器启动阶段使用,确保容器初始化完成后再启用其他探针。
-
资源消耗
每次执行命令会启动一个新的进程,可能对容器性能有一定影响(尤其是高频探测时)。
二、exec
探针的检测方式
1. 基础用法
检测某个文件是否存在且可读:
readinessProbe:exec:command:- cat- /tmp/healthy
- 逻辑:
cat
命令尝试读取/tmp/healthy
文件。如果文件存在且可读(命令返回 0),则认为容器健康。
2. 组合命令
通过 Shell 脚本组合多个命令进行检测:
livenessProbe:exec:command:- sh- -c- "curl -s http://localhost:8080/healthz | grep 'OK'"
- 逻辑:使用
sh -c
执行一段 Shell 命令,检查 HTTP 接口返回结果是否包含 “OK”。如果包含(命令返回 0),则认为健康。
3. 脚本检测
执行自定义脚本文件:
readinessProbe:exec:command:- /bin/sh- /opt/health_check.sh
- 逻辑:运行
/opt/health_check.sh
脚本,脚本的退出码决定探针结果。
三、exec
探针的写法(YAML 配置)
1. 基本结构
<probe_type>:exec:command:- <command>- <arg1>- <arg2>...
<probe_type>
可以是livenessProbe
、readinessProbe
或startupProbe
。command
是一个数组,第一个元素是命令名,后续是参数。
2. 完整示例
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imagelivenessProbe:exec:command:- sh- -c- "curl -s http://localhost:8080/healthz | grep 'OK'"initialDelaySeconds: 5 # 容器启动后等待 5 秒开始探测periodSeconds: 10 # 每 10 秒探测一次
3. 关键参数说明
参数 | 作用 | 默认值 |
---|---|---|
initialDelaySeconds | 容器启动后等待多少秒开始首次探测 | 0 |
periodSeconds | 探测间隔时间(单位秒) | 10 |
timeoutSeconds | 探测超时时间(单位秒) | 1 |
failureThreshold | 连续失败多少次后判定为失败 | 3(存活探针必须为 1) |
successThreshold | 连续成功多少次后判定为成功 | 1(存活探针必须为 1) |
四、注意事项
-
局限性
- 仅能验证命令退出码:无法直接检测服务的实际可用性(例如数据库连接是否正常)。
- 误判风险:如果命令本身有缺陷(如文件存在但服务已崩溃),可能导致误判。
-
安全风险
- 执行命令可能暴露敏感信息(如日志文件中的密码)。
- 建议避免执行复杂或危险的命令。
-
替代方案
- HTTP 探针:通过 HTTP 请求检测服务状态(更高效且通用)。
- TCP 探针:通过 TCP 连接检测端口是否开放(适合无 HTTP 接口的服务)。
-
最佳实践
- 简单场景:使用
cat /path/to/file
快速验证文件是否存在。 - 复杂场景:结合
curl
、grep
等工具验证服务接口。 - 脚本封装:将复杂逻辑封装到脚本中,提高可维护性。
- 简单场景:使用
五、总结
特性 | 说明 |
---|---|
检测方式 | 执行命令,通过退出码判断健康状态 |
适用场景 | 文件存在性检查、简单命令验证、自定义脚本 |
优点 | 灵活,可适配任意命令逻辑 |
缺点 | 性能开销较大,依赖命令实现,可能误判 |
如果你需要更高效的健康检查,建议优先使用 HTTP 探针 或 TCP 探针。接下来有时间也会研究一下这两种探针。