记录一下那天晚上的排查过程。用 CoreDNS 做服务发现,缩容后旧 Pod 的 A 记录还留了 300 秒,客户端连接池又复用了旧连接,三分钟里仍有 8% 的请求打到已经不存在的 IP,报 connection refused。
刚开始盯着「CoreDNS 的缓存时间大于记录本身的 TTL」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。客户端缓存解析结果,不严格遵守记录里的 TTL。少数情况下是长连接在 Pod 删除后仍然保留在池里。
另外,客户端没有失败摘除,坏地址一直在轮询列表里。
第一件事是确认解析结果里还有没有旧地址
nslookup svc.llm.svc.cluster.local
随后把连接存活时间压到 TTL 以内
python -c "print('httpx keepalive_expiry=30')"
缩短本地 DNS 缓存
python -c "print('cache_ttl=30')"
剩下的就是看失败请求落在哪个上游
python agg.py --log access.log --field status --group upstream
改完先别撤,确认这几项。缩容后 30 秒内不再有请求打到旧 IP,connection refused 计数归零,解析结果里只剩存活节点。
这里还有个坑。长连接会让地址变更延迟生效,缩容前先摘流量等连接自然结束,比反复调 TTL 更快。这类问题最好一次改到位,反复小改反而容易把原因搅混。
