1. 程式人生 > >在 Ali Kubernetes 系統中,我們這樣實踐混沌工程

在 Ali Kubernetes 系統中,我們這樣實踐混沌工程

開發十年,就只剩下這套架構體系了! >>>   

在傳統的軟體測試中,我們通常通過一個給定的條件來判斷系統的反饋,通過斷言來判斷是否符合預期,測試條件和結果通常比較明確和固定。而混沌工程,是通過注入一些“不確定”因素,象放進了一群淘氣的猴子,在系統資源、可用性、安全性、延遲、壓力等方面進行搗亂,而此過程中,要求系統可以毫無影響的提供服務,使用者無感知。

這其實對系統的自愈能力,健壯性都有很高的要求。故障注入一般是指比較受控的一些實驗條件,通過注入一些相對極端的異常場景,為系統提供可靠性測試的過程。 整體來說,混沌是一種故障注入規則,強調了一些不確定性、隨機性,比較常見的"猴子"有 Netflix 的"猴子軍團",可以用來隨機關閉系統例項,注入延時,回收資源,檢查安全漏洞等等。

開源工具介紹

除了一般系統的 monkey,基於 Kubernetes 已經有一些"猴子"工具可以測試系統的健壯性。接下來,介紹一下比較常見的三種 Kubernetes monkey:

kube-monkey

https://github.com/asobti/kube-monkey

  • 執行方式:kube-monkey 通過 label 設定受害者 pod,建立了一個單獨的 kube-monkey pod 對受害者 pod 施加影響;
  • 注入型別:目前支援的故障注入型別僅有殺容器;
  • 配置項:可以通過配置檔案設定執行週期和頻率,在一定時間內隨機的殺死打標範圍內的 pod。

powerfulseal

https://github.com/bloomberg/powerfulseal

  • 注入型別:powerfulseal 的故障注入型別包括殺 pod 和啟停 node。
  • 執行方式:包括互動模式,自動模式、打標模式和示例模式。互動模式通過介面互動查詢node/namespace/pod,啟停 node 或殺死 pod 操作;自動模式通過讀取配置檔案確定注入範圍,注入頻率;打標模式通過給 pod 打標確定注入的靶向 pod 及注入頻率;示例模式可以反映根據使用資源情況進行故障注入的過程。

Chaos Toolkit-kubernetes

https://github.com/chaostoolkit/chaostoolkit-kubernetes
/>
是 chaos 工具包中的一個,通過 chaos run experiment.json 設定 json 檔案來指定 namespace,正則匹配名字等等來隨機殺一個 pod。

以上三種"猴子",主要是基於殺 pod 場景來注入故障,雖然是最有力的場面但是比較有侷限性,對於商業化系統面臨的複雜場景,是值得參考但是不夠的。

結合 Ali Kubernetes 故障場景分析

Ali Kubernetes 作為一個管理大規模叢集的商業排程系統,需要應對的不僅包括一些基本的 Kubernetes 中 pod 誤刪誤停的故障現象,也包含一些底層 OS、核心、網路、誤配置等災難場景。同時由於其支撐業務生態的複雜性,全鏈路綜合異常流也需要特殊的驗證。

為更系統的進行演練,在過程中主要進行了以下幾部分工作:

FMEA 分析就是失效模式和效果分析,旨在對系統範圍內潛在的失效模式加以分析,以便按照嚴重程度加以分類,或者確定失效對於該系統的影響。
從故障場景上,分析得出較為符合 Ali Kubernetes 的三大類場景:

  • 通用故障場景:包括網路相關故障(網路 iohang ,斷網,網路延遲等),宿主機相關故障(機器重啟,機器 load 高等)
  • Ali Kubernetes 業務場景故障:包括 Kubernetes 相關的故障(pod 刪除,pod patch等),pod 遷移,混部、etcd 等業務相關場景;
  • chaos 故障:較為隨機的故障注入,可以為以上任何故障的組合

