深色模式
配置错误排查
摘要:多数"配置不生效"其实是配置来源优先级搞错了。本文先建立"实际生效值优先于配置文件"的排查原则,再逐个核对配置中心、环境变量、挂载文件与启动参数,最后列出 YAML 类型陷阱。
适用环境
bash
kubectl version --short 2>/dev/null || kubectl version
cat /proc/<PID>/environ 2>/dev/null | tr '\0' '\n' | head -201
2
2
排障步骤
第 1 步:以"进程实际读到的值"为准
bash
cat /proc/<PID>/environ | tr '\0' '\n' | grep -iE 'config|profile|env|addr|url'
ps -o args= -p <PID>1
2
2
先看环境变量与启动参数,再看配置文件,避免被"文件里明明是对的"误导。
第 2 步:核对配置来源的优先级
典型优先级(由高到低):命令行参数 > 环境变量 > 配置中心 > 本地配置文件 > 代码默认值。
bash
kubectl get deploy <name> -n <ns> -o jsonpath='{.spec.template.spec.containers[*].env}' | tr ',' '\n'
kubectl get deploy <name> -n <ns> -o jsonpath='{.spec.template.spec.containers[*].args}' | tr ',' '\n'1
2
2
第 3 步:确认挂载的 ConfigMap 内容
bash
kubectl get cm <cm> -n <ns> -o yaml
kubectl exec -it <pod> -n <ns> -- cat /etc/app/application.yml1
2
2
ConfigMap 挂载更新有延迟
以 volume 方式挂载时,kubelet 定期同步,通常有数十秒延迟;使用 subPath 的挂载永远不会更新,必须重启 Pod。
第 4 步:配置中心侧核对
bash
curl -sS http://<config-server>/<app>/<profile> | head -40
grep -iE 'config|nacos|apollo' /var/log/app/app.log | tail -201
2
2
配置中心灰度未全量
按 IP 或实例灰度推送时,只有部分实例读到新配置,表现为"部分实例异常且重启无效"。核对时务必逐实例确认。
第 5 步:检查 YAML 解析陷阱
bash
kubectl get cm <cm> -n <ns> -o jsonpath='{.data}' | head -201
YAML 的隐式类型转换
no/on/yes 会被解析为布尔值;0123 可能被当作八进制;缩进错误不会报语法错而是静默变成另一种结构。这类问题配置校验阶段很难发现。
第 6 步:确认热更新是否真的生效
bash
kubectl exec -it <pod> -n <ns> -- ls -l --time-style=full-iso /etc/app/
grep -i 'refresh' /var/log/app/app.log | tail -101
2
2
验证
bash
kubectl exec -it <pod> -n <ns> -- cat /etc/app/application.yml | grep -A 3 '<关键配置项>'
curl -sS http://127.0.0.1:8080/actuator/env/<配置项> 2>/dev/null
kubectl logs <pod> -n <ns> --tail=201
2
3
2
3
常见坑
配置文件改了但应用没重启
非热更新的配置项必须重启进程,改文件本身不改变运行中的值。
多份配置文件互相覆盖
application.yml 与 application-prod.yml、配置中心与本地文件同时存在时,生效值取决于加载顺序,容易误判。
容器内看到的是挂载前的目录内容
挂载会覆盖原目录,若挂载路径配置错误,会看到"文件存在但内容不对"。
为快速恢复直接回滚全部配置
配置回滚可能同时撤销其它人刚上的正常变更。应只回滚与故障相关的配置项,并保留变更记录。