环境准备

部署 httpbin 服务:

  1. kubectl apply -f samples/httpbin/httpbin.yaml

部署 sleep 服务:

  1. kubectl apply -f samples/sleep/sleep.yaml

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

设置超时时间

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

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

返回结果如下:

  1. 200
  2. real 0m 5.69s
  3. user 0m 0.00s
  4. sys 0m 0.00s

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

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

  1. kubectl apply -f - <<EOF
  2. apiVersion: networking.istio.io/v1alpha3
  3. kind: VirtualService
  4. metadata:
  5. name: httpbin
  6. spec:
  7. hosts:
  8. - httpbin
  9. http:
  10. - route:
  11. - destination:
  12. host: httpbin
  13. timeout: 3s
  14. EOF

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

  1. 504
  2. real 0m 3.01s
  3. user 0m 0.00s
  4. sys 0m 0.00s

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

查看Envoy日志

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

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

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

  1. {
  2. "authority": "httpbin:8000",
  3. "bytes_received": 0,
  4. "bytes_sent": 24,
  5. "connection_termination_details": null,
  6. "downstream_local_address": "172.24.146.239:8000",
  7. "downstream_remote_address": "172.24.158.25:40384",
  8. "duration": 3001,
  9. "method": "GET",
  10. "path": "/delay/5",
  11. "protocol": "HTTP/1.1",
  12. "request_id": "5ef38816-7f49-48c8-9627-2416e1716293",
  13. "requested_server_name": null,
  14. "response_code": 504,
  15. "response_code_details": "upstream_response_timeout",
  16. "response_flags": "UT",
  17. "route_name": null,
  18. "start_time": "2022-07-01T09:40:13.882Z",
  19. "upstream_cluster": "outbound|8000||httpbin.onemore.svc.cluster.local",
  20. "upstream_host": "172.24.158.96:80",
  21. "upstream_local_address": "172.24.158.25:32846",
  22. "upstream_service_time": null,
  23. "upstream_transport_failure_reason": null,
  24. "user_agent": "curl/7.81.0-DEV",
  25. "x_forwarded_for": null
  26. }

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

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

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

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

  1. {
  2. "authority": "httpbin:8000",
  3. "bytes_received": 0,
  4. "bytes_sent": 0,
  5. "connection_termination_details": null,
  6. "downstream_local_address": "172.24.158.96:80",
  7. "downstream_remote_address": "172.24.158.25:32846",
  8. "duration": 2997,
  9. "method": "GET",
  10. "path": "/delay/5",
  11. "protocol": "HTTP/1.1",
  12. "request_id": "5ef38816-7f49-48c8-9627-2416e1716293",
  13. "requested_server_name": "outbound_.8000_._.httpbin.onemore.svc.cluster.local",
  14. "response_code": 0,
  15. "response_code_details": "downstream_remote_disconnect",
  16. "response_flags": "DC",
  17. "route_name": "default",
  18. "start_time": "2022-07-01T09:40:13.885Z",
  19. "upstream_cluster": "inbound|80||",
  20. "upstream_host": "172.24.158.96:80",
  21. "upstream_local_address": "127.0.0.6:35701",
  22. "upstream_service_time": null,
  23. "upstream_transport_failure_reason": null,
  24. "user_agent": "curl/7.81.0-DEV",
  25. "x_forwarded_for": null
  26. }

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

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

深入分析

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

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

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

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

清理

  1. kubectl delete virtualservice httpbin
  2. kubectl delete -f samples/httpbin/httpbin.yaml
  3. kubectl delete -f samples/sleep/sleep.yaml

微信公众号:万猫学社

微信扫描二维码

关注后回复「电子书」

获取12本Java必读技术书籍

深入理解 Istio 流量管理的超时时间设置的更多相关文章

  1. session超时时间设置方法

    session超时时间设置方法 由于session值之前没有设置,以至于刚登录的网站,不到一分钟就超时了,总结了一下,原来是session过期的原因,以下是设置session时间的3个方法: 1. 在 ...

  2. unigui session超时时间设置

    unigui session超时时间设置 默认的SESSION超时时间是10分钟. 网络 SOCKET 程序,像 数据库,中间件,UNIGUI等...为了防止过多的僵死连接卡死服务端,服务端都会主动踢 ...

  3. GS 服务器超时时间设置

    工作中 遇到一个超时的问题 与徐庆同学沟通后 了解了下超时时间设置的地方 1.web.congfig问题: 常规路径 C:\Program Files\GenerSoft\bscw_local\web ...

  4. 接口调试工具ApiPost的发送超时时间设置方法

    有部分使用ApiPost的同学反应:发送接口调试时,响应超时时间设置的太短导致接口访问失败,怎么设置呢? 就连百度也有很多人在搜: 今天就来说一说. ApiPost简介: ApiPost是一个支持团队 ...

  5. MYSQL的数据连接超时时间设置

    大规模多线程操作事务的时候,有时候打开一个链接,会进行等待,这时候如果数据库的超时时间设置的过短,就可能会出现,数据链接自动被释放,当然设置过大也不好,慢SQL或其他因素引起的链接过长,导致整个系统被 ...

  6. 【Hadoop】Hadoop DataNode节点超时时间设置

    hadoop datanode节点超时时间设置 datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间,这段时间 ...

  7. (转)nginx限制上传大小和超时时间设置说明/php限制上传大小

    nginx限制上传大小和超时时间设置说明/php限制上传大小 原文:http://www.cnblogs.com/kevingrace/p/6093671.html 现象说明:在服务器上部署了一套后台 ...

  8. session的工作原理、django的超时时间设置及session过期判断

    1.session原理 cookie是保存在用户浏览器端的键值对 session是保存在服务器端的键值对 session服务端中存在的数据为: session = { 随机字符串1:{ 用户1的相关信 ...

  9. httpclient超时时间设置及代理设置

    超时时间 设置HttpClient的超时时间,非常有必要性,因为httpclient 默认超时时间很长,自己可以测试一下是多久,设置超时时间否则会影响自己系统的业务逻辑,例如阻塞系统,影响系统的吞吐量 ...

  10. Socket超时时间设置

    你知道在 Java 中怎么对 Socket 设置超时时间吗?他们的区别是什么?想一想和女朋友打电话的场景就知道了,如果实在想不到,那我们就一起来来看一下是咋回事吧 设置方式 主要有以下两种方式,我们来 ...

随机推荐

  1. unable to find Qt5Core.dll on PATH(已解决,超简单)

    不久之前我在引用PyQt5库的时候总是出现unable to find Qt5Core.dll on PATH的错误,错误如下: 百度上都是说什么打包的时候出错,然后加上一句话,我试过以后也不行,后来 ...

  2. React的组件化/工程化开发(脚手架)

    脚手架: create-react-app 安装脚手架: $ npm i create-react-app -g 检查安装: $ npm create-react-app --version 新建项目 ...

  3. 迁移学习《Asymmetric Tri-training for Unsupervised Domain Adaptation》

    论文信息 论文标题:Asymmetric Tri-training for Unsupervised Domain Adaptation论文作者:Kuniaki Saito, Y. Ushiku, T ...

  4. idea 热部署插件JRebel

    idea 热部署插件JRebel ​ 当开始开发web项目的时候,需要频繁的修改web页面,此时如果频繁的重启变得很麻烦,因此,可以在idea中集成JRebel插件,改动代码之后不需要重新启动应用程序 ...

  5. 四月二十四号java基础知识

    1.输入输出是指程序与外部设备或其他计算机进行交互的操作2.流(stream)是指计算机各部件之间的数据流动流的内容上划分:流分为字节流和字符流3.输入流:将数据从外设或外存(如键盘.鼠标.文件等)传 ...

  6. Windows下搭建java环境最新版本jdk运行jar文件

    1:安装JDK(Java Development Kit),链接https://www.oracle.com/java/technologies/downloads/#jdk18-windows下载最 ...

  7. Docker入门实践笔记-基本使用

    容器是一个系统中被隔离的特殊环境,进程可以在其中不受干扰地运行,使用Docker来实现容器化 容器化 运行容器时,要先拉取一个镜像(image),再通过这个镜像来启动容器: $ sudo docker ...

  8. day08-优惠券秒杀04

    功能03-优惠券秒杀04 4.功能03-优惠券秒杀 4.7Redis优化秒杀 4.7.1优化分析 现在来回顾一下优惠券秒杀业务的两个主要问题: (1)首先是对优惠券的扣减,需要防止库存超卖现象: (2 ...

  9. std::cin 和 std::getline 混用的问题

    如果存在如下的输入, 11 is a prime 考虑如下的程序, std::cin>>number; std::getline(std::cin,input) std::cin 在读取数 ...

  10. 11g ADG级联备库基础测试环境准备

    客户通过duplicate生产备库的方式创建cascade备库. 发现每次都会遇到两个文件报错,ORA-17628: Oracle error 19505错误,且每一次跑,报错文件不一样. 现在想帮客 ...