Kubernetes livenessProbe exec命令if语句环境变量不生效问题求助
问题原因
- 你在YAML的块标量(
|-标识的多行内容)外层额外包裹了双引号,一方面导致整个shell脚本被sh当成单个字符串命令执行,触发not found报错;另一方面双引号内的${变量名}会被Kubernetes提前解析为集群内置的环境变量替换,而K8s中不存在used、thresh、health这些自定义变量,所以全部被替换为空值,最终if语句就变成了日志里的[[ -gt || -ne 200 ]]格式。 [[ ]]是Bash专属的语法,你指定的执行解释器是sh,大部分容器镜像默认的sh是轻量的dash,不支持该语法,也会导致执行异常。
修复方案
直接使用以下修改后的livenessProbe配置即可:
livenessProbe: exec: command: - sh - -c - |- used=$(awk '{ print int($1/1.049e+6) }' /sys/fs/cgroup/memory/memory.usage_in_bytes) thresh=$(awk '{ print int( $1 / 1.049e+6 * 0.9 ) }' /sys/fs/cgroup/memory/memory.limit_in_bytes) health=$(curl -s -o /dev/null --write-out "%{http_code}" http://localhost:8080/health) if [ ${used} -gt ${thresh} -o ${health} -ne 200 ]; then exit 1; fi initialDelaySeconds: 240 periodSeconds: 60 failureThreshold: 3 timeoutSeconds: 10
核心修改点说明
- 移除了包裹整个脚本的外层双引号,避免K8s提前解析变量、避免脚本被当成单个命令执行
- 将Bash专属的
[[ ]]语法替换为POSIX标准的[ ]语法,逻辑或运算符||替换为适配[ ]的-o,兼容sh执行环境 - 如果你的容器镜像内置了Bash,也可以将
sh替换为bash,保留[[ ${used} -gt ${thresh} || ${health} -ne 200 ]]的写法即可
内容的提问来源于stack exchange,提问作者david_beauchamp
相关产品推荐
相关产品推荐

