Istio中maxRequestsPerConnection参数工作原理解析及测试不符合预期问题咨询
理清Istio中
maxRequestsPerConnection的真正作用 嘿,你完全搞反了这个参数的作用方向!我来给你掰扯清楚:
你配置的maxRequestsPerConnection: 1是控制Istio的Envoy代理向上游服务(也就是你的httpbin Pod)发起的TCP连接,而不是控制客户端到Envoy的连接。
具体来说:
- 当你设置这个值为1时,Envoy每次给httpbin Pod发完一个HTTP请求后,就会关闭它和httpbin之间的TCP连接;下一次有新的客户端请求过来时,Envoy会重新和httpbin建立一个新的TCP连接来处理请求。
- 而你用telnet、fortio测试的是客户端到Envoy的连接,这个参数根本管不到这个方向!所以客户端和Envoy之间的长连接完全不受影响,你自然能在同一个TCP连接里发多个请求。
怎么验证这个参数的实际效果?
你可以去查看httpbin Pod的Istio侧车代理的连接情况:
kubectl exec -it <你的httpbin Pod名称> -c istio-proxy -- netstat -anp | grep ESTABLISHED
当你用fortio发送10个请求后,应该能看到Envoy和httpbin之间建立了多个TCP连接(接近10个),而不是只有1个——这才是这个参数生效的表现。
那如果想限制客户端到Envoy的单连接请求数怎么办?
如果要控制客户端和Envoy之间的单个TCP连接能处理的请求数,你需要配置listener级别的参数,比如在Sidecar资源里配置入站监听:
apiVersion: networking.istio.io/v1alpha3 kind: Sidecar metadata: name: httpbin-sidecar spec: workloadSelector: labels: app: httpbin ingress: - port: number: 8000 protocol: HTTP name: http defaultEndpoint: 127.0.0.1:8000 listener: http: maxRequestsPerConnection: 1
这样配置后,客户端和Envoy之间的单个TCP连接处理完1个请求后,Envoy就会主动关闭连接,客户端下一次请求就得新建连接了。
总结一下
- DestinationRule里的
maxRequestsPerConnection:管控Envoy → 上游服务的出站连接池,限制单个连接的请求数 - Listener里的
maxRequestsPerConnection:管控客户端 → Envoy的入站连接,限制单个连接的请求数
内容的提问来源于stack exchange,提问作者yu saito
相关产品推荐
相关产品推荐

