Kubernetes存活探针直接执行curl失效,脚本执行正常的原因
问题:Kubernetes存活探针直接执行curl与脚本执行结果不一致
配置的存活探针直接执行curl命令时失败:
livenessProbe: exec: command: - curl - --fail - -X POST - http://localhost/test - '-d "data"'
执行kubectl describe pods/pod_name得到错误:
Liveness probe failed: % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 7 0 0 100 7 0 62 --:--:-- --:--:-- --:--:-- 63 curl: (22) The requested URL returned error: 400
但将相同命令写入脚本/tmp/a.sh:
curl --fail -X POST http://localhost/test -d "data" exit $?
修改探针为执行脚本后正常:
livenessProbe: exec: command: - sh - /tmp/a.sh
手动进入容器执行curl命令也正常,为何两种执行方式结果不同?
原因分析
核心问题是Kubernetes exec探针的参数解析逻辑和shell脚本的解析逻辑不同:
在探针直接执行curl的配置中,
'-d "data"'会被作为一个完整的参数传递给curl,也就是说curl实际接收到的POST数据是带双引号的字符串"data",而不是预期的data。服务端可能因为接收到不符合格式的参数(包含多余引号),返回400错误。当把命令写入脚本通过
sh执行时,shell会对参数进行解析:-d "data"中的双引号会被shell移除,curl实际收到的POST数据是data,和手动执行时的参数一致,所以请求能被服务端正常处理,探针通过。
如果要让探针直接执行curl就正常,需要去掉参数里的额外引号,修改配置为:
livenessProbe: exec: command: - curl - --fail - -X POST - http://localhost/test - -d - data
或者保留单引号但去掉内部的双引号:
livenessProbe: exec: command: - curl - --fail - -X POST - http://localhost/test - '-d data'
这样curl就能收到正确的POST数据,探针即可正常工作。
内容的提问来源于stack exchange,提问作者Log
相关产品推荐
相关产品推荐

