首页 > 其他分享 >深入理解 Istio 流量管理的超时时间设置

深入理解 Istio 流量管理的超时时间设置

时间:2023-06-14 09:15:28浏览次数:37  
标签:kubectl null httpbin Istio 流量 sleep upstream 服务 超时

环境准备

部署 httpbin 服务:

kubectl apply -f samples/httpbin/httpbin.yaml

部署 sleep 服务:

kubectl apply -f samples/sleep/sleep.yaml 

httpbin 服务作为接收请求的服务端, sleep 服务作为发送请求的客户端。

设置超时时间

sleep 服务中向 httpbin 服务发出请求:

export SLEEP_POD=$(kubectl get pods -l app=sleep -o 'jsonpath={.items[0].metadata.name}')
kubectl exec "$SLEEP_POD" -c sleep -- time curl -o /dev/null -sS -w "%{http_code}\n" http://httpbin.org/delay/5

返回结果如下:

200
real    0m 5.69s
user    0m 0.00s
sys     0m 0.00s

可以看到,请求大约在 5 秒返回 200 (OK)。

创建虚拟服务,访问httpbin 服务时,请求超时设置为 3 秒:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  - httpbin
  http:
  - route:
    - destination:
        host: httpbin
    timeout: 3s
EOF

再次访问,返回结果如下:

504
real    0m 3.01s
user    0m 0.00s
sys     0m 0.00s

可以看到,在 3 秒后出现了 504 (Gateway Timeout)。 Istio 在 3 秒后切断了响应时间为 5 秒的httpbin 服务的请求。接下来,我们深入地看一下,Istio是怎么切断请求的?

查看Envoy日志

执行以下命令,查看sleep 服务的Envoy日志:

kubectl logs -l app=sleep -c istio-proxy

可以看到sleep服务对httpbin服务的调用的日志:

{
     "authority": "httpbin:8000",
     "bytes_received": 0,
     "bytes_sent": 24,
     "connection_termination_details": null,
     "downstream_local_address": "172.24.146.239:8000",
     "downstream_remote_address": "172.24.158.25:40384",
     "duration": 3001,
     "method": "GET",
     "path": "/delay/5",
     "protocol": "HTTP/1.1",
     "request_id": "5ef38816-7f49-48c8-9627-2416e1716293",
     "requested_server_name": null,
     "response_code": 504,
     "response_code_details": "upstream_response_timeout",
     "response_flags": "UT",
     "route_name": null,
     "start_time": "2022-07-01T09:40:13.882Z",
     "upstream_cluster": "outbound|8000||httpbin.onemore.svc.cluster.local",
     "upstream_host": "172.24.158.96:80",
     "upstream_local_address": "172.24.158.25:32846",
     "upstream_service_time": null,
     "upstream_transport_failure_reason": null,
     "user_agent": "curl/7.81.0-DEV",
     "x_forwarded_for": null
}

其中,response_flagsUT,表示上游(upstream)请求超时,也就是sleep服务检测到了httpbin服务的请求超时。

执行以下命令,查看httpbin 服务的Envoy日志:

kubectl logs -l app=httpbin -c istio-proxy

可以看到httpbin服务被sleep服务调用的Envoy日志:

{
     "authority": "httpbin:8000",
     "bytes_received": 0,
     "bytes_sent": 0,
     "connection_termination_details": null,
     "downstream_local_address": "172.24.158.96:80",
     "downstream_remote_address": "172.24.158.25:32846",
     "duration": 2997,
     "method": "GET",
     "path": "/delay/5",
     "protocol": "HTTP/1.1",
     "request_id": "5ef38816-7f49-48c8-9627-2416e1716293",
     "requested_server_name": "outbound_.8000_._.httpbin.onemore.svc.cluster.local",
     "response_code": 0,
     "response_code_details": "downstream_remote_disconnect",
     "response_flags": "DC",
     "route_name": "default",
     "start_time": "2022-07-01T09:40:13.885Z",
     "upstream_cluster": "inbound|80||",
     "upstream_host": "172.24.158.96:80",
     "upstream_local_address": "127.0.0.6:35701",
     "upstream_service_time": null,
     "upstream_transport_failure_reason": null,
     "user_agent": "curl/7.81.0-DEV",
     "x_forwarded_for": null
}

其中,response_flagsDC,表示下游(downstream)连接中断,也就是sleep服务的调用请求被中断了。

文章持续更新,微信搜索「万猫学社」第一时间阅读,关注后回复「电子书」,免费获取12本Java必读技术书籍。

深入分析

通过Envoy日志,我们可以做出一些分析和判断:

httpbin服务的请求正常的时候,调用过程如下图:

httpbin服务的请求超时的时候,调用过程如下图:

虽然,我们在httpbin服务上设置的请求超时时间,但实际上主动断开请求的却是sleep服务的Envoy。

