灰度阶段只把一部分流量导向新节点时,未被切到的那台机器往往仍跑着旧配置;全量发布把流量打散到全部节点后,它才第一次暴露。要避免这种情况,灰度必须按节点而非按流量抽样,并在放量前对全部节点做一次只读的IP与配置一致性检查。
假设一个场景:某站点有六台后端服务器,灰度策略是“随机放 20% 流量到新版本”,其余 80% 仍走旧版本。这个做法看起来稳妥,但它有一个盲点——流量是随机分配的,不是按服务器分配的。如果负载均衡的会话保持或权重设置让某台服务器长期只接到很少的请求,它可能在整个灰度期都没有被真正验证过。
更隐蔽的情况是:这台机器本身配置就和其他节点不同,比如 hosts 文件里写死了一个旧的内网地址,或者防火墙规则少开了一个端口。灰度期它没被切到,一切正常;全量发布后权重拉平,请求打上来,它返回的 IP 或响应内容与其余节点不一致,问题才浮现。
所以灰度没暴露问题,不等于问题不存在,只说明抽样方式没有覆盖到全部节点。判断依据很简单:灰度覆盖的是流量比例,还是节点集合?如果是前者,就必须补一次全节点检查。
在把权重从 20% 拉到 100% 之前,插入一个独立动作:对全部节点的服务器IP检测做一次只读比对。这里说的检测不是扫描端口或压测,而是确认三件事——每个节点对外呈现的 IP 是否在预期集合内、该 IP 对应的服务是否返回一致的内容特征、节点上的监听配置是否与发布清单一致。
具体可以这样操作:从负载均衡或调度层导出当前全部后端节点列表,逐个发起一次带标识的请求,记录返回的响应头、可见内容摘要和实际出口 IP。把结果整理成一张按节点排列的表,任何一行与多数行不同,就是候选例外。
这一步的产出会直接决定下一步:如果所有节点一致,可以按计划放量;如果发现某台节点 IP 不在预期集合内,先不要放量,而是回到该节点确认它是配置漂移、证书不同步,还是被错误地加进了后端池。动作的结果影响后续判断,而不是走个形式。
全节点比对会出现不少差异,需要区分。以下三类差异值得停下来处理:
而以下差异通常可以先放行:请求耗时的小幅波动、单次请求的临时超时、不同节点因地理位置产生的正常延迟差。这些属于运行时噪声,不构成发布阻塞,但应记录下来,放量后继续观察是否放大。
这取决于例外节点的数量和它承载的流量角色。两种情况成立的条件不同:
关键判断依据是:异常是孤立的还是成片的。孤立异常通常是单机问题,摘除即可;成片异常说明发布流程或配置源有问题,必须先修流程再修机器。
全量发布完成后,服务器IP检测不应立刻停掉。把检测频率从发布前的逐节点比对,降为按固定间隔对全部节点做一次抽样,重点看出口 IP 是否发生漂移、响应特征是否仍一致。如果放量后某台节点的检测结果从一致变为不一致,说明它可能在发布后被其他变更影响,而不是发布本身的问题。
需要说明的是,检测结果一致只代表当前这次比对没有发现差异,不代表节点永久正确。配置漂移可能在任何时间发生,所以检测的价值在于建立基线,并在每次变更前后做对照。放量后的第一次全节点检测,就是新的基线。