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

求助:基于Istio在K8s集群内实现服务加权路由配置

解决Istio中API服务加权路由及Web服务版本路由的完整方案

嘿,我来帮你搞定这个Istio流量路由的问题!看起来你已经把Web服务的版本路由配置得很到位了,API服务的加权路由没生效,核心原因是少了DestinationRule这个关键配置——Istio得靠它来识别哪些Pod属于v1,哪些属于v2,才能按权重分配流量。咱一步步来完善所有配置:

一、问题根源:为什么API加权路由不生效?

你的API VirtualService里已经写了weight:95和weight:5,但Istio不知道subset:v1和subset:v2对应哪些Pod。必须通过DestinationRule给服务的版本子集绑定Pod标签,路由规则才能真正落地。

二、完整配置实现所有需求

1. Web服务配置(满足需求1、2,补充DestinationRule方便后续切换)

你原来的Web VirtualService已经完美实现了按用户路由的需求,咱只需要加个DestinationRule来明确v1/v2对应的Pod标签,后续全量切换版本会更顺畅:

# Web服务的DestinationRule:定义v1/v2版本的Pod标签映射
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: web-dr
spec:
  host: web-svc
  subsets:
  - name: v1
    labels:
      version: v1 # 注意:这个标签要和Web v1版本Pod的metadata.labels一致
  - name: v2
    labels:
      version: v2 # 同上,对应Web v2版本Pod的标签
---
# 你原有的Web VirtualService(无需修改,已满足需求1、2)
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: web-vs
spec:
  hosts:
  - web.example.com
  http:
  - match:
    - headers:
        end-user:
          exact: test-user
    route:
    - destination:
        host: web-svc
        subset: v2
  - route:
    - destination:
        host: web-svc
        subset: v1
---
# 你原有的Web Service(无需修改)
apiVersion: v1
kind: Service
metadata:
  name: web-svc
  labels:
    app: web
spec:
  ports:
  - name: http
    port: 3000
    targetPort: 3000
  selector:
    app: web

2. API服务配置(补全DestinationRule,实现需求4的95%/5%流量拆分)

给API服务加上DestinationRule,绑定v1/v2的Pod标签,你的加权路由规则马上就能生效:

# API服务的DestinationRule:定义v1/v2版本的Pod标签映射
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: api-dr
spec:
  host: api-svc
  subsets:
  - name: v1
    labels:
      version: v1 # 对应API v1版本Pod的标签
  - name: v2
    labels:
      version: v2 # 对应API v2版本Pod的标签
---
# 你原有的API VirtualService(无需修改,添加DestinationRule后自动生效)
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: api-vs
spec:
  hosts:
  - api-svc
  http:
  - route:
    - destination:
        host: api-svc
        subset: v1
        weight: 95
    - destination:
        host: api-svc
        subset: v2
        weight: 5
---
# 你原有的API Service(无需修改)
apiVersion: v1
kind: Service
metadata:
  name: api-svc
  labels:
    app: api
spec:
  ports:
  - name: http
    port: 8000
    targetPort: 8000
  selector:
    app: api

三、需求3的落地步骤(QA验证后全量切换Web到v2并删除v1)

当QA团队确认Web v2版本没问题后,按以下步骤操作即可:

  1. 更新Web的VirtualService,把所有流量都导到v2:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: web-vs
spec:
  hosts:
  - web.example.com
  http:
  - route:
    - destination:
        host: web-svc
        subset: v2
  1. 删除Web服务v1版本的Deployment资源(就是你部署v1 Pod的那个配置)
  2. (可选)更新Web的DestinationRule,移除v1子集的定义,清理冗余配置

几个关键提醒

  • 务必确保你的Web和API Pod都带有对应的version:v1或version:v2标签,不然DestinationRule找不到对应的Pod,路由规则就是空谈!
  • Web服务内部调用api-svc的时候,因为API的VirtualService监听的就是api-svc这个服务名,所以会自动应用95%/5%的加权规则,完全不用额外配置~
  • 配置完可以用istioctl analyze命令扫一遍,检查有没有语法错误或者配置冲突,确保Istio能正确解析你的路由规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:06:15