这类问题我又碰上了一次。Argo Rollouts 1.6 做 canary,执行 kubectl argo rollouts set weight 20 之后看 Prometheus,新版本 Pod 接到的流量接近 100%,rollout 状态显示 Paused 但权重没有生效,重新 set image 再设权重比例仍在 90% 以上。

第一反应是「setWeight 需要 rollout 处于暂停态才生效」,验证下来不成立。

把日志和配置对完,能解释这个现象的基本就这几处。只配了 stableService 没配 canaryService;两个 Service 的 selector 指向同一批 Pod;step 里的 setWeight 被后续自动推进覆盖。

第一件事是查 rollout 的 service 与 step 配置

kubectl get rollout api -o yaml

接着确认 canaryService 指向独立的 selector

kubectl get svc api-stable api-canary -o wide

暂停再设置权重

kubectl argo rollouts pause api && kubectl argo rollouts set weight api 20

等前面都确认过,再核对两个 Service 的 endpoint 数量

kubectl get endpoints api-stable api-canary

命令输出我都留了记录,免得改完记不清原来的值。

改之前先确认了最近有没有人动过配置,避免白查一遍。

这次没动代码,只在配置和运行环境上找原因。

恢复的判定其实很直接。两个 Service 的 endpoint 数约为 4 比 1,Prometheus 里新版本请求占比落在 18% 到 22%。

权重是按 Pod 数近似分配的,副本少的时候 20% 只能落到一个 Pod,实际比例看起来会偏得比较多。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189