摘要:故障注入為您的微服務(wù)注入故障以驗(yàn)證集群性能由于導(dǎo)師和實(shí)驗(yàn)室?guī)熜謧兊目蒲行枰?,本人專門以的模式設(shè)計(jì)了一個(gè)用于錯(cuò)誤注入的微服務(wù)模塊。
“故障注入 Sidecar“——為您的微服務(wù)注入故障以驗(yàn)證集群性能! 由于導(dǎo)師和實(shí)驗(yàn)室?guī)熜謧兊目蒲行枰?,本人專門以 Sidecar項(xiàng)目背景
的模式設(shè)計(jì)了一個(gè)用于錯(cuò)誤注入的微服務(wù)模塊。該模塊可以與任何微服務(wù)應(yīng)用共同部署運(yùn)行,為其模擬cpu、內(nèi)存等錯(cuò)誤。 本項(xiàng)目的 Github
地址: https://github.com/iscas-micr...
我的聯(lián)系方式: [email protected] || 或直接留言 歡迎您提出問題批評指點(diǎn)!
目前,本人正在中科院軟件所的微服務(wù)研究組從事部分研究工作。由于本人所在科研小組的研究內(nèi)容( 微服務(wù)自動(dòng)擴(kuò)縮容相關(guān) ),需要經(jīng)常使微服務(wù)應(yīng)用處于"高 CPU 利用率" 和 "高內(nèi)存使用"的狀態(tài)。因此,為了方便導(dǎo)師和實(shí)驗(yàn)室的各位師兄進(jìn)行實(shí)驗(yàn),本人特地開發(fā)了一個(gè)可以注入進(jìn) Pod 中的錯(cuò)誤注入容器,來模擬上述的高負(fù)載狀態(tài)。
導(dǎo)師和師兄們使用后對我的工作給予了肯定,因此我準(zhǔn)備將開發(fā)過程和簡單使用方法寫成文章做個(gè)記錄( 也就是本文 ),一來方便自己日后工作學(xué)習(xí),二來也方便有類似實(shí)驗(yàn)需求的其他同仁們使用這個(gè)小項(xiàng)目,為大家的研究節(jié)省時(shí)間。更具體的安裝和使用方法,可以移步本項(xiàng)目 Github 的代碼倉庫,其中有非常詳細(xì)的說明。
知識(shí)儲(chǔ)備什么是微服務(wù)中的"Sidecar 運(yùn)行模式?"
上圖: 以 Sidecar 模式部署并運(yùn)行的微服務(wù)單元
Sidecar 運(yùn)行模式是最近兩年比較火的一種微服務(wù)部署和運(yùn)行方法,它由目前流行的 ServiceMesh(服務(wù)網(wǎng)格) 架構(gòu)推廣而來。
具體而言,Sidecar 運(yùn)行模式是一種"將不屬于業(yè)務(wù)應(yīng)用的功能以獨(dú)立的容器運(yùn)行于業(yè)務(wù)容器旁邊",在 K8s 中表現(xiàn)出的樣子就是將具有不同功能的模塊封裝成不同的鏡像,并以不同的容器運(yùn)行在同一個(gè) Pod 中。這種說法非常形象,因?yàn)?Sidecar 這個(gè)單詞的本意就是三輪摩托側(cè)面的"跨斗",這里形容獨(dú)立于業(yè)務(wù)應(yīng)用但又與業(yè)務(wù)應(yīng)用部署在一起非常合適。
上圖: Sidecar ,中文意思為摩托車的跨斗,不由贊嘆命名的非常生動(dòng)主要設(shè)計(jì)思想 架構(gòu)設(shè)計(jì)
本項(xiàng)目的錯(cuò)誤注入模塊也采用了 Sidecar 這種設(shè)計(jì)思想,將用于模擬 CPU、內(nèi)存等故障的模塊獨(dú)立封裝成一個(gè)鏡像,并在 Pod 啟動(dòng)時(shí)以 Sidecar 的形式運(yùn)行在主業(yè)務(wù)容器旁邊。這樣,不用它時(shí)他就會(huì)安安靜靜地當(dāng)個(gè)美男子,完全不用擔(dān)心它會(huì)影響到正常業(yè)務(wù)的運(yùn)行;一旦需要它模擬錯(cuò)誤產(chǎn)生,由于與業(yè)務(wù)容器同處于一個(gè) Pod 之中(而 K8s 又以 Pod 為基本單元),因此他模擬出的錯(cuò)誤亦被 K8s 集群視為業(yè)務(wù)應(yīng)用所在 Pod 產(chǎn)生而被監(jiān)測到。
上圖: Pod 中的每個(gè)容器都有自己的端口映射到外部主機(jī),因此不會(huì)相互影響注入方式設(shè)計(jì)
本項(xiàng)目在設(shè)計(jì)之初是采用“在容器內(nèi)修改環(huán)境變量”的方式對容器注入故障的,但事實(shí)證明這種方法太low,而且非常麻煩。因此在后續(xù)設(shè)計(jì)和實(shí)現(xiàn)中采用了目前較為流行的通過 REST API 傳遞 POST 請求的方式使容器模擬錯(cuò)誤,這樣就極大地方便了師兄們展開實(shí)驗(yàn),而且也可以模擬出“微服務(wù)間調(diào)用而產(chǎn)生錯(cuò)誤”的場景( 上游服務(wù)調(diào)用錯(cuò)誤注入的 API 而模擬下游服務(wù)產(chǎn)生錯(cuò)誤 )。
多進(jìn)程模擬故障產(chǎn)生此外,原本該項(xiàng)目的實(shí)現(xiàn)是單進(jìn)程的,故每注入一個(gè)錯(cuò)誤都要等待錯(cuò)誤結(jié)束后才能獲得應(yīng)答并注入下一個(gè)錯(cuò)誤,這十分不利于實(shí)驗(yàn)的進(jìn)行。因此在后面我們改為了多進(jìn)程運(yùn)行,即每當(dāng)一個(gè)錯(cuò)誤產(chǎn)生時(shí),程序都會(huì)建立一個(gè)子進(jìn)程用于運(yùn)行錯(cuò)誤故障,而原來的進(jìn)程則立刻產(chǎn)生注入是否成功的應(yīng)答并繼續(xù)監(jiān)聽相應(yīng)的服務(wù)端口,從而滿足應(yīng)答實(shí)時(shí)匯報(bào)和多種錯(cuò)誤同時(shí)注入的功能需求。
上圖: 該程序的主要運(yùn)行流程-以 “A 進(jìn)程監(jiān)聽服務(wù)端口”的狀態(tài)為起點(diǎn)使用說明( 故障注入的方法 ) 啟動(dòng)服務(wù)
本應(yīng)用以 Web 服務(wù)的方式運(yùn)行,并封裝為鏡像保存于 DockerHub 上。因此使用之前需要先以容器的形式運(yùn)行鏡像。以 docker 命令運(yùn)行本應(yīng)用的參考命令如下所示:
# 使用 docker 命令簡單測試該應(yīng)用( 測試版本為 docker 18.03-ce ) docker run --rm -it -d --name fault-injection-server -p 5000:5000 xinyaotian/micro-fault-injection:1.0.0
待容器就緒后,訪問您啟動(dòng)該容器的主機(jī) IP 的 5000 號(hào)端口,如果出現(xiàn)了使用指引界面,就表明您的服務(wù)啟動(dòng)成功,可以參考使用說明進(jìn)行錯(cuò)誤注入了。
上圖: 為了方便師兄們和大家的使用, 特地在服務(wù)首頁制作了簡易的使用方法指引, 為大家節(jié)省查 Github 文檔的時(shí)間錯(cuò)誤注入
本項(xiàng)目主要支持四種故障類型: cpu、內(nèi)存、磁盤和網(wǎng)絡(luò),均通過 POST 請求向 /fault-inject 搭配相應(yīng)參數(shù)進(jìn)行注入。具體的注入方法如下所示( 注意更改 IP 和端口號(hào) ):
1.注入 CPU 故障
# fault_type=cpu 指定錯(cuò)誤故障類型(此處為 cpu 類型) # thread_num=4 觸發(fā)該錯(cuò)誤的線程數(shù)(此處為 4 個(gè)線程) # duration=15 故障持續(xù)時(shí)間,單位為秒(此處為 15 秒) curl -X POST -d "fault_type=cpu&thread_num=4&duration=15" http://localhost:5000/fault-inject
2. 注入內(nèi)存故障
# fault_type=mem 指定錯(cuò)誤故障類型(此處為 mem 類型) # mem_size=120M 指定內(nèi)存泄露的數(shù)值(此處為 120M ,注意 M 不能省略) # thread_num=4 觸發(fā)該錯(cuò)誤的線程數(shù)(此處為 4 個(gè)線程) # duration=15 故障持續(xù)時(shí)間,單位為秒(此處為 15 秒) curl -X POST -d "fault_type=mem&mem_size=120M&thread_num=4&duration=15" http://localhost:5000/fault-inject
3.注入磁盤故障
# fault_type=disk 指定錯(cuò)誤故障類型(此處為 disk 類型) # io_times=4 # duration=15 故障持續(xù)時(shí)間,單位為秒(此處為 15 秒) curl -X POST -d "fault_type=disk&io_times=4&duration=15" http://localhost:5000/fault-inject
4.注入網(wǎng)絡(luò)故障
# fault_type=net 指定錯(cuò)誤故障類型(此處為 net 類型) # net_port=100 curl -X POST -d "fault_type=net&net_port=100" http://localhost:5000/fault-inject在 K8s 或 Istio 上運(yùn)行( 基于 yaml )
本項(xiàng)目的鏡像將作為原本微服務(wù)應(yīng)用的 Sidecar 獨(dú)立部署運(yùn)行, 因此在 K8s 環(huán)境中其應(yīng)該與業(yè)務(wù)應(yīng)用部署于同一個(gè) Pod 之中。
您可以利用 yaml 啟動(dòng)一個(gè)多帶帶的 Pod 來初步體驗(yàn)一下這個(gè)應(yīng)用??熳x啟動(dòng)的 yaml 如下所示( Istio 同樣可以這樣寫, K8s 版本為 1.13.1, Istio 版本為 1.0.6 ):
--- # 為 fault injection 創(chuàng)建 service 分配端口 # --- apiVersion: v1 kind: Service metadata: name: single-fault-injection namespace: default spec: selector: # deployment identifier # 這個(gè)標(biāo)簽要與 deployment 中相對應(yīng) app: fault-injection ports: - protocol: TCP port: 5000 # 容器內(nèi)端口為 5000 nodePort: 30050 # 映射至主機(jī)的 30050 端口 type: NodePort # 映射方式為 NodePort --- # 將該模塊作為一個(gè)獨(dú)立的 Pod 在 K8s 上進(jìn)行部署 # --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: single-fault-injection namespace: default spec: replicas: 1 template: metadata: labels: # svc identifier # 這個(gè)標(biāo)簽要與 service 中相對應(yīng) app: fault-injection spec: containers: # 錯(cuò)誤注入模塊的 container - name: fault-injection-container image: xinyaotian/micro-fault-injection:1.0.0 imagePullPolicy: IfNotPresent ports: - containerPort: 5000 # 該容器的資源限制, 錯(cuò)誤注入可使其達(dá)到峰值 # resources: limits: cpu: "0.4" memory: 128Mi
如果您希望以 Sidecar 的形式將本應(yīng)用部署在其他微服務(wù)的 Pod 之中同樣可行,這也是本項(xiàng)目的設(shè)計(jì)初衷。在 K8s 環(huán)境下部署和啟動(dòng)的 yaml 如下所示意( Istio 同樣可以這樣寫, K8s 版本為 1.13.1, Istio 版本為 1.0.6 ):
--- # 為 fault injection 創(chuàng)建 service 分配端口 # --- apiVersion: v1 kind: Service metadata: name: your-microapp-with-faultinjection namespace: default spec: selector: # deployment identifier # 這個(gè)標(biāo)簽要與 deployment 中相對應(yīng) app: sidecar-fault-injection ports: - protocol: TCP port: 5000 nodePort: 30050 type: NodePort --- # 相應(yīng)的 deployment 配置( 與原應(yīng)用配置在一起 ) --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: your-microapp-with-faultinjection namespace: default spec: replicas: 1 template: metadata: labels: # svc identifier # 這個(gè)標(biāo)簽要與 service 中相對應(yīng) app: sidecar-fault-injection spec: containers: # 你原來應(yīng)用的 container 信息 - name: your-micro-app image: your-docker-name/project:1.0 imagePullPolicy: IfNotPresent env: - name: PATH_VALUE value: "example" ports: - containerPort: 80 # ------------------- # # Sidecar 錯(cuò)誤注入模塊的 container - name: fault-injection-sidecar image: xinyaotian/micro-fault-injection:1.0.0 imagePullPolicy: IfNotPresent ports: - containerPort: 5000 # ------------------- # ---
在我自己的實(shí)驗(yàn)集群上,利用 Istio 啟動(dòng)該服務(wù),并對其注入內(nèi)存故障后,可以在 Grafana 監(jiān)控面板上清晰地看到微服務(wù) Pod 的內(nèi)存忽高忽低,非常有趣。 錯(cuò)誤注入的結(jié)果如下圖所示。
上圖: 注入內(nèi)存故障后, 我自己的 Istio 集群監(jiān)測微服務(wù)資源面板的可視化展現(xiàn)后續(xù)版本開發(fā)展望
項(xiàng)目到這里已經(jīng)滿足了實(shí)驗(yàn)室內(nèi)師兄們絕大部分的科研需求。在之后的迭代中預(yù)計(jì)還會(huì)加入故障的產(chǎn)生速率( 例如 CPU 使用率會(huì)呈線性或指數(shù)上漲等 ),相應(yīng)的 API 也會(huì)采用向前兼容的形式進(jìn)行擴(kuò)充( 添加更多的可選參數(shù),不填則設(shè)置為默認(rèn)值 ),以確保這個(gè)版本或之前版本使用者的代碼無需改變而可繼續(xù)使用后續(xù)版本。
此外,簡單的用戶控制面板也會(huì)在后續(xù)版本中開發(fā)。通過提供的用戶界面,使用者可以在界面上輸入?yún)?shù)并通過按鈕進(jìn)行錯(cuò)誤注入,而不再僅僅通過發(fā)送 POST 請求( 雖然底層原理還是本地請求 )。相信用戶界面會(huì)在匯報(bào)演示時(shí)為導(dǎo)師和師兄們帶來諸多便利。
小結(jié)本項(xiàng)目主要以 Sidecar 的方式開發(fā)了一個(gè)用于錯(cuò)誤注入的實(shí)驗(yàn)鏡像,并通過在 docker 和 k8s 上運(yùn)行從而達(dá)到對微服務(wù)單元注入故障的目標(biāo),為研究集群自動(dòng)擴(kuò)縮容、微服務(wù)自動(dòng)擴(kuò)縮容等課題提供了前提保障和研究條件。
致謝感謝您的閱讀,如果您對這個(gè)項(xiàng)目有什么更好的建議,或指出哪里設(shè)計(jì)有問題,我都會(huì)非常歡迎,洗耳恭聽。非常希望于讀完本文的您進(jìn)行交流,歡迎您在下方留言。
如果您的科研團(tuán)隊(duì)也有類似需求,也非常歡迎與我們進(jìn)行合作,并對針對本項(xiàng)目提出寶貴的改進(jìn)意見。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/27925.html
摘要:故障注入為您的微服務(wù)注入故障以驗(yàn)證集群性能由于導(dǎo)師和實(shí)驗(yàn)室?guī)熜謧兊目蒲行枰?,本人專門以的模式設(shè)計(jì)了一個(gè)用于錯(cuò)誤注入的微服務(wù)模塊。 故障注入 Sidecar——為您的微服務(wù)注入故障以驗(yàn)證集群性能! 由于導(dǎo)師和實(shí)驗(yàn)室?guī)熜謧兊目蒲行枰?,本人專門以 Sidecar的模式設(shè)計(jì)了一個(gè)用于錯(cuò)誤注入的微服務(wù)模塊。該模塊可以與任何微服務(wù)應(yīng)用共同部署運(yùn)行,為其模擬cpu、內(nèi)存等錯(cuò)誤。 本項(xiàng)目的 Githu...
摘要:最后,狀態(tài)管理與同構(gòu)實(shí)戰(zhàn)這本書由我和前端知名技術(shù)大佬顏海鏡合力打磨,凝結(jié)了我們在學(xué)習(xí)實(shí)踐框架過程中的積累和心得。 對于前端資訊比較敏感的同學(xué),可能這兩天已經(jīng)聽說了 GoogleChromeLabs/quicklink這個(gè)項(xiàng)目:它由 Google 公司著名開發(fā)者 Addy Osmani 發(fā)起,實(shí)現(xiàn)了:在空閑時(shí)間預(yù)獲取頁面可視區(qū)域內(nèi)的鏈接,加快后續(xù)加載速度。如果你沒有聽說過 Addy Os...
摘要:盤點(diǎn)一下,模式反應(yīng)了典型的控制權(quán)問題。異步狀態(tài)管理與控制權(quán)提到控制權(quán)話題,怎能少得了這樣的狀態(tài)管理工具。狀態(tài)管理中的控制主義和極簡主義了解了異步狀態(tài)中的控制權(quán)問題,我們再從全局角度進(jìn)行分析。 控制權(quán)——這個(gè)概念在編程中至關(guān)重要。比如,輪子封裝層與業(yè)務(wù)消費(fèi)層對于控制權(quán)的爭奪,就是一個(gè)很有意思的話題。這在 React 世界里也不例外。表面上看,我們當(dāng)然希望輪子掌控的事情越多越好:因?yàn)槌橄髮?..
閱讀 2488·2021-09-22 16:05
閱讀 2977·2021-09-10 11:24
閱讀 3647·2019-08-30 12:47
閱讀 2952·2019-08-29 15:42
閱讀 3393·2019-08-29 15:32
閱讀 1979·2019-08-26 11:48
閱讀 1095·2019-08-23 14:40
閱讀 908·2019-08-23 14:33