ASM支持通过编写VirtualService和DestinationRule等资源,实现微服务的无侵入的流量治理能力,包括流量路由、限流、熔断、镜像流量等功能。本文介绍如何使用ASM路由级熔断功能。
前提条件
- 已下载本文所需配置文件,具体请参见配置文件。 
- 已创建ASM专业版实例,且版本为v1.13.4及以上。具体操作,请参见创建ASM实例。 
- 已添加集群到ASM实例。具体操作,请参见添加集群到ASM实例。 
- 已部署入口网关。具体操作,请参见创建入口网关。 
- 已创建Bookinfo和Nginx服务。具体操作,请参见在ASM实例关联的集群中部署应用。 
- 已通过kubectl连接ASM实例。具体操作,请参见通过控制面kubectl访问Istio资源。 
- 已部署网关规则。具体操作,请参见管理网关规则。 
- 已创建虚拟服务。具体操作,请参见管理虚拟服务。 
- 已安装流量加压工具。具体操作,请参见hey。 
背景信息
ASM支持在流量策略中配置熔断功能,在网络访问超出熔断配置时能够拒绝请求。在DestinationRule资源中,TrafficPolicy字段下有以下两个熔断配置项:
- ConnectionPoolSettings:为服务配置连接的数量。例如控制请求的最大数量,挂起请求,重试或者超时。
- OutlierDetection:用于从负载均衡池中剔除不健康的实例。
社区Istio提供的DestinationRule熔断配置如下,更多信息,请参见destination-rule。
社区Istio提供的熔断功能,Envoy通过连接池实现对上游集群的限流熔断,通过周期性的动态异常检测来确定上游集群中的某些主机是否异常。如果发现异常,则将该主机从连接池中隔离出去。这本质上是针对上游主机整体的熔断。有以下两个缺点:
- 仅支持服务级别熔断,不支持某个API进行限流熔断。 
- 在路由规则后起作用,无法做到流量分发之前进行限流熔断。 
基于以上问题,ASM在数据面Envoy侧进行了Filter链的扩展,通过com.aliyun.break filter支持路由级熔断能力,控制面通过 ASMCircuitBreaker进行用户侧的透出。
本文以Bookinfo和Httpbin为例模拟慢请求和错误请求。其中,Bookinfo部署在default命名空间,Httpbin服务部署在foo命名空间,ingressgateway网关部署在istio-system命名空间,Httpbin单独部署在foo命名空间的测试后端服务,目的是为了验证熔断的开启范围。
适用场景
ASM路由级熔断功能适用于ASM网关,支持HTTP和GRPC协议。您可以在ASMCircuitBreaker YAML文件中添加istioGateway相关配置,本文以/httpbin对应路由名称为httpbin-route-name1配置熔断规则为例进行说明。
apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMCircuitBreaker
metadata:
  name: ingressgateway
  namespace: istio-system
spec:
  workloadSelector:
    labels:
      app: istio-ingressgateway
  isGateway: true
  configs:
    - match:
        vhost:
          name: "bf2.example.com"
          port: 80
          route:
            name_match: nginx-route-name1
      breaker_config:
        slow_request_rt: 0.1s
        break_duration: 90s
        window_size: 10s
        max_slow_requests: 10
        min_request_amount: 3
        error_percent:
          value: 60
        custom_response:
          header_to_add:
            x-envoy-circuitbreak: "true"
          body: "hello, break!"
          status_code: 499部分字段说明如下。关于ASMCircuitBreaker字段的详细说明,请参见ASMCircuitBreaker CRD说明。
| 字段 | 说明 | 
| 
 | 作用于网关。 | 
| 
 | 当请求响应的错误比例超过60%(最少请求3次时),触发熔断。 | 
| 
 | 当慢请求次数超过10次时,触发熔断。 说明  慢请求是指请求响应时间RT(Reaction time)超出 | 
| 
 | 每次熔断的时长定义为90s。 | 
配置并验证熔断规则
本文对bf2.example.com:80这个VirtualHost下的某条路由进行限流配置,路由名称为httpbin-route-name1。
- 使用以下内容,创建asmcircuitbreaker-test-gw.yaml文件。 - apiVersion: istio.alibabacloud.com/v1beta1 kind: ASMCircuitBreaker metadata: name: ingressgateway namespace: istio-system spec: workloadSelector: labels: app: istio-ingressgateway isGateway: true configs: - match: vhost: name: "bf2.example.com" port: 80 route: name_match: httpbin-route-name1 breaker_config: slow_request_rt: 0.1s break_duration: 90s window_size: 10s max_slow_requests: 10 min_request_amount: 3 error_percent: value: 60 custom_response: header_to_add: x-envoy-overload: "true" body: "hello, break!" status_code: 499
- 执行以下命令,创建ASMCircuitBreaker。 - kubectl apply -f asmcircuitbreaker-test-gw.yaml
- 执行以下命令,模拟请求响应1s延迟或Httpbin响应500错误(连续请求10次左右)。 - 模拟请求响应1s延迟: - curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/httpbin/delay/1 -v
- 模拟Httpbin响应500错误: - curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/httpbin/status/500 -v
 - 预期输出: - < HTTP/1.1 499 Unknown < Content-Length: 12 < Content-Type: text/plain < x-envoy-overload: true < Date: Thu, 13 Jan 2022 03:03:09 GMT < Server: istio-envoy < Hello,Break!- 由预期输出得到,返回 - Hello,Break!,说明请求被熔断。
- 执行以下命令,访问Bookinfo服务的 - /productpage接口。- curl -H 'host: bf2.example.com' http://${ASM_GATEWAY_IP}/productpage -v- 在Productpage页面返回 - HTTP 200响应,说明请求未被熔断。