求助:基于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版本没问题后,按以下步骤操作即可:
- 更新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
- 删除Web服务v1版本的Deployment资源(就是你部署v1 Pod的那个配置)
- (可选)更新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
相关产品推荐
相关产品推荐

