我司基於K8s高可用集群架構

2020-09-26 51CTO

前言

我司的集群時刻處於崩潰的邊緣,通過近三個月的掌握,發現我司的集群不穩定的原因有以下幾點:

1、發版流程不穩定

2、缺少監控平臺【最重要的原因】

3、缺少日誌系統

4、極度缺少有關操作文檔

5、請求路線不明朗

總的來看,問題的主要原因是缺少可預知的監控平臺,總是等問題出現了才知道。次要的原因是伺服器作用不明朗和發版流程的不穩定。

解決方案

發版流程不穩定

重構發版流程。業務全面k8s化,構建以kubernetes為核心的ci/cd流程。

發版流程

有關發版流程如下:

淺析:研發人員提交代碼到developer分支(時刻確保developer分支處於最新的代碼),developer分支合併到需要發版環境對應的分支,觸發企業微信告警,觸發部署在k8s集群的gitlab-runner pod,新啟runner pod 執行ci/cd操作。在這個過程中需要有三個步驟:測試用例、打包鏡像、更新pod。第一次部署服務在k8s集群環境的時候可能需要:創建namespace、創建imagepullsecret、創建pv(storageclass)、創建deployment(pod controller)、創建svc、創建ingress、等。其中鏡像打包推送阿里雲倉庫和從阿里雲倉庫下載鏡像使用vpc訪問,不走公網,無網速限制。流程完畢,runner pod 銷毀,gitlab 返回結果。

需要強調的一點是,在這裡的資源資源清單不包含configmap或者secret,牽扯到安全性的問題,不應該出

現在代碼倉庫中,我司是使用rancher充當k8s多集群管理平臺,上述安全問題在rancher的dashboard中由運維來做的。

服務部署邏輯圖

有關服務部署邏輯圖如下:

根據發版流程的淺析,再根據邏輯圖可以明確發版流程。在這裡看到我司使用的是kong代替nginx,做認證、鑑權、代理。而slb的ip綁定在kong上。0,1,2屬於test job;3屬於build job;4,5,6,7屬於change pod 階段。並非所有的服務都需要做存儲,需要根據實際情況來定,所以需要在kubernetes.sh裡寫判斷。在這裡我試圖使用一套CI應用與所有的環境,所以需要在kubernetes.sh中用到的判斷較多,且.gitlab-ci.yml顯得過多。建議是使用一個ci模版,應用於所有的環境,畢竟怎麼省事怎麼來。還要考慮自己的分支模式,具體參考:https://www.cnblogs.com/zisefeizhu/p/13621797.html

缺少監控預警平臺

構建可信賴且符合我司集群環境的聯邦監控平臺,實現對幾個集群環境的同時監控和預故障告警,提前介入。

監控預警邏輯圖

有關監控預警邏輯圖如下:

淺析:總的來說,我這裡使用到的監控方案是prometheus➕shell腳本或go腳本➕sentry。使用到的告警方式是企業微信或者企業郵箱。上圖三種顏色的線代表三種監控方式需要注意。腳本主要是用來做備份告警、證書告警、抓賊等。prometheus這裡採用的是根據prometheus-opertor修改的prometheus資源清單,數據存儲在nas上。sentry嚴格的來講屬於日誌收集類的平臺,在這裡我將其歸為監控類,是因為我看中了其收集應用底層代碼的崩潰信息的能力,屬於業務邏輯監控, 旨在對業務系統運行過程中產生的錯誤日誌進行收集歸納和監控告警。

注意這裡使用的是聯邦監控平臺,而部署普通的監控平臺。

聯邦監控預警平臺邏輯圖

多集群聯邦監控預警平臺邏輯圖如下:

因為我司有幾個k8s集群,如果在每個集群上都部署一套監控預警平臺的話,管理起來太過不便,所以這裡我採取的策略是使用將各監控預警平臺實行一個聯邦的策略,使用統一的可視化界面管理。這裡我將實現三個級別餓監控:作業系統級、應用程式級、業務級。對於流量的監控可以直接針對kong進行監控,模版7424。