清理

kubectl delete virtualservice httpbin
kubectl delete -f samples/httpbin/httpbin.yaml
kubectl delete -f samples/sleep/sleep.yaml 

微信公众号:万猫学社

微信扫描二维码

关注后回复「电子书」

获取12本Java必读技术书籍

标签:kubectl,null,httpbin,Istio,流量,sleep,upstream,服务,超时
From: https://www.cnblogs.com/heihaozi/p/17479161.html

相关文章

  • 如何给fetch添加超时功能
    目前大部分的实现方式是利用promise.raceconstfetchTimeOut=(timeout=1000)=>{returnnewPromise((resolve,reject)=>{setTimeOut(()=>{reject('fetchtimeOut')},timeout)})}constrequest=(url,options)......
  • Facebook如何将QUIC应用于数十亿流量传输
    随着IETF很快完成QUIC标准定稿,越来越多的企业和开发者投入到QUIC开发实现与部署中。阿里巴巴实现了XQUIC;B站、快手在2019年就公开了QUIC的应用实践;Akamai等CDN服务商则很早就开始拥抱QUIC,并提供相应的支持。本文来自Facebook的工程博客,详细介绍了Facebook是如何将其3/4的流量切换到......
  • 一张图快速了解 Istio 的 EnvoyFilter
    EnvoyFilter简介EnvoyFilter提供了一种机制来定制IstioPilot生成的Envoy配置。使用EnvoyFilter修改某些字段的值,添加特定的过滤器,甚至添加全新的侦听器、集群等等。这个功能必须谨慎使用,因为不正确的配置可能会破坏整个网格的稳定性。与其他Istio网络对象不同,EnvoyFil......
  • 直播回顾|走进元服务,携手小强停车探索鸿蒙新流量阵地
    本期直播《“元”来如此,“服务”直达——揭秘鸿蒙新流量阵地》聚焦元服务的商业流量价值,介绍元服务提供的服务直达和卡片动态变化等轻量化服务。网约停车旗舰平台小强停车做客直播间,分享小强停车在HarmonyOS生态中,如何通过元服务为广大用户带来更加便捷易用的线上预约停车体验。快......
  • 直播回顾|走进元服务,携手小强停车探索鸿蒙新流量阵地
    本期直播《“元”来如此,“服务”直达——揭秘鸿蒙新流量阵地》聚焦元服务的商业流量价值,介绍元服务提供的服务直达和卡片动态变化等轻量化服务。网约停车旗舰平台小强停车做客直播间,分享小强停车在HarmonyOS生态中,如何通过元服务为广大用户带来更加便捷易用的线上预约停车体验。快......
  • 常用的webshell管理工具的流量特征 4
    一、菜刀流量特征最开始是明文传输,后来采用base64加密:PHP类WebShell链接流量如下:第一:“eval”,eval函数用于执行传递的攻击payload,这是必不可少的;第二:(base64_decode(POST[z0])),(base64decode(_POST[z0])),(base64_decode(POST[z0])),(base64ecode(_PO......
  • 公众号的长尾流量
    编辑导语:近年,微信公众号的分发机制有所改变,抓住长尾流量对创作者而言就变得愈发重要。这篇文章讲述了公众号长尾流量的含义和来源,以及获取长尾流量的5种方法,希望对你有所帮助。公众号这款产品,这几年处境极为尴尬,很多人看衰它。但是无论如何,每天仍然有3.9亿人打开微信公众号,这个数据......
  • 在Istio中,到底怎么获取 Envoy 访问日志?
    Envoy访问日志记录了通过Envoy进行请求/响应交互的相关记录,可以方便地了解具体通信过程和调试定位问题。环境准备部署httpbin服务:kubectlapply-fsamples/httpbin/httpbin.yaml部署sleep服务:kubectlapply-fsamples/sleep/sleep.yamlhttpbin服务作为接收请......
  • 冰蝎、蚁剑、哥斯拉的流量特征
    冰蝎、蚁剑、哥斯拉的流量特征1.蚁剑流量特征1.1蚁剑webshell静态特征蚁剑中php使用assert、eval执行;asp只有eval执行;在jsp使用的是Java类加载(ClassLoader),同时会带有base64编码解码等字符特征。1.2蚁剑webshell动态特征我们使用一句话木马上传webshell,抓包后会发现每个......
  • nginx流量带宽等请求状态统计( ngx_req_status)
    介绍ngx_req_status用来展示nginx请求状态信息,类似于apache的status,nginx自带的模块只能显示连接数等等信息,我们并不能知道到底有哪些请求、以及各url域名所消耗的带宽是多少。ngx_req_status提供了这些功能.功能特性按域名、url、ip等等统计信息统计总流量统计当前带宽\峰值带宽统......