做者 | 韓堂、柘遠、沉醉
來源 | 阿里巴巴雲原生公衆號
node
臺灣做家林清玄在接受記者採訪的時候,如此評價本身 30 多年寫做生涯:「第一個十年我才華橫溢,‘賊光閃現’,令周邊黯然失色;第二個十年,我終於‘寶光現形’,再也不去搶風頭,反而與身邊的美麗相得益彰;進入第三個十年,繁華落盡見真醇,我進入了‘醇光初現’的階段,真正體味到了境界之美」。
長夜有窮,真水無香。領略過了 K8s「身在江湖」的那種驚心動魄以及它那生態系統的繁花似錦,該是回過頭來體味高可用體系境界之美的時候了。畢竟僅能經得起敲打仍是不能獨步武林的!
在 K8s 高可用領域有一個問題被你們所熟知,那就是 K8s 單集羣規模帶來的 SLO 問題,如何持續保障?今天就以單集羣的規模增加帶來的高可用挑戰來做爲引子來給你們一個體感。
ASI 單集羣規模支撐超過社區的 5000 臺,這是個很是有意思且具有極大挑戰的事情,對須要進行 K8s 生產化的同窗,甚至具有 K8s 生產化經驗的同窗來講,必定會是個感興趣的話題。回看 ASI 單集羣規模從 100 到 10000 的發展之路,伴隨着業務的增加和創新帶來的每一次集羣規模增加,都在逐步使咱們的壓力和挑戰發生質變。
web
ASI:Alibaba Serverless infrastructure,阿里巴巴針對雲原生應用設計的統一基礎設施,ASI 是阿里公共雲服務 ACK 的阿里集團企業版。
你們知道 K8s 社區只可以支撐五千個節點,當超過這個規模時,會出現各類性能瓶頸問題,好比:算法
以電商場景爲例,100 節點增加到 4 千節點的時候,咱們提早針對 ASI apiserver 的客戶端和服務端作了大量的性能優化,從 apiserver 客戶端的角度優先訪問本地 cache,在客戶端去作負載均衡;apiserver 服務端主要作了 watch 優化和 cache 索引優化;在 etcd 內核上利用併發讀提高單 etcd 集羣讀處理能力,基於 hashmap 的 freelist 管理新算法提升 etcd 存儲上限,基於 raft learner 技術來提升多備能力等等。
從 4 千節點增加到 8 千節點,咱們又作了 qps 限流管理和容量管理優化、etcd 單資源對象存儲拆分、組件規範全生命週期落地經過客戶端的規範約束下降對 apiserver 的壓力和以及穿透到 etcd 的壓力等等。
終於迎來 8 千節點增加到上萬節點的時刻,咱們開始如火如荼地開展 etcdcompact 算法優化;etcd 單節點多 multiboltdb 的架構優化,apiserver 的服務端數據壓縮,經過組件治理下降 etcd 寫放大等;同時開始打造常態化的壓測服務能力,持續回答 ASI 的 SLO。
這些例子在高可用挑戰中司空見慣,列出的能力也只是其中一小部分,你也許很難看到能力之間的關聯和底層的演進邏輯。固然,更多的能力建設沉澱到了咱們的系統和機制當中。本篇文章會做爲一個開始,以綜述的形式分享咱們在建設 ASI 全局高可用體系中的幾個關鍵部分,再日後會有針對性地對進行技術點和演進路線的詳解。若是你們有什麼問題或者但願瞭解的部分,歡迎在評論區留言。api
高可用是個比較複雜的命題,任何平常的變化例如服務升級、硬件更新、數據遷移、流量突增等均可能形成服務 SLO 受損,甚至不可用。
ASI 做爲容器平臺,並不是孤立存在,而是與雲底層及公共服務造成完備的生態系統。要解決 ASI 的高可用問題,須要縱觀全局,找出每層的最優解,最終串聯組成最優的總體解決方案。涉及到的層面包括:
緩存
特別是在 ASI 這個場景下,要支撐的業務集羣數量龐大,涉及到的研發運維人員衆多,功能發佈頻繁的迭代開發模式以及業務種類繁多帶來的運行時的複雜多變,相比其餘容器平臺來看,ASI 高可用面臨更多的挑戰,其難度不言而喻。
安全
以下圖所示,現階段高可用能力建設總體策略以 1-5-10(故障 1 分種發現、5 分鐘定位、10 分鐘止損)爲目標牽引,注重將能力沉澱到系統或機制中,讓 SRE/Dev 可以無差異的 oncall。
儘可能避免發生問題、儘快發現、定位及恢復問題,是實現目標的關鍵,爲此咱們將 ASI 全局高可用體系的實現分三大部分展開:一是基礎能力建設;二是應急體系建設;三是經過常態化壓測以及故障演練等完成上述能力的保鮮和持續演進。
性能優化
經過 3 個部分的輪轉驅動,實現一個 ASI 全局高可用體系的構建,其頂層是 SLO 體系和 1-5-10 應急體系。在應急體系和數據驅動的體系背後,咱們建設了大量高可用基礎能力,包括防護體系、高可用架構升級、故障自愈體系、以及持續改進機制。與此同時,咱們創建了多個基礎性平臺爲高全用體系提供配套能力,如常態化故障演練平臺、全鏈路仿真壓測平臺、告警平臺、預案中心等等。
架構
在建設全局高可用能力以前,咱們的系統在迅速發展和變化下不斷出現事故和險情,須要隔三差五去應急,致使讓問題追身的局面,而且追身後沒高效應對的手段,面臨着幾個嚴峻的挑戰:
併發
針對這些問題,而且總結出如下幾個核心緣由:
app
針對這些解決的問題,咱們作了高可用基礎能力的頂層設計,這些基礎能力建設總體主要分爲幾個部分:
下面針對咱們的一些痛點進行幾個關鍵能力建設的描述。
這裏面從兩個大的角度能夠去提升集羣架構的可用性,除了在單集羣進行架構優化以及性能突破外,還要經過多集羣這樣的橫向擴展能力去支撐更大的規模。
核心方案就是經過對 apiserver 進行分組,經過不一樣的優先級策略進行對待,從而對服務進行差別化 SLO 保障。
經過分流以下降主鏈路 apiserver 壓力(核心訴求)
旁路 apiserver 配合主鏈路作藍綠、灰度(次級訴求)
SLB 災備(次級訴求)
目前張北中心的一個機房就幾萬節點,若是不解決多集羣的管理問題,帶來的問題以下:
所以 ASI 須要達成統一的多集羣管理解決方案,幫助上層各個 Pass、SRE、應用研發等提供更好的多集羣管理能力,經過它來屏蔽多集羣的差別、方便的進行多方資源共享。
ASI 選擇基於社區聯邦 v2 版原本開發知足咱們的需求。
在一個大規模的 K8s 集羣中性能會遇到哪些問題呢?
ASI 的性能優化能夠從 apiserver 客戶端、apiserver 服務端、etcd 存儲 3 個方面來進行優化。
在 K8s 中,kube-apiserver 做爲統一入口,全部的控制器/client 都圍繞 kube-apiserver 在工做,儘管咱們 SRE 經過組件的全生命週期進行規範約束卡點改進,好比經過在組件的啓用和集羣准入階段進行了卡點審批,經過各個組件 owner 的全面配合改造後,大量的低級錯誤獲得防範,但仍是有部分控制器或部分行爲並不可控。
除了基礎設施層面的故障外,業務流量的變化,是形成 K8s 很是不穩定的因素,突發的 pod 建立和刪除,若是不加以限制,很容易把 apiserver 打掛。
另外非法的操做或代碼 Bug 有可能形成業務 pod 影響,如不合法的 pod 刪除。
結合全部風險進行分層設計,逐層進行風險防控。
社區早期採用的限流方式主要經過 inflight 控制讀寫整體併發量,咱們當時在 apf 沒有出來以前就意識到限流能力的不足,沒有能力去對請求來源作限流。而 apf 經過 User 來作限流(或者說要先通過 authn filter)存在一些不足,一方面由於Authn 並非廉價的,另一方面它只是將 API Server 的能力按配置來作分配,並非一種限流方案和應急預案。咱們須要緊急提供一種限流能力,以應對緊急狀況,自研了 ua limiter 限流能力,並基於 ua limiter 簡單的配置方式實現了一套限流管理能力,可以很方便在幾百個集羣當中進行默認限流管理,以及完成應急限流預案。
下面是咱們自研的 ua limiter 限流方案和其餘限流方案的詳細對比:
ua limiter、APF、sentinel 在限流上的側重點是不同的:
考慮咱們現階段的需求和場景,發現 ua limiter 落地最爲合適,由於咱們經過 user agent 的不一樣,來對於組件進行限流。固然後續進行更加精細的限流,仍是能夠考慮結合使用 APF 等方案進一步增強。
限流策略如何管理,數百套集羣,每套集羣規模都不太同樣,集羣節點數、pod 數都是不一樣的,內部組件有近百個,每一個組件請求的資源平均有 4 種,對不一樣資源又有平均 3 個不一樣的動做,若是每一個都作限流,那麼規則將會爆炸式增加,即使作收斂後維護成本也很是的高。所以咱們抓最核心的:核心資源 pod\node、核心動做(建立、刪除、大查詢);最大規模的:daemonset 組件、PV/PVC 資源。並結合線上實際流量分析,梳理出二十條左右的通用限流策略,並將其歸入到集羣交付流程中實現閉環。
當新的組件接入,咱們也會對其作限流設計,若是比較特殊的,則綁定規則並在集羣准入和部署環節自動下發策略,若是出現大量的限流狀況,也會觸發報警,由 SRE 和研發去跟進優化和解決。
全部 pod 相關的操做都會對接 Kube Defender 統一風控中心,進行秒級別、分鐘級、小時級、天級別的流控。該全局風控限流組件,實行中心端部署,維護各場景下的接口調用限流功能。
defender 是站在整個 K8s 集羣的視角,針對用戶發起的或者系統自動發起的有風險的操做進行防禦(流控、熔斷、校驗)和審計的風控系統。之因此作 defender,主要從如下幾個方面考慮:
defender 的框架圖以下所示:
在只有幾個 core 集羣的場景下,依靠專家經驗管理容量徹底能夠輕鬆搞定,但隨着容器業務的快速發展,覆蓋泛交易、中間件、新生態、新計算以及售賣區等業務在接入 ASI,短短几年時間就發展了幾百個集羣,再發展幾年數以千計萬計?如此多的集羣依靠傳統的人肉資源管理方式難以勝任,人力成本愈來愈高,特別是面臨諸如如下問題,極易形成資源使用率低下,機器資源的嚴重浪費,最終形成部分集羣容量不足致使線上風險。
在 ASI 中,組件變化是常態,組件容量如何自適應這種變化也是一個很是大的挑戰。而平常的運維及診斷需要有精準的容量數據來做爲備容支撐。
所以咱們決定經過數據化指導組件申請合理的(成本低,安全)容器資源。經過數據化提供平常運維所須要的容量相關數據,完成備容,在生產水位異常時,完成應急擴容。
目前咱們完成了水位監控、全量風險播報、預調度、profile 性能數據定時抓取、進而經過組件規範中推動 CPU 內存以及 CPU 內存比例優化。正在作的包括自動化的規格建議,節點資源補充建議,以及自動化導入節點,結合 chatops 正在打造釘羣「一鍵備容」閉環。另外還在結合全鏈路壓測服務數據,得出各個組件的基線對比,經過風險決策,進行發佈卡點,確保組件上線安全。同時將來會結合線上真實的變動,來持續回答真實環境的 SLO 表現,精準預測容量。
高可用基礎能力的建設能夠爲 ASI 提供強有力的抗風險保障,從而在各類風險隱患出現時,儘量保證咱們服務的可用性。可是在風險出現後,如何快速介入消滅隱患,或者在高可用能力沒法覆蓋的故障出現後,進行有序止損,就變成了一個很是具備技術深度和橫向複雜度的工程難題,也讓 ASI 的應急能力建設成爲咱們很是重要的投入方向。
在建設應急體系之初,咱們的系統因爲迅速的發展和變化,不斷出現的事故和險情,明顯的暴露出當時咱們面臨的幾個嚴重的問題:
針對這些問題,咱們也進行了充分的腦暴和探討,而且總結出如下幾個核心緣由:
針對這些亟待解決的問題,咱們也作了應急能力的頂層設計,架構圖以下:
應急能力建設總體能夠分爲幾個部分:
針對頂層設計中的每一個子模塊,咱們都已經作出了一些階段性的工做和成果。
爲了解決沒法早於客戶發現問題的難題,咱們的工做最重要的目標就是要作到:讓一切問題都無處遁形,被系統主動發現。
因此這就像是一場持久戰,咱們要作的,就是經過各類可能的手段去覆蓋一個又一個新的問題,攻佔一個又一個城池。
在這個目標的驅使下,咱們也總結出一套很是行之有效的「戰略思想」,即「1+1 思想」。它的核心觀點在於,任何發現問題的手段,均可能由於對外部的依賴或者自身穩定性的缺陷,致使偶發的失效,因此必須有可以做爲互備的鏈路來進行容錯。
在這個核心思想的指導下,咱們團隊建設了兩大核心能力,即黑盒/白盒報警雙通道,這兩個通道的各有各的特色:
黑盒通道對應的具體產品叫作 kubeprobe,是由咱們團隊脫胎於社區 kuberhealthy 項目的思想上進行更多的優化和改造造成的新產品,而且也成爲咱們判斷集羣是否出現嚴重風險的重要利器。
白盒通道的建設相對更爲複雜,它須要建設在完備的可觀測數據的基礎之上,纔可以真正發揮它的功力。因此爲此咱們首先從 metrics、日誌、事件 3 個維度分別基於 SLS 建設 3 種數據通道,將全部可觀測數據統一到 SLS 上管理。另外咱們也建設了告警中心,負責完成對當前上百套集羣的告警規則的批量管理,下發能力,最終構造了出了一個數據完備,問題覆蓋普遍的白盒告警系統。最近還在進一步將咱們的告警能力向 SLS 告警 2.0 遷移,實現更加豐富的告警功能。
隨着線上問題排查經驗的不斷豐富,咱們發現有不少問題會比較頻繁地出現。它們的排查方法和恢復手段基本已經比較固化。即使某個問題背後的緣由可能有多種,可是隨着線上排查經驗的豐富,基本均可以慢慢迭代出對這個問題的排查路線圖。以下圖所示,是針對 etcd 集羣不健康的告警設計的排查路線:
若是把這些相對比較確認的排查經驗固化到系統中,在問題出現後能夠自動觸發造成決策,勢必能夠大幅減小咱們對線上問題的處理耗時。因此在這個方面,咱們也開始了一些相關能力的建設。
從黑盒通道方面,kubeprobe 構建了一套自閉環的根因定位系統,將問題排查的專家經驗下沉進系統中,實現了快速和自動的問題定位功能。經過普通的根因分析樹以及對失敗巡檢探測事件/日誌的機器學習分類算法(持續開發投入中),爲每個 KubeProbe 的探測失敗 Case 作根因定位,並經過 KubeProbe 內統一實現的問題嚴重性評估系統(目前這裏的規則仍比較簡單),爲告警的嚴重性作評估,從而判斷應該如何作後續的處理適宜,好比是否自愈,是否電話告警等等。
從白盒通道方面,咱們經過底層的 pipeline 引擎的編排能力,結合已經建設的數據平臺中的多維度數據,實現了一個通用的根因診斷中心,將經過各類可觀測數據從而排查問題根因的過程經過 yaml 編排的方式固化到系統中,造成一個根因診斷任務,而且在觸發任務後造成一個問題的診斷結論。而且每種結論也會綁定對應的恢復手段,好比調用預案、自愈等等。
兩種通道都經過釘釘機器人等手段實現相似 chatops 的效果,提高 oncall 人員的處理問題速度。
爲了可以提高運行時故障的止損恢復速度,咱們也把恢復止損能力的建設放在第一優先級,這個方面咱們的核心準則是兩個:
因此在這兩個準則的驅使下,咱們作了兩個方面的工做:
針對缺少跟進能力的問題,咱們提出了 BugFix SLO 機制。正如名字所描述的那樣,咱們認爲每一個發現的問題都是一個要被修復的 「Bug」,而且針對這種 Bug 咱們作了一下工做:
每兩週,經過過去一段時間收集的新的問題,咱們會產出一份穩定性週報,進行問題解決程度的通曬以及重點問題的同步。另外也會在每兩週進行一次全員拉會對齊,對每一個新問題的負責人肯定,優先級確認進行對齊。
因爲穩定性風險是相對低頻發生的,因此對穩定性能力的最好的保鮮手段就是演練,因此在這個基礎之上咱們設計或者參與了兩種演練方案,分別是:
常態化故障演練機制的核心目的在於以更頻繁的頻率對 ASI 系統相關的故障場景以及針對這個故障的恢復能力進行持續驗收,從而既發現某些組件的在穩定性方面的缺陷,也能夠驗收各類恢復手段預案的有效性。
因此爲了可以儘量提高演練頻率,咱們:
鑑於常態化演練的演練頻率如此之高,咱們一般在一個專用的集羣中進行持續的後臺演練場景觸發,以下降由於演練帶來的穩定性風險。
常態化故障演練即使作的再頻繁,咱們也不能徹底保證在生產集羣真的出現一樣的問題,咱們是否可以以一樣的方式進行應對;也沒有辦法真正確認,這個故障的影響範圍是否與咱們預期的範圍一致;這些問題最根本的緣由仍是在於咱們在常態化故障演練中的集羣通常是沒有生產流量的測試集羣。
因此在生產環境進行故障模擬纔可以更加真實的反應線上的實況,從而提高咱們對恢復手段的正確性的信心。在落地方面,咱們經過積極參與到雲原生團隊組織的季度生產突襲活動,將咱們一些相對複雜或者比較重要的演練場景實現了在生產環境的二次驗收,與此同時也對咱們的發現速度,響應速度也進行了側面評估,不只發現了一些新的問題,也爲咱們如何在測試集羣設計更符合線上真實狀況的場景帶來了不少參考輸入。
本篇僅做爲開篇從總體上介紹了 ASI 全局高可用體系建設上一些探索工做以及背後的思考,後續團隊會針對具體的領域好比 ASI 應急體系建設,ASI 預防體系建設,故障診斷與恢復、全鏈路精細化 SLO 建設和運營、ASI 單集羣規模的性能瓶頸突破上等多個方面進行深刻的解讀,敬請期待。
ASI 做爲雲原生的引領實施者,它的高可用,它的穩定性影響着甚至決定着阿里集團和雲產品的業務的發展。ASI SRE 團隊長期招人,技術挑戰和機會都在,感興趣的同窗歡迎來撩:en.xuze@alibaba-inc.com,hantang.cj@taobao.com。
數字時代,如何更好地利用雲的能力?什麼是新型、便捷的開發模式?如何讓開發者更高效地構建應用?科技賦能社會,技術推進變革,拓展開發者的能量邊界,一切,因雲而不一樣。點擊當即報名活動,2021 阿里雲開發者大會將會帶給你答案。