事情本身不复杂,线索都在日志里。在预发环境演练网络延迟,配置里连的却是生产数据库地址,注入脚本把生产连接池打满,线上出现三十秒抖动,复盘时才发现连接串没换。

第一反应是「演练脚本没校验目标环境标识」,验证下来不成立。

把日志和配置对完,能解释这个现象的基本就这几处。预发配置沿用了生产的连接串。还有一种是环境之间没有网络策略隔离。

少数情况下是变更评审只看了脚本没看配置。

演练前先打印实际连接目标

python show_targets.py --config conf/pre.yaml | grep -i -E 'host|db'

接着把预发出口限制到只有演练网段

kubectl apply -f networkpolicy-deny-egress.yaml

脚本里加环境断言,不匹配直接退出

assert 'prod' not in target_host, 'refuse to run against production'

演练前用只读请求确认不会写库

curl -s http://pre-api:8080/healthz | jq '{env:.env, db:.db_host}'

改完先别撤,确认这几项。演练只命中预发实例,生产连接数没有变化,脚本在环境不匹配时直接中止并打印原因。

容易忽略的是,演练最贵的成本是误伤生产,跑之前花一分钟核连接串,比事后写复盘报告划算得多。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189