为何K8s存活探针Exec命令需指定sh -c而非直接使用命令?
问题原因分析
为什么直接配置会报错?
Kubernetes的exec探针command字段,本质是直接调用操作系统的exec系统调用——它会把数组第一个元素当作独立可执行文件的路径/名称去$PATH里查找,后面的元素作为该程序的参数。
你写的exit $(test $(date +%H) -eq 3 && echo 1 || echo 0)是一整段shell脚本:
exit是shell的内置命令,不是独立可执行文件,找不到对应的二进制程序;$(...)命令替换、&&/||逻辑运算符都是shell语法特性,Kubernetes不会自动启动shell解析这些语法,只会把整个字符串当作命令名去查找,自然会报“可执行文件未找到”的错误。
而用sh -c包裹时,实际是启动sh这个可执行程序,把后面的字符串作为sh的命令参数——shell会负责解析内置命令、语法逻辑,所以能正常执行你的判断逻辑。
无需指定(ba)sh -c的场景
只有当你要执行的是独立可执行文件,且不需要任何shell语法特性(比如命令替换、管道、逻辑运算符、环境变量解析)时,才可以直接配置:
- 直接执行系统自带的独立可执行程序(如
ls、cat,前提是容器内存在这些二进制文件):livenessProbe: exec: command: - ls - /app/health.txt - 执行自定义的独立脚本/二进制程序(脚本需要有可执行权限,且开头有
#!/bin/sh这类shebang):livenessProbe: exec: command: - /app/custom-healthcheck.sh
注意:如果你的逻辑需要用到shell特性(比如判断、变量、管道),哪怕是简单的test命令,都必须通过sh -c(或bash -c,如果容器内有bash)包裹执行。
内容的提问来源于stack exchange,提问作者Aurimas Stands with Ukraine
相关产品推荐
相关产品推荐

