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連接數量。默認是232-1.
http.http2MaxRequests: 后端最大請求數,默認是232-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來限制可以被加入到隊列的請求數量,默認是 232-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主從復制
- 對于工作的認識與思考