缺少日誌系統

隨著業務全面k8s化進程的推進,對於日誌系統的需求將更加渴望,k8s的特性是服務的故障日誌難以獲取。建立可觀測的能過濾的日誌系統可以降低對故障的分析難度。

有關日誌系統邏輯圖如下:

淺析:在業務全面上k8s化後,方便了管理維護,但對於日誌的管理難度就適當上升了。我們知道pod的重啟是有多因素且不可控的,而每次pod重啟都會重新記錄日誌,即新pod之前的日誌是不可見的。當然了有多種方法可以實現日誌長存:遠端存儲日誌、本機掛載日誌等。出於對可視化、可分析等的考慮,選擇使用elasticsearch構建日誌收集系統。

極度缺少有關操作文檔

建立以語雀--> 運維相關資料為中心的文檔中心,將有關操作、問題、腳本等詳細記錄在案,以備隨時查看。

淺析因安全性原因,不便於過多同事查閱。運維的工作比較特殊,安全化、文檔化是必須要保障的。我認為不論是運維還是運維開發,書寫文檔都是必須要掌握的,為己也好,為他也罷。文檔可以簡寫,但必須要含苞核心的步驟。我還是認為運維的每一步操作都應該記錄下來。

請求路線不明朗

根據集群重構的新思路,重新梳理集群級流量請求路線,構建具備:認證、鑑權、代理、連接、保護、控制、觀察等一體的流量管理,有效控制故障爆炸範圍。

請求路線邏輯圖如下:

淺析:客戶訪問https://www.cnblogs.com/zisefeizhu 經過kong網關鑑權後進入特定名稱空間(通過名稱空間區分項目),因為服務已經拆分為微服務,服務間通信經過istio認證、授權,需要和資料庫交互的去找資料庫,需要寫或者讀存儲的去找pv,需要轉換服務的去找轉換服務...... 然後返迴響應。

總結

綜上所述,構建以:以kubernetes為核心的ci/cd發版流程、以prometheus為核心的聯邦監控預警平臺、以elasticsearch為核心的日誌收集系統、以語雀為核心的文檔管理中心、以kong及istio為核心的南北東西流量一體化服務,可以在高平發,高可靠性上做到很好保障。

附:總體架構邏輯圖


註:請根據箭頭和顏色來分析。

淺析:上圖看著似乎過於混亂,靜下心來,根據上面的拆分模塊一層層分析還是可以看清晰的。這裡我用不同顏色的連線代表不同模塊的系統,根據箭頭走還是蠻清晰的。

根據我司目前的業務流量,上述功能模塊,理論上可以實現集群的維穩。私認為此套方案可以確保業務在k8s集群上穩定的運行一段時間,再有問題就屬於代碼層面的問題了。這裡沒有使用到中間件,倒是使用到了緩存redis不過沒畫出來。我規劃在上圖搞定後再在日誌系統哪裡和轉換服務哪裡增加個中間件kafka或者rq 看情況吧。

過手如登山,一步一重天

作者:紫色飛豬

來源:https://www.cnblogs.com/zisefeizhu/p/13692782.html