從影響面上,需要 case by case 確定影響範圍為無任何影響,僅影響部分功能,影響核心功能等等;從驗證恢復手段上,也可以分為自動恢復、手動恢復,同時需要關注監控情況及恢復時間。

在分析過程中,我們發現,已有的開源工具無法完全滿足 Ali Kubernetes 的故障場景。下面舉 2 個典型故障場景:

pod 被誤刪

這個場景並不是簡單的 pod 隨機刪除,而是在 kubelet 連錯 apiserver 配置等異常情況下,重啟 ali-kubelet 後,al 自行判斷了容器在當前叢集內不存在,自己做了刪除操作。
要引入這個故障需要修改 kubelet 元件的配置,重啟 kubelet,才算是真正引入了故障,而當前的無論是 kube-monkey 還是 powerfulseal 場景都無法滿足。

master 元件斷網

有的人可能會說,直接指定 master 元件的機器引入斷網操作,是不是就可以了呢?然鵝現實是比較骨感的,我們也許只知道這個 master 所在叢集的 kubeconfig,元件的機器其實也可以隨著每次升級變動的。在僅僅已知 kubeconfig 的情況下我們只能先查一下 master 元件的機器資訊,再在機器上引入斷網的操作,才算是一個整體的故障引入。而目前所有的開源工具也沒有此類稍微複雜一些的場景,只是通過指定 pod namespace 來隨機的刪除一些 pod。
所以綜上所述,其實我們需要對此進行擴充套件開發,除了簡單的殺 pod,我們亟需一套可以自由開發的小程式,把這個步驟拼接起來,進行更為複雜的故障注入。

套件實現

為了滿足此類複雜的故障注入,我們使用了目前集團內正在開發的一套故障注入系統 monkeyking,並在它的基礎上擴充套件了一些 kubernetes 相關的套件,來達到既可以注入 kubernetes 相關的故障,又可以注入一些通用故障,同時又可以相對自由的擴充套件故障集合的目的。

這個故障注入的演練流程如下圖所示:
2


它的每一個步驟都可以是我們自由擴充套件的一個或者多個小程式,各個小程式之間的執行順序也可以自由的定義。考慮到 Ali Kubernetes 的場景,我們在其中擴充套件了四大類小程式套件。

通用故障小程式

在這一部分主要實現了一些比較通用的 os 故障,網路故障,比如最基本的指定一個宿主機斷網,指定宿主機重啟這類。

Kubernetes 套件小程式

這一部分主要實現了一些通用的 Kubernetes 命令,通過指定這些命令和入參,我們可以執行比如 create delete apply patch 這些操作,來間接的達到注入一些 Kubernetes 相關故障的目的。
實現原理如下:

要點說明如下:

  • 下載叢集證書的地址及證書的 md5 碼都作為小程式的輸入,在執行實際的 kubectl 生效命令前進行下載校驗;
  • 底層 toolkit 中已經加入了 kubectl 命令列工具,無需自己找環境進行配置和下載;
  • 目前已經支援了 apply,create,delete,patch,get 操作,支援指定 label,namespace,-o json 的操作


舉個例子,上文中 master 元件故障的場景中,我們就可以利用以上的兩類小程式來完成故障注入的操作:

開源工具小程式

目前我們和集團安全生產的 MonkeyKing 團隊合作,聯合在故障注入平臺 monkeyking 中集成了開源工具 kube-monkey,實現過程藉助了上文的 kubernetes 套件執行,可以通過打標的方式標記受害者,讓 kube-monkey 隨機的殺受害者 pod。步驟如下:

環境準備

  • 鎖演練環境
  • 在當前叢集中初始化kube-monkey: 使用kubernetes套件的apply功能提交km-config.yaml檔案,部署 kube-monkey deployment

給應用標記受害者 label

  • 使用 Kubernetes 套件的 patch 功能,標記受害者

驗證步驟

  • 自定義元件校驗應用服務是否可用

故障恢復

  • 使用 Kubernetes 套件的 patch 功能,給受害者去標
  • 使用 Kubernetes 套件的 delete 功能,刪除 kube-monkey deployment
  • 解鎖演練環境

其他業務相關小程式

這一部分比較自由,主要根據 Ali Kubernetes 的業務需求,接入了一些常用的小程式。

比如故障演練過程中,環境需要獨佔,不允許其他測試執行,在這裡實現了一個小程式用來對環境進行加解鎖操作;比如校驗階段需要驗證服務是否可用,這裡實現了一個通過 curl 命令校驗返回值的方式驗證服務是否可用的小程式;比如故障注入過程可能影響vip掛載,這裡也實現了一個呼叫 vip 服務校驗 vip 下 ip 數量及是否可用的小程式。

總結

在 Ali Kubernetes 中,我們將故障以場景化的方式進行沉澱,將底層 os,核心、網路、誤配置等故障聯合 Kubernetes 相關故障,引入混沌工程的理念進行注入,有效的發現了很多系統穩定性問題,驅動開發人員更多關注系統健壯性。

後續我們會在 Ali Kubernetes  演進過程中持續發力,基於架構和業務場景輸入更多 Kubernetes 相關的故障場景,為系統的高可用保駕護航。

相關推薦

Ali Kubernetes 系統我們這樣實踐混沌工程

開發十年,就只剩下這套架構體系了! >>>   

解決方式-在Mac系統Eclipse無法導入含有中文路徑的project

導入 pan support cati 一行 oct tracking -a ctype 1、改動eclipse.app/Contents/Info.plist。查找 <key>CFBundleExecutable<key>在其上方加入下面

架構師提升篇:分布式系統如何提升系統性能?

架構師在分布式系統中,平衡業務計算的壓力分布,減少網絡上的數據流動,是一種提升性能的手段,請看下面的例子。1)案例背景某“機械設計研究所”歷史上在管理模式上采用傳統的層次化垂直結構。但是近年來,隨著用戶對產品更新換代的要求越來越快、質量要求越來越高,在競爭日益劇烈、外部壓力日益增大的形勢下,該所在管理模型上重

LINUX系統軟/硬鏈接和inode的一些關系。

tex log windows app 發的 查看 文件名 並不是 存儲 前言:眾所周知硬盤是計算機不可缺少的一部分,不管這個計算機上運行著的是什麽系統,但是存儲設備,都是必不可少的,而inode則是磁盤存儲時無法替代的一部分。所以我想談一下在linux系統中關於inode

在Linux系統實現LVM邏輯卷管理及磁盤配額

Linux LVM邏輯卷 磁盤管理配額 LVM(Logical Volume Manager)是Linux系統中對磁盤分區進行管理的一種邏輯機制,他是建立在磁盤和分區之上的一個邏輯層,能夠在保持現有數據不變的情況下動態調整磁盤容量,從而提高磁盤管理的靈活性。 1. 執行命令 fdisk -l 來查

在Linux系統使用Bind搭建DNS域名解析服務

Linux Unix CentOS6.5 DNS Bind DNS域名解析服務(Domain Name System)是用於解析域名與IP地址對應關系的服務作用為維護著一個地址數據庫,記錄著各種主機域名與IP地址的對應關系,以便為客戶提供正向或反向的地址查詢服務,即正向解析與反向解析。

在C#我們可以利用以下方法判斷Windows服務是否存在

  在C#中,我們可以利用以下方法判斷Windows服務是否存在          private bool IsServiceExisted(string se

在Python我們經常會遇到字串的拼接問題在這裡我總結了四種字串的拼接方式

 1.使用%進行拼接 如下 name = input("Please input your name: ")age = input("Please input your age: ") job = input("Please input your job: ")sex =&

為什麼在 Linux 系統不建議超頻

CPU 是一部計算機內的心臟啦!因為不論你做什麼事情都需要 CPU 來加以運作的!(雖然有時工作量大、有時工作量小!),在 586 以前的計算機( 包含 386, 486, 與 586 ) ,CPU 的規格蠻固定的!只要是 586 ,那麼全部的 586 CPU 都是同一規格的,你可以使用任何一家的 586 C

