Argo Rollouts+Traefik Mesh SMI金丝雀发布副本部署不足与TrafficSplit资源报错
按照预期执行金丝雀发布流程时,实际仅启动1个副本(总规模20%),Rollout资源长期卡在Progressing状态,触发的报错日志如下:
TrafficRoutingErro: the server could not find the requested resource (post trafficsplits.splits.smi-spec.io) TrafficSplitNotCreated: Unable to create traffic Split 'demo-trafficsplit'
问题根因
核心异常由两部分触发:
- 集群内未安装和当前Traefik Mesh版本匹配的SMI TrafficSplit CRD。Argo Rollouts控制器调用API创建TrafficSplit资源时,直接返回“资源不存在”的报错,导致流量路由流程初始化失败,Rollout停留在第一步
setWeight: 20的状态,不会继续推进副本扩容。 - 现有配置存在版本不匹配、冗余定义问题,进一步放大了流程异常:
- 清单中TrafficSplit声明的
apiVersion: split.smi-spec.io/v1alpha3,和多数Traefik Mesh版本默认适配的SMI CRD版本不兼容 - 手动提前创建TrafficSplit资源的操作,和Argo Rollouts自动接管对应资源的逻辑冲突
- 手写的TrafficSplit权重值和发布流程预期完全相反:stable服务分配10%流量、canary服务分配90%流量,不符合第一步20%流量切流的设计
修复步骤
- 校验集群内SMI CRD状态
- 执行
kubectl get crd | grep trafficsplits.smi-spec.io检查CRD是否存在 - 如果查询结果为空,需要手动安装和当前Traefik Mesh版本匹配的SMI CRD,注意对齐CRD定义的apiVersion(多数Traefik Mesh v2.x+版本适配
split.smi-spec.io/v1alpha4,不再兼容v1alpha3) - 如果查询结果非空,确认CRD定义的apiVersion字段,替换清单中不匹配的版本号
- 执行
- 修正配置清单的冗余和错误项
- 从yaml中删除手动声明的TrafficSplit资源段:Argo Rollouts在识别到CRD存在后,会自动根据Rollout配置中指定的
trafficSplitName创建、更新对应的TrafficSplit资源,不需要提前手动定义 - 调整三个Service的selector配置:当前
demo(stable服务)、demo-canary(canary服务)的selector全部写死匹配version: blue的Pod,后续版本切换时会导致流量拆分失效,需要根据Pod版本标签做匹配区分 - 移除和Rollout控制器逻辑重复的流量权重配置,所有权重值交给Rollout的步骤定义自动管控
- 从yaml中删除手动声明的TrafficSplit资源段:Argo Rollouts在识别到CRD存在后,会自动根据Rollout配置中指定的
- 重新触发部署流程
- 修正完成后重新执行
kubectl apply -f applications.yaml,等待Argo CD完成配置同步 - 观察Rollout状态:控制器会自动创建对应版本的TrafficSplit资源,按步骤完成20%权重切流、1分钟暂停、50%权重切流、2分钟暂停的全流程,最终将副本数扩容到预期的4个,退出Progressing状态
- 修正完成后重新执行
补充验证点:如果修正后仍报错,需要检查Traefik Mesh的RBAC权限,确认Argo Rollouts的服务账号有创建、更新TrafficSplit资源的权限
内容的提问来源于stack exchange,提问作者Harou
相关产品推荐
相关产品推荐

