RL(服务限流)--Istio访问日志ResponseFlag重现与解析13


KubeCon 2023在上海做的一个关于Istio访问日志的演讲《Detailed Parse and Reproduce Response Flags of Istio Access Log Based on Production Use Case》。解析和重现了在当时解决客户问题时碰到的各种应答日志。

第13个关注的Response Flag是RL,全称是RateLimited,官方定义表示The request was ratelimited locally by the HTTP rate limit filter in addition to 429 response code.

含义:

**RL **表示触发服务限流。限流是保障服务韧性的重要手段,防止系统过载,保障服务总体的可用性。在网格中配置了本地限流或者全局限流策略,若在单位时间内请求数超过配置的阈值,则触发限流。访问日志记录RL,一般会伴随返回“429”的HTTP状态码。

RL服务访问

重现环境:

  • 客户端Pod,注入了Sidecar。
  • 目标服务,一个Cluster类型的Kubernetes服务,多个服务实例。服务端Pod注入Siecar。

重现步骤:

第一步: 从注入了网格代理的客户端Pod中通过目标名和服务端口访问目标服务,观察代理的访问日志,得到正常的200响应码。从服务端和客户端的访问日志上都可以看到服务在目标服务的多个实例上负载均衡。正常访问参照本系列的环境部分描述

第二步: 在原有正常访问的环境基础上,通过Envoy Filter配置本地限流策略。以下策略中,通过SIDECAR_INBOUND表示入流量限流,即作用在服务端的sidecar代理上。配置限流阈值是60秒10次请求。

 1apiVersion: networking.istio.io/v1alpha3
 2kind: EnvoyFilter
 3metadata:
 4  name: filter-local-ratelimit
 5  namespace: accesslog
 6spec:
 7  configPatches:
 8    - applyTo: HTTP_FILTER
 9      match:
10        context: SIDECAR_INBOUND
11      ...
12      patch:
13        operation: INSERT_BEFORE
14        value:
15          name: envoy.filters.http.local_ratelimit
16          ...
17            value:
18              stat_prefix: http_local_rate_limiter
19              token_bucket:
20                max_tokens: 10
21                tokens_per_fill: 10
22                fill_interval: 60s
23                 ...

第三步: 在客户端连续curl 超过10次,得到429的响应码,表示触发了限流。

RL客户端访问

第四步:服务端代理日志记录中前面若干条请求记录200,后面若干请求记录429 RL表示触发了限流。这里摘取了临近的几条日志,可以看到请求ID是fc218c4e-6043-4d25-a091-4d534d221f83之前的都是200,从38f04fb8-269d-4bf8-89c4-6e18461d38f5开始的请求都触发了限流,输出429。

1[2023-08-21T03:01:27.339Z] "GET / HTTP/1.1" 200 - via_upstream - "-" 0 615 0 0 "-" "curl/7.52.1" "fc218c4e-6043-4d25-a091-4d534d221f83" "nginx.accesslog" "10.66.0.28:80" inbound|80|| 127.0.0.6:47293 10.66.0.28:80 10.66.0.24:33554 outbound_.80_.v1_.nginx.accesslog.svc.cluster.local default
2[2023-08-21T03:01:28.025Z] "GET / HTTP/1.1" 429 - local_rate_limited - "-" 0 18 0 - "-" "curl/7.52.1" "38f04fb8-269d-4bf8-89c4-6e18461d38f5" "nginx.accesslog" "-" inbound|80|| - 10.66.0.28:80 10.66.0.24:33554 outbound_.80_.v1_.nginx.accesslog.svc.cluster.local -

第五步: 同时对应的客户端日志也记录200和429。和服务端的请求完全对应,请求ID是fc218c4e-6043-4d25-a091-4d534d221f83之前的都是200,从38f04fb8-269d-4bf8-89c4-6e18461d38f5开始的请求都触发了限流,记录了429。

1[2023-08-21T03:01:27.339Z] "GET / HTTP/1.1" 200 - via_upstream - "-" 0 615 1 0 "-" "curl/7.52.1" "fc218c4e-6043-4d25-a091-4d534d221f83" "nginx.accesslog" "10.66.0.28:80" outbound|80|v1|nginx.accesslog.svc.cluster.local 10.66.0.24:33554 10.246.91.131:80 10.66.0.24:44886 - -
2[2023-08-21T03:01:28.024Z] "GET / HTTP/1.1" 429 - via_upstream - "-" 0 18 11 10 "-" "curl/7.52.1" "38f04fb8-269d-4bf8-89c4-6e18461d38f5" "nginx.accesslog" "10.66.0.28:80" outbound|80|v1|nginx.accesslog.svc.cluster.local 10.66.0.24:33554 10.246.91.131:80 10.66.0.24:44902 - -

应对建议

用户主动配置限流策略保护目标服务,无需特殊处理。