istio circle-breaking文章摘录
原文链接
https://tech.olx.com/demystifying-istio-circuit-breaking-27a69cac2ce4
揭秘istio 熔断
我们已经在自己的eks集群上采用了istio服务网格,我们采用了许多令人激动的特性,
之前我们的熔断依靠的是java的Resilience4j,但istio给予我们的是不需要修改代在网络层面就能实现的熔断功能。
尽管istio表面上看上去很简单,但我们在网络上找到的文章用处并不大且不助于理解熔断在不同场景下的功能。
所以我们着手进行一些测试去加固我们的理解在我们开始真正的使用它之前。
根据文档描述,我们需要创建一个目的地规则去配置熔断到给定的目标service上,熔断的功能参数被定义在connectionPool里面
(outlierDetection同样是熔断的一部分,但这篇文章我们仅仅关注connectionPool),这些相关的参数是:
tcp.maxConnections:到一个目的地址的最大http1/tcp连接数量。默认是2³²-1.
http.http2MaxRequests: 后端最大请求数,默认是2³²-1。
在官方文档中,很清楚这些参数在简单场景中是如何工作的,一个客户端以及一个目标实例,但是,在实际情况中,更多的场景是,
>一个客户端对应多个目标服务实例。
>多个客户端对一个目标服务实例
>客户端与目标实例都有多个的场景。
文档中有点缺乏对于以上情况的描述,问了对熔断有更深的理解,我们决定在本地环境测试下这些参数。
我们创建两个python脚本,一个作为客户端,一个作为服务端。
客户端调用服务端10次,10并发调用,然后在下10次调用前做sleep操作。接着创建两个pod演示。
首先对service创建DestinationRule,设置最大连接数为5。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: pyserver-service
spec:
host: pyserver-service
trafficPolicy:
connectionPool:
tcp:
maxConnections: 5
场景一中:一对一,
STATUS: 200, START: 11:52:20, END: 11:52:25, TIME: 5.055624961853027
STATUS: 200, START: 11:52:20, END: 11:52:25, TIME: 5.058431386947632
STATUS: 200, START: 11:52:20, END: 11:52:25, TIME: 5.061942100524902
STATUS: 200, START: 11:52:20, END: 11:52:25, TIME: 5.06324577331543
STATUS: 200, START: 11:52:20, END: 11:52:25, TIME: 5.062822580337524
STATUS: 200, START: 11:52:20, END: 11:52:30, TIME: 10.03047299385070
STATUS: 200, START: 11:52:20, END: 11:52:30, TIME: 10.03211736679077
STATUS: 200, START: 11:52:20, END: 11:52:30, TIME: 10.03300023078918
STATUS: 200, START: 11:52:20, END: 11:52:30, TIME: 10.04033088684082
STATUS: 200, START: 11:52:20, END: 11:52:35, TIME: 15.04372119903564
根据显示的数据看出来,只有5次的调用在5秒,其他的都在10秒,这就暗示了tcp.maxConnections使得多余的请求被加入到了
队列中,等待着链接去释放,默认情况下,可以被添加到队列的请求数量是非常高的。
为了实际是实现熔断的行为,我们需要设定http.http1MaxPendingRequests来限制可以被加入到队列的请求数量,默认是 2³²-1.
有趣的死,如何我们把它设置为0的话,它将会变为默认值,所以我们最低需要把它设置为1,
设置为1后就可以观察到,丢掉了4个请求,5个请求发送到了目标服务,1个被添加到了队列中,这是符合预期的行为。
http2MaxRequests
接着是另一个参数http2MaxRequests
对于http2来说,http2MaxRequests是非常重要的,因为http2可以在单个tcp连接里发送多个并发请求。因此需要限制最大请求数而不是
tcp连接。
场景二:
一对多的情况,这种情况测试的是
1.并发连接的限制是在pod层面的,每个pod的最大连接是在5个。
2.或者这是在service层面的,跟所有的pod数量没有关系。
第一种情况的的最大并发是15,第二种则是跟之前一样。
测试结果是连接限制是在service层面上的。
第三种场景是我们有多个客户端对应一个服务端。
因为每个istio的proxy都是独立的并且相互并不通信,所以基于这一点预测仍然是5个请求处理,然后一个加入队列,其余的被丢弃。
实际的结果是他仅仅允许了总共5个请求成功。
这是如何发生的呢,这些proxy事先通信过吗?检查下logs我们发现被丢弃的请求有两种日志,
首先被察觉到的就是RESPONSE_FLAGS — UO and URX,
UO:上游过载(熔断)
URX:请求被拒绝因为上有重试限制,或者达到最大连接。
一种是连接在本地被丢弃,另一种是在服务端被丢弃,
- 文章翻译
- Large-scale cluster management at Google with Borg
- Borg Omega and kubernetes
- scaling kubernetes to 7500 nodes
- bpf 的过去,未来与现在
- Demystifying Istio Circuit Breaking
- 知识图谱
- skill level up graph
- 一、运维常用技能
- 1.0 Vim (编辑器)
- 1.1 Nginx & Tengine(Web服务)
- 基础
- 1.2 zabbix
- 定义
- 登录和配置用户
- 1.3 RabbitMQ(消息队列)
- 原理
- RabbitMQ(安装)
- 1.4虚拟化技术
- KVM
- 1.5 Tomcat(Web中间件)
- 1.6Jenkins
- pipline
- 1.7 Docker
- network
- 1.8 Keepalived(负载均衡高可用)
- 1.9 Memcache(分布式缓存)
- 1.10 Zookeeper(分布式协调系统)
- 1.11 GitLab(版本控制)
- 1.12 Jenkins(运维自动化)
- 1.13 WAF(Web防火墙)
- 1.14 HAproxy负载均衡
- 1.15 NFS(文件传输)
- 1.16 Vim(编辑器)
- 1.17 Cobbler(自动化部署)
- 二、常用数据库
- 2.1 MySQL(关系型数据库)
- mysql主从复制
- 2.2 Mongodb(数据分析)
- 2.3 Redis(非关系数据库)
- 三、自动化运维工具
- 3.1 Cobbler(系统自动化部署)
- 3.2 Ansible(自动化部署)
- 3.3 Puppet(自动化部署)
- 3.4 SaltStack(自动化运维)
- 四、存储
- 4.1 GFS(文件型存储)
- 4.2 Ceph(后端存储)
- 五、运维监控工具
- 5.1 云镜
- 5.2 ELK
- 六、运维云平台
- 6.1 Kubernetes
- 6.2 OpenStack
- 介绍
- 安装
- 七、Devops运维
- 7.1 理念
- 7.2 Devops运维实战
- 八、编程语言
- 8.1 Shell
- 书籍《Wicked Cool Shell Scripts》
- 8.2 Python
- 8.3 C
- 8.4 Java
- leecode算法与数据结构
- 九、杂记
- 高优先级技能
- 知识点
- JD搜集
- 明显的短板
- 1.0 Python
- 1.1 Kubernetes
- 1.18.2 《kubernetes in action》
- 遗漏知识点
- 1.18.3 GCP、azure、aliyun
- Azure文档
- 1.18.5 《program with kubernetes》
- Istio
- HELM
- 《Kubernetes best practice》
- Kubernetes源码学习
- Scheduler源码
- 调度器入口
- 调度器框架
- Node筛选算法
- Node优先级算法
- pod抢占调度
- 入口
- 主要代码结构
- new
- 文章翻译
- Flannel
- 从二进制集群搭建
- 信息收集
- docker优化
- 1.2 shell
- 面试题
- grep awk sed 常见用法
- shell实践
- 1.3 Data structure(数据结构)
- Calico
- Aliyun文档以及重点模块
- git
- 大数据组件
- 前端,后端,web框架
- cgroup,namespace
- 内核
- Linux搜集
- crontab
- centos7常用优化配置
- centos Mariadb
- eBPF
- ebpf的前世今生
- Linux性能问题排查与分析
- 性能分析搜集
- 性能分析常用10条
- 网络性能优化
- 文本处理命令
- sql
- Iptables
- python面试题
- iptables
- iptables详细
- zabbix面试题,proj
- prometheus
- web中间件
- nginx
- Haproxy
- grep sed awk
- Linux常用命令
- 云平台
- 书籍Linux应用技巧
- kafka
- kafka面试题
- ETCD
- Jenkins
- 3天补充的点
- K8s源码
- K8s
- k8s实操
- etcd
- test
- BPF
- PSFTP使用
- StackOverflow问答精选
- 问题
- 我对于学习思考
- 修改ssh超时时间
- 课程目录
- 运维与运维开发
- The Person
- 个人杂谈
- mysql主从复制
- 对于工作的认识与思考