Kubernetes:配置文件中引用环境变量失效(探针场景)
问题描述
按照Kubernetes官方文档的说明,配置里引用环境变量要用$(ENV_VAR)语法,但我碰到个问题:就绪探针(Readiness Probe)和存活探针(Liveness Probe)的API请求里,拿到的令牌值是$(KUBERNETES_AUTH_TOKEN),不是预期的abcdefg。我的配置如下:
containers: env: - name: KUBERNETES_AUTH_TOKEN value: "abcdefg" lifecycle: preStop: exec: command: - "sh" - "-c" - | curl -H "Authorization: $(KUBERNETES_AUTH_TOKEN)" -H "Content-Type: application/json" -X GET http://localhost:9443/pre-stop readinessProbe: failureThreshold: 3 httpGet: path: /status port: 9853 scheme: HTTP httpHeaders: - name: Authorization value: $(KUBERNETES_AUTH_TOKEN) livenessProbe: failureThreshold: 3 httpGet: path: /status port: 9853 scheme: HTTP httpHeaders: - name: Authorization value: $(KUBERNETES_AUTH_TOKEN)
解决方案
核心原因是:Kubernetes的httpGet探针里的httpHeaders字段不支持直接用$(ENV_VAR)解析环境变量。preStop钩子能正常生效是因为它用了exec模式,通过shell执行命令,shell会自动替换环境变量;但httpGet的header值会被直接当作字符串发送,不会做变量替换。
给你两种解决办法:
办法一:换成exec类型探针
把httpGet探针改成exec探针,用curl命令发起请求,这样shell就能正常解析环境变量了。修改后的配置示例:
readinessProbe: failureThreshold: 3 exec: command: - "sh" - "-c" - | curl -H "Authorization: $(KUBERNETES_AUTH_TOKEN)" -H "Content-Type: application/json" -X GET http://localhost:9853/status livenessProbe: failureThreshold: 3 exec: command: - "sh" - "-c" - | curl -H "Authorization: $(KUBERNETES_AUTH_TOKEN)" -H "Content-Type: application/json" -X GET http://localhost:9853/status
办法二:用Downward API传递变量到文件(复杂方案)
如果一定要用httpGet探针,可以通过Downward API把环境变量写入容器内的某个文件,再借助sidecar容器或者自定义初始化脚本,把文件里的令牌值注入到探针请求头里。不过这种步骤多,不如办法一直接,优先推荐办法一。
内容的提问来源于stack exchange,提问作者limo_756
相关产品推荐
相关产品推荐

