当前位置: 首页 > java >正文

[k8s]--exec探针详细解析

在 Kubernetes 中,exec 探针是一种通过 在容器内执行命令 来检测容器健康状态的机制。它的核心逻辑是:执行命令后,若命令返回值为 0(表示成功),则认为容器健康;否则认为不健康


一、exec 探针的机制

  1. 执行命令
    Kubernetes 的 kubelet 会进入目标容器内部,运行指定的命令(如 cat /tmp/healthy)。

    • 命令的执行环境与容器内的 shell 环境一致(例如 /bin/sh)。
    • 如果命令执行成功(返回码为 0),探针认为容器健康;否则认为不健康。
  2. 触发时机

    • 存活探针(livenessProbe):定期检查容器是否存活。如果失败,Kubernetes 会重启容器。
    • 就绪探针(readinessProbe):检查容器是否准备好接收流量。如果失败,Pod 会被标记为 NotReady,不会接收流量。
    • 启动探针(startupProbe):在容器启动阶段使用,确保容器初始化完成后再启用其他探针。
  3. 资源消耗
    每次执行命令会启动一个新的进程,可能对容器性能有一定影响(尤其是高频探测时)。


二、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> 可以是 livenessProbereadinessProbestartupProbe
  • 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)

四、注意事项

  1. 局限性

    • 仅能验证命令退出码:无法直接检测服务的实际可用性(例如数据库连接是否正常)。
    • 误判风险:如果命令本身有缺陷(如文件存在但服务已崩溃),可能导致误判。
  2. 安全风险

    • 执行命令可能暴露敏感信息(如日志文件中的密码)。
    • 建议避免执行复杂或危险的命令。
  3. 替代方案

    • HTTP 探针:通过 HTTP 请求检测服务状态(更高效且通用)。
    • TCP 探针:通过 TCP 连接检测端口是否开放(适合无 HTTP 接口的服务)。
  4. 最佳实践

    • 简单场景:使用 cat /path/to/file 快速验证文件是否存在。
    • 复杂场景:结合 curlgrep 等工具验证服务接口。
    • 脚本封装:将复杂逻辑封装到脚本中,提高可维护性。

五、总结

特性说明
检测方式执行命令,通过退出码判断健康状态
适用场景文件存在性检查、简单命令验证、自定义脚本
优点灵活,可适配任意命令逻辑
缺点性能开销较大,依赖命令实现,可能误判

如果你需要更高效的健康检查,建议优先使用 HTTP 探针TCP 探针。接下来有时间也会研究一下这两种探针。

http://www.xdnf.cn/news/14214.html

相关文章:

  • java常见第三方依赖以及相关安全问题
  • http1.x VS http2.x 协议
  • Spring Cloud Alibaba 中间件
  • 硬编码(修改RIP相关指令)
  • HTML+CSS 半透明登录框
  • (LeetCode每日一题) 2566. 替换一个数字后的最大差值 ( 贪心 )
  • 安防市场的中小企业突围——从竞品分析到破局路径的思考
  • Spring Boot中Controller层规划与最佳实践详解
  • 【北京迅为】iTOP-4412精英版使用手册-第二十一章 延时函数专题
  • Python爬虫-批量爬取快手视频并将视频下载保存到本地
  • BeckHoff PLC --> 料筐(KLT Box)自动对中与抓取程序分析
  • Deep Research Agent的深度与广度如何保证
  • OSGI 是什么,有哪些具体应用、java8、9、10、11比较
  • C++操作系统与网络编程(针对特定岗位)
  • SpringBoot打包运行原理和加载机制原理
  • 从大数据到大模型:我们是否在重蹈覆覆辙
  • 一文详解前缀和:从一维到二维的高效算法应用
  • Java相关-链表-设计链表-力扣707
  • JS进阶 Day02
  • 在tensorrt engine中提高推理性能小记
  • 互联网大厂Java求职面试:云原生架构与微服务设计中的复杂挑战
  • Flask文件上传与异常处理完全指南
  • create_react_agent + MCP tools
  • TDengine 如何从 2.x 迁移到 3.0
  • Java并发编程实战 Day 22:高性能无锁编程技术
  • JAVA关键字-final
  • Semaphore入门案例
  • Java线程池ThreadPoolExecutor的状态
  • ERROR 1396 (HY000): Operation ALTER USER failed for ‘root‘@‘%‘
  • 基于 C 语言的图书管理系统开发详解​