简介
ASM流量泳道依托服务网格的虚拟服务、目标规则,以及ASM提供的TrafficLabel、ASMHeaderPropagation等能力来提供全链路上下文的流量隔离,常用于全链路灰度场景。
在使用流量泳道时,流量泳道会为您自动生成虚拟服务,这些虚拟服务属于系统管理、禁止进行人为变更,以防止泳道中的流量走向出现问题。当您想为泳道创建的虚拟服务加入其他的能力(如超时、重试、故障注入等)时,可以通过编辑ASMSwimLaneGroup CR的方式完成。
实践步骤
- 参考文档 搭建宽松模式泳道的示例环境。
- 使用kubectl编辑asmswimlanegroup CR,为指定的服务加入路由以外的虚拟服务能力。本文中,以为mockc服务加入故障注入能力为例:
apiVersion: istio.alibabacloud.com/v1 kind: ASMSwimLaneGroup metadata: finalizers: - asmswimlanegroup-operator.finializer.alibabacloud.com name: test spec: ingress: gateway: name: ingressgateway namespace: istio-system type: ASM ingressRouting: weightedRoutingRule: {} isPermissive: true permissiveModeConfiguration: fallbackTarget: s1 routeHeader: version traceHeader: my-trace-id services: - cluster: id: xxx name: xxx name: mocka namespace: default - cluster: id: xxx name: xxx name: mockb namespace: default - cluster: id: xxx name: xxx name: mockc namespace: default httpRoutePatch: # 添加httpRoutePatch字段 fault: abort: httpStatus: 500 percentage: value: 50
其中,httpRoutePatch中可以指定虚拟服务的HTTPRoute中的绝大部分字段,以实现包括超时、故障注入、重写、重试等能力;但为防止破坏泳道流量规则,您无法指定match、name、route、delegate字段。
- 查看相关虚拟服务已修改
使用kubectl获取泳道组为您自动生成的针对mockc的虚拟服务
kubectl get virtualservice -n istio-system trafficlabel-vs-test-default-mockc -oyaml
预期输出
apiVersion: networking.istio.io/v1 kind: VirtualService metadata: labels: asm-system: 'true' provider: asm swimlane-group: test name: trafficlabel-vs-test-default-mockc namespace: istio-system spec: hosts: - mockc.default.svc.cluster.local http: - fault: abort: httpStatus: 500 percentage: value: 50 name: default route: - destination: host: mockc.default.svc.cluster.local subset: $asm-label fallback: target: host: mockc.default.svc.cluster.local subset: s1
可以看到虚拟服务中已经加入了故障注入相关的字段。
- 确认虚拟服务能力生效
使用文档 中给出的验证方式,重新验证服务访问:
for i in {1..100}; do curl -H 'version: s2' -H'my-trace-id: x000'$i http://$ASM_GATEWAY_IP:8000/mock ; echo ''; sleep 1; done;
预期输出
-> mocka(version: v2, ip: 10.1.0.239)-> mockb(version: v1, ip: 10.1.0.160)fault filter abort -> mocka(version: v2, ip: 10.1.0.239)-> mockb(version: v1, ip: 10.1.0.160)fault filter abort -> mocka(version: v2, ip: 10.1.0.239)-> mockb(version: v1, ip: 10.1.0.160)-> mockc(version: v2, ip: 10.1.0.237) -> mocka(version: v2, ip: 10.1.0.239)-> mockb(version: v1, ip: 10.1.0.160)-> mockc(version: v2, ip: 10.1.0.237) -> mocka(version: v2, ip: 10.1.0.239)-> mockb(version: v1, ip: 10.1.0.160)-> mockc(version: v2, ip: 10.1.0.237) -> mocka(version: v2, ip: 10.1.0.239)-> mockb(version: v1, ip: 10.1.0.160)fault filter abort -> mocka(version: v2, ip: 10.1.0.239)-> mockb(version: v1, ip: 10.1.0.160)-> mockc(version: v2, ip: 10.1.0.237) -> mocka(version: v2, ip: 10.1.0.239)-> mockb(version: v1, ip: 10.1.0.160)-> mockc(version: v2, ip: 10.1.0.237) -> mocka(version: v2, ip: 10.1.0.239)-> mockb(version: v1, ip: 10.1.0.160)-> mockc(version: v2, ip: 10.1.0.237) -> mocka(version: v2, ip: 10.1.0.239)-> mockb(version: v1, ip: 10.1.0.160)-> mockc(version: v2, ip: 10.1.0.237) -> mocka(version: v2, ip: 10.1.0.239)-> mockb(version: v1, ip: 10.1.0.160)fault filter abort -> mocka(version: v2, ip: 10.1.0.239)-> mockb(version: v1, ip: 10.1.0.160)fault filter abort -> mocka(version: v2, ip: 10.1.0.239)-> mockb(version: v1, ip: 10.1.0.160)-> mockc(version: v2, ip: 10.1.0.237) -> mocka(version: v2, ip: 10.1.0.239)-> mockb(version: v1, ip: 10.1.0.160)fault filter abort
可以看到,针对mockc服务的故障注入已经在泳道环境下生效。