You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Traefik v2在K8s两命名空间实现金丝雀发布时权重失效问题咨询

Traefik v2跨命名空间金丝雀发布权重不生效问题分析与解决

问题原因

你当前的配置逻辑存在核心错误,导致权重无法生效:

  • 多IngressRoute冲突:在ns-A和ns-B两个命名空间分别创建了匹配规则完全一致的IngressRoute,Traefik会将这些路由视为独立条目,而非统一的加权后端组。此时流量会在两个独立路由对应的服务间进行默认轮询,完全忽略你设置的权重值。
  • TraefikService作用范围错误:每个命名空间的TraefikService仅包含自身命名空间的服务,权重配置仅对该TraefikService内部的服务(此处仅单个服务)生效,无法实现跨TraefikService的流量加权分配。Traefik的加权轮询策略仅针对同一个TraefikService的services列表内的多个后端生效。

解决方案

要实现跨命名空间的金丝雀发布,需要将两个命名空间的服务统一纳入同一个TraefikService的加权配置中,并通过单一IngressRoute路由流量。

步骤1:清理重复配置

删除ns-A和ns-B中重复的IngressRoute,只保留一个(建议放在Traefik所在命名空间,或任意一个业务命名空间)。

步骤2:创建统一的加权TraefikService

创建一个包含跨命名空间服务的TraefikService,通过namespace字段明确指定另一个命名空间的服务,并设置对应权重。示例如下(以放在ns-A为例):

apiVersion: traefik.containo.us/v1alpha1
kind: TraefikService
metadata:
  name: canary-wrr
  namespace: ns-A
spec:
  weighted:
    services:
      - name: server
        namespace: ns-A
        port: 3333
        weight: 80  # 旧版本服务流量占比
      - name: server
        namespace: ns-B
        port: 3333
        weight: 20  # 新版本服务流量占比

步骤3:配置IngressRoute指向统一TraefikService

修改保留的IngressRoute,将服务指向上述统一的TraefikService:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: server-ingressroute
  namespace: ns-A
spec:
  routes:
  - kind: Rule
    match: Host(`testapp.intra`) && PathPrefix(`/`)
    services:
    - name: canary-wrr
      kind: TraefikService
      namespace: ns-A

关键注意事项

  • 权限检查:确保Traefik使用的ServiceAccount拥有访问ns-A和ns-B两个命名空间的权限,能够获取这两个命名空间内的Service、Endpoint资源。
  • 权重逻辑:Traefik按权重的相对比例分配流量,权重总和不影响比例(如80/20与40/10的流量分配比例一致)。
  • 动态调整:后续只需修改TraefikService的weight字段即可调整金丝雀发布的流量比例,无需修改IngressRoute。

内容的提问来源于stack exchange,提问作者Doul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:45:01