相關焦點

  • 使用kubeadm的方式搭建K8S高可用集群
    PS: 最近經常有朋友問我有沒有用kubeadm搭建高可用集群的文檔,說實在的我確實沒有,我自己測試的話就用kubeadm單master版,公司用的話就用二進位搭建的。nbsp; 55s   v1.18.2測試切換關閉一臺master主機,看集群是否可用
  • k8s集群CI/CD集成介紹二:rancher搭建k8s集群環境
    對軟體技術感興趣的童鞋請關注我,後續技術分享更精彩。容器編排從幾年前群雄割據、各方亂戰,到如今Google的k8s一統天下。能迅速力挽狂瀾,已說明其技術實力。但k8s複雜的架構,不太友好的文檔,確實讓一些初學者望而卻步。近期正好一直在學習k8s的東西,走了一些彎路。整理出來以備參考。
  • 用rancher2分分鐘搭建k8s集群
    它是Google基於Borg開源的容器編排調度引擎,作為CNCF(Cloud Native Computing Foundation)最重要的組件之一,它的目標不僅僅是一個編排系統,而是提供一個規範,可以讓你來描述集群的架構,定義服務的最終狀態,Kubernetes可以幫你將系統自動地達到和維持在這個狀態。
  • kubeadm搭建高可用集群
    PS: 最近經常有朋友問我有沒有用kubeadm搭建高可用集群的文檔,說實在的我確實沒有,我自己測試的話就用kubeadm單master版,公司用的話就用二進位搭建的。Ready master 32m v1.18.2k8s-node01 Ready node01 55s v1.18.2測試切換關閉一臺master主機,看集群是否可用。
  • 聽說生鮮領軍企業k8s集群都上雲了,魚會飛了?
    從架構設計層面,我們關注的可用性,伸縮性都可以結合k8s得到很好的解決,如果你想使用微服務架構,搭配k8s,真的是完美,再從部署運維層面,服務部署,服務監控,應用擴容和故障處理,k8s基於多個專有網絡構建VPC互聯場景下的多Kubernetes集群,打通VPC間的物理鏈路,實現數據請求轉發的互通性。
  • 教你一次性成功安裝K8S集群(基於一主兩從模式)
    作者個人研發的在高並發場景下,提供的簡單、穩定、可擴展的延遲消息隊列框架,具有精準的定時任務和延遲隊列處理功能。自開源半年多以來,已成功為十幾家中小型企業提供了精準定時調度方案,經受住了生產環境的考驗。
  • k8s集群CI/CD集成介紹一:環境準備
    對軟體技術感興趣的童鞋請關注我,後續技術分享更精彩。容器編排從幾年前群雄割據、各方亂戰,到如今Google的k8s一統天下。能迅速力挽狂瀾,已說明其技術實力。但k8s複雜的架構,不太友好的文檔,確實讓一些初學者望而卻步。近期正好一直在學習k8s的東西,走了一些彎路。整理出來以備參考。
  • k8s集群CI/CD集成介紹三:rancher應用部署
    對軟體技術感興趣的童鞋請關注我,後續技術分享更精彩。容器編排從幾年前群雄割據、各方亂戰,到如今Google的k8s一統天下。能迅速力挽狂瀾,已說明其技術實力。但k8s複雜的架構,不太友好的文檔,確實讓一些初學者望而卻步。近期正好一直在學習k8s的東西,走了一些彎路。整理出來以備參考。
  • k8s集群搭建
    kubeadmkubeadm 是官方社區推出的一個用於快速部署 kubernetes 集群的工具。這個工具能通過兩條指令完成一個 kubernetes 集群的部署:創建一個Master節點kubernetes init
  • k8s集群CI/CD集成介紹四:Jenkins部署應用到rancher集群
    對軟體技術感興趣的童鞋請關注我,後續技術分享更精彩。容器編排從幾年前群雄割據、各方亂戰,到如今Google的k8s一統天下。能迅速力挽狂瀾,已說明其技術實力。但k8s複雜的架構,不太友好的文檔,確實讓一些初學者望而卻步。近期正好一直在學習k8s的東西,走了一些彎路。整理出來以備參考。
  • 如何基於標準k8s打造邊緣計算雲原生基礎設施?
    12月3日,在邊緣計算社區社群上,阿里雲高級技術專家黃玉奇做了《雲邊一體——如何基於標準k8s打造邊緣計算雲原生基礎設施》主題分享,黃老師在阿里雲做容器服務,近幾年一直從事雲原生相關領域工作。本文根據黃老師分享整理,一共6300字,乾貨滿滿,預計閱讀19分鐘!引言云原生的理念如今正如火如荼。
  • GIAC 2020 全球網際網路架構大會演講實錄:基於TarsGo的微服務技術...
    第六屆GIAC,將從網際網路架構最熱門的前沿技術、技術管理、系統架構、大數據和人工智慧、移動開發和語言、架構相關等領域,分享有典型代表的技術創新及研發實踐的架構案例。 在Go語言專題,騰訊高級工程師利開園發表了題為《基於TarsGo的微服務技術架構實踐》的主題演講。
  • k8s版本平滑升級
    請關注我,後續分享更精彩!!!容器化技術興起後,k8s無疑成為了容器編排技術的事實標準。各行各業軟體領域的廣泛應用,進一步促進了k8s的快速發展,對應版本的更新也層出不窮。實際項目使用過程中,可能會遇到框架層面的bug在新版本中得到修復,高版本的一些特性剛好滿足新的業務需求,這時候就需要在原有k8s集群上進行升級。如何快速、平滑的實現k8s的版本更新?
  • 郭憶:網易資料庫高可用架構最新進展!
    分享大綱:  1、資料庫高可用發展歷程  2、Aurora高可用架構設計  3、MGR高可用架構設計  4、網易多副本數據一致高可用架構設計  正文:  1、資料庫高可用發展歷程  首先我們先來簡單回顧一下資料庫高可用的發展歷程,最原始的資料庫高可用的做法是基於replication快速搭建主從複製架構。
  • K8S整體架構解析,簡單明了
    一個K8S集群由兩部分構成 master節點和node節點。master節點主要負責集群的控制,對pod進行調度,已經令牌管理等等功能。node節點主要是負責幹活,啟動容器、管理容器。master節點和node節點一般不要部署在一臺機器上。
  • k8s集群CI&CD集成介紹四:Jenkins部署應用到rancher集群
    容器編排從幾年前群雄割據、各方亂戰,到如今Google的k8s一統天下。能迅速力挽狂瀾,已說明其技術實力。但k8s複雜的架構,不太友好的文檔,確實讓一些初學者望而卻步。近期正好一直在學習k8s的東西,走了一些彎路。整理出來以備參考。
  • Kind + Docker 一鍵部署K8s集群
    docker學習和實踐都很容易,但是K8S的由於集群化,部署需要較多的機器,環境搭建學習實踐比較費勁這一度影響了K8S技術的普及。所以業界也除了一些簡易版的K8s集群環境,比如K3S(5 less than k8s),本文蟲蟲給大家介紹也是這樣一個項目Kind,一鍵部署的單機K8S環境,可以用於學習、本地開發和CI環境。
  • OpenStack高可用核心架構分析
    而OpenStack這樣一個複雜系統,高可用更涉及到多個層面,只要有一個層面做不到高可用,那麼整個OpenStack都沒法高可用。可以看一下一個經典的OpenStack物理架構如下所示:典型例子是一個網站的Web伺服器集群,往往採用前端加LVS或者Nginx之類的LoadBanlace伺服器解決HA問題(LVS和Nginx的高可用又是如何做呢?主要是利用Keepalived,Heartbeat等基於路由冗餘協議VRRP或心跳仲裁機制來解決)。
  • 詳解k8s原生集群監控方案Heapster+InfluxDB
    1、淺析監控方案heapster是一個監控計算、存儲、網絡等集群資源的工具,以k8s內置的cAdvisor作為數據源收集集群信息,並匯總出有價值的性能數據(Metrics):cpu、內存、network、filesystem等,然後將這些數據輸出到外部存儲
  • 詳解kubeadm安裝k8s集群常見問題
    master的安裝與配置CPU數量至少需要兩個,通過虛擬機軟體調節內存不要小於2G,否則可能無法關閉交換區不支持交換內存基於性能等方面的考慮,kubernetes禁用了交換內存,所以要關閉swap。網上通常都是從阿里雲下載,但是阿里雲的好像不一定能用了,我在docker hub上發現了kubernetes的同步庫gotok8s,應該是官方同步過來了,更新比較及時,版本也相互對應,配置好加速器下載也非常快。如果對應版本的庫不存在,就找版本相近的(kube開頭的幾個庫版本要相同),在安裝的時候指定好對應的版本。