基於阿里雲物聯網平臺我們這樣實現簡易出入監控

本文通過一個簡單例項,主要介紹瞭如何使用樹莓派快速接入阿里雲iot platform,並實現了一個簡易的監控人員出入並拍照上送釘釘群的場景 場景 在公司大門入口處布點樹莓派和紅外感應,實現出入口人員出入時,自動拍照並上送釘釘群機器人 準備 物料準備

移動端安卓系統固定在底部的按鈕被輸入框的鍵盤頂上去的問題解決辦法

處理問題的思路:         監控螢幕大小的變化,當螢幕變小的時候讓按鈕隱藏起來,當螢幕大小與當前螢幕保持一致的時候,讓按鈕正常顯示。  解決辦法有2種: 1、原生辦法 (推薦) var h = document.body.scrollHeight; wi

Java 9 我們可以在匿名類使用 <> 操作符

不說了,直接上程式碼:   1 public class NewTest { 2 3 public static void main(String[] args) { 4 N<Integer> n1 = new N<Integer&

在mac系統docker pull 下來的映象儲存在哪裡?

Docker依賴Linux系統的cgroup實現,在mac系統中執行的時候,Docker會啟動一個虛擬機器中的Linux核心,並在硬碟上放一個 qcow2 格式的磁碟映象檔案。這個檔案會隨著Docker的使用不斷膨脹,即使刪除不用的Docker Image和Container也不會縮小。 Docke

區塊鏈儲存系統對於穩定幣的研究之DAI

在研究區塊鏈儲存的時候,區塊鏈的Token激勵機制非常關鍵。它可以驅動使用者將企業級儲存、伺服器、PC、移動儲存等剩餘儲存空間貢獻出來。使用者資料因而可以分散式得存放到不同節點上,每個節點實際存放的資料只是資料的一些切片,而且這些切片還以加密的方式儲存起來。 不過當前各類區

區塊鏈儲存系統對於穩定幣的研究之DAI(二)

緊接著上回未講完的繼續。 眾所周知,在Maker體系中存在兩種主要的貨幣,一個是我們熟知的DAI——穩定貨幣。它本身作為擁有資產背書的硬通貨,產生於無需准許的信貸系統中。 也就是說,隨意一個使用者都可以鎖定他們的數字資產,然後生成DAI。DAI的價格受系統

Linux系統將web專案部署到tomcat

RT 1. 將專案打成war包:執行maven命令 package命令生成的war包 注: eclipse 中使用 maven -install 2. 將 war 包放到Linux環境中 tomcat 目錄下的 wapps 下就好 3. 實現tomcat的熱部署: 即tomcat(L

Linux系統忘記root使用者密碼的解決辦法

摘要:忘記超級使用者密碼時,開機後則無法正常登陸。解決辦法:我們可以在開機狀態時進行重置密碼。 超級使用者root密碼忘記的解決方法: 注:如果已經是開機後的狀態並且忘記超級使用者的密碼,請從步驟一開始;如果是剛按下電腦的電源鍵,請從步驟二開始。 (1)重新啟動系統  

嵌入式程式設計我們該如何提高自己的程式設計水平

原文:http://www.sohu.com/a/145433685_432282 對於程式設計師而言,我們該如何提高自己的程式設計水平呢,凌陽教育的老師說過如果與真正的高手們比起來,拿我們還是差的太遠。在生活中,有誰是輕輕鬆鬆的就能提高自己的能力啊,世界上並沒有成為高手的間接捷徑, 但是還是有一

科室管理系統運用百度編輯器(ueditor1_4_3-utf8-jsp)出現的一系列問題!

1.首先下載ueditor1_4_3-utf8-jsp並解壓,下載地址:http://ueditor.baidu.com/website/download.html 2,在MyEclipse裡新建一個

win7系統用登錄檔的方式新增幾個右鍵選單

1.資料夾裡面 空白處》右鍵選單》生成檔案清單 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\Background\shell\生成檔案清單] [HKEY_CLASSES_ROOT\Directory\Backgr