自動化運維大規模 Kubernetes 集群的實踐之路
來自專欄 sofastack
5 人贊了文章
導讀
此文章分享了螞蟻金服如何自動化運維大規模 Kubernetes 集群的實踐乾貨。"大規模 Kubernetes 集群"主要體現在幾十個 Kubernetes 集群,十萬級別的 Kubernetes Worker 節點。螞蟻金服使用 Operator 的模式去運維 Kubernetes 集群,能便捷、自動化的管理 Kubernetes 集群生命周期,做到 " Kubernetes as a Service " 。此文適合 Kubernetes 愛好者,Kubernetes 架構師,以及 PE/SRE 閱讀。
前序知識
Kubernetes 架構介紹此章節簡單介紹 Kubernetes 集群的架構。主要是為了面向剛學習 Kubernetes 的同學,對於熟悉 Kubernetes 的同學,此章節可以跳過。Operator 介紹
我們在這裡將花很少的篇幅向剛學習 Kubernetes 的同學介紹 Operator。如果期望獲得更詳細的解讀請參考 coreos 上關於 Operator 的介紹。
一個 Operator 實際上是為了解決某個複雜應用在 Kubernetes 的自動化部署、恢復。有了Operator,用戶只需要向Kubernetes Apiserver提交一個CRD Resource(yaml或者JSON,一個CRD Resource其實就是對應一個應用實例,CRD Resource用於描述這個應用實例的配置),Operator 就會根據用戶的需求去完成這個應用實例的初始化,在應用某個模塊發生故障時,Operator 也會做出自動恢復功能。Operator 是用代碼運維應用最好的實踐之一。apiVersion: etcd.database.coreos.com/v1beta2
kind: EtcdCluster
metadata:
name: xxx-etcd-cluster
spec:
size:
5
其中,上面的Spec.Size=5
代表了我們需要一個由 5 個 etcd 節點組成的 etcd 集群。etcd-operator 會根據上面的配置,初始化完成 etcd 集群。相應的,如果你又需要另一個 3 節點的etcd 集群,你只需要提交新的一個Spec.Size=3
的 CRD Resource 即可。
背景
在螞蟻金服,我們面臨著需要運維幾十個 Kubernetes 集群,以及十萬級別以上的Kubernetes Worker 節點的難題。我們將運維 Kubernetes 的工作拆分兩部分,一部分是運維 Kubernetes 集群的 Master 組件(etcd, Apiserver, controller-manager, scheduler等),一部分是運維 Kubernetes Worker 節點。我們總結了這兩部分運維的難點。難點1:運維 Kubernetes 集群 Master 角色- 如何快速新建、下線一個 Kubernetes 集群 (初始化、刪除 Master 角色)。由於螞蟻業務的快速增長,我們隨時面臨著需要在新機房新建、下線一個 Kubernetes集群;CI 和測試也有快速新建、刪除一個 Kubernetes 集群的需求。
- 如何管理幾十個 Kubernetes 集群 Master 組件版本。比如我們需要升級某幾個Kubernetes 集群的 Apiserver,Scheduler 等組件。
- 如何自動化處理幾十個 Kubernetes 集群 Master 組件發生的故障。
- 如何能獲取幾十個 Kubernetes 集群 Master 組件的統一視圖。我們希望有一個統一的介面,一下就能獲取每個 Kubernetes 集群 Master 角色的版本、狀態等信息。
難點2:運維 Kubernetes Worker 節點
- 如何快速上線、下線 Kubernetes Worker 節點。上線時,我們需要保證 Kubernetes Worker 節點所需要的on-host軟體版本、配置正確。
- 如何升級十萬級別的 Kubernetes Worker 節點上的 on-host 軟體。如我們需要將所有Work節點的 docker、cni 版本升級到某個版本。
- 如何優雅的執行灰度發布 Kubernetes Worker 節點上的軟體包。在 on-host 軟體新版本上線前,我們需要對它做小範圍的灰度發布,即挑選 N 台 Worker 節點發布新版本軟體包,執行驗證,最後根據驗證結果決定是否全規模的發布新版本,或者回滾這個灰度發布。
- 如果自動化處理十萬級別的 Kubernetes Worker 節點可能出現的 on-host 軟體故障。比如 dockerkubelet 發生 panic,我們是否能自動化得處理。
實現方案
在螞蟻,我們使用 Kube-on-Kube-Operator 和 Node-Operator 組合使用解決上述的難題。- 首先,我們需要藉助工具,使用Kubernetes官方提供的方案( Static Pod 方式)部署「 Kubernetes 元集群」(後面簡稱元集群)到 「元集群」的 Master 節點上。
- 然後,我們將 Kube-on-Kube-Operator 部署到 「 Kubernetes 元集群」。我們將一個 Kubernetes 集群所需的一系列 Master 組件當成一個複雜的應用。當我們需要一個「 Kubernetes 業務集群」(後面簡稱業務集群),我們只需要向元集群 Apiserver 提交用於描述「 Kubernetes 業務集群」的 Cluster CRD Resource (下文會介紹我們如何設計 CRD 結構),Kube-on-Kube-Operator 就為我們準備好了一個可以工作的「Kubernetes 業務集群」("業務集群" Master 組件都已經Ready,需要擴容 Worker 節點)。
- 之後我們在「 Kubernetes 業務集群」上,部署上 Node-Operator。Node-Operator 負責 Worker 節點的生命周期。當我們需要擴容一個 Worker 節點,我們只需要提交描述 Worker 節點的元數據( IP, Hostname, 機器運維登錄方式等)的 Machine CRD Resource (下文會介紹我們如何設計 CRD 結構),Node-Operator 就會將 Worker 節點初始化完成,並成功加入到 「 Kubernetes 業務集群」 中。
- 業務集群名。
- 業務集群部署模式: 分為標準生產和最小化。標準生產提供Master組件都是3副本的部署,最小化則都是1個副本的部署。
- 業務集群 Master 節點 NodeSelector,即表示如何在元集群內如何選擇業務集群Master 節點。
- 業務集群各 Master 組件版本,自定義參數等
- 業務集群所使用的 etcd 啟動配置,主要涉及 etcd data volume 的設置。有ClaimTemplate 和 VolumeSource 兩種模式,即使用 ClaimTemplate 模式就使用PVC 來初始化 etcd volume,而使用 VolumeSource 模式,即使用 VolumeSource 所表示的 volume 來掛載 etcd volume。
- 業務集群 Master 組件證書過期時間: Master 組件所使用 kubeconfig 中的證書都有過期時間,以保證安全性。而 Kube-on-Kube-Operator 會在證書過期時自動完成滾動證書、Master 組件重新載入證書等操作。
- 業務集群額外用戶 kubeconfig:即為 「額外用戶」提供的用戶名和組名,簽出證書,並生成 kubeconfig 保存在元集群 Secret 中供讀取。
- 業務集群狀態: 這部分信息不需要用戶提交,而是由 Kube-on-Kube-Operator 自動生成,用戶反饋這個業務集群的狀態,參考 Pod.Status 。
一個業務集群的 Master組件 部署 實際是元集群中的一系列 Resource 組成,即包括Deployment,Secret,Pod,PVC 等組合使用。各 Master 組件 所需要的部署 Resource 如下:
- Apiserver: 一個 Deployment 即可,因為 Apiserver 是無狀態應用,副本數和Cluster CRD 描述的一致即可。除此之外,需要為Apiserver創建兩個 Service:
- 向同個業務集群的其它 Master 組件提供服務的 Service: 建議使用元集群內的 Headless Service。
- 向 Kubelet、外部組件提供服務的 Service: 建議使用機房 DNS RR Service (需要自己實現 Service Controller )。
- etcd: 每個 etcd 實例(標準化部署是 3 個實例,最小化是 1 個實例)都建議單獨使用 Pod + PV + PVC + Headless Service 部署。每個etcd 實例的 peer id 為對應的Headless Service 域名。當某個 etcd 實例發生故障時,需要手動刪除掉故障對應實例的 Pod,Kube-on-Kube-Operator watch 到 etcd Pod 的減少,會重新建立 Pod,並執行 Remove old member (被刪除的 Pod ), Add new member(新建的Pod)操作,但是他們的peer id還是保持一致的。
- Controller-Manager: 一個 Deployment 即可,因為 Controller-Manager 是無狀態應用。副本數和 Cluster CRD 描述的一致即可。
- Scheduler: 一個 Deployment 即可,因為 Scheduler 是無狀態應用。副本數和Cluster CRD 描述的一致即可。
Kube-on-Kube-Operator 除了能夠部署上述的 Master 組件之外,還能維護任何擴展組件,如 kube-proxy,kube-dns 等。只需要用戶提供 擴展組件部署模板 和 擴展插件版本,Kube-on-Kube-Operator 能渲染出部署 Resource,並保持這些部署 Resource 到最終態。由於篇幅原因,我們這裡不再贅述。
Node-OperatorNode-Operator 用於 Watch Machine CRD Resource 的變更,將"Machine"所描述表示的 Worker 節點上的 on-host 軟體(docker, kubelet, cni)達到最終態,最終能讓 "Machine"所對應的"Node" 在 Kubernetes 集群中達到"Ready"狀態。架構圖如下:- 機器元數據: IP, Hostname, IDC 等
- 機器運維 ssh 登錄方式和登錄秘鑰: 如最常見的 SSH Key;如果 Machine 是阿里雲的 ECS, 那麼登錄方式和登錄秘鑰是阿里雲提供的 SSH 介面和對應的鑒權信息等。
- 各個on-host 軟體版本和自定義參數
- Machine 狀態: 這部分信息不需要用戶提交,而是由 Node-Operator 生成,表示這個機器的當前狀態,參考 Pod.Status 。
Node-Operator 還用 Watch Machine 對應 Node 的狀態,當發生一些能處理的 Condition(比如 kubelet 運行中進程消失了)時,Node-Operator 會做出恢復處理。
Node-Operator 還會 Watch ClusterPackageVersion CRD 的變更,這個 CRD 表示整個Kubernetes 集群 kubelet、docker 等組件的默認版本,Node-Operator 會根據 ClusterPackageVersion 描述的信息,控制各個節點的 kubelet、docker 等組件的版本。Node-Operator 還支持控制某些組件灰度發布到某些節點中。用戶只要提交描述這個灰度發布的 CRD 到 Apiserver,Node-Operator 會有序的執行灰度發布,並將發布狀態反饋到 CRD 中。由於篇幅原因,我們不再贅述。 結束語螞蟻金服在運維大規模 Kubernetes 集群實踐中,我們擯棄了傳統的模式,使用了Operator 模式和面向 Apiserver 編程。
Kubernetes 集群的上下線、升級實現了 "Kubernetes as a Service" ,就像向雲廠商買一個服務一樣簡單。而 Worker 節點的運維,使用 Operator 模式能夠讓我們統一管理元數據,自動化初始化、恢復 Worker 節點所需的組件。http://weixin.qq.com/r/YymEnETE8xmMrQD-93xx (二維碼自動識別)
歡迎關注微信公眾號:Antfin_SOFA歡迎大家共同打造 SOFAStack https://github.com/alipay推薦閱讀:
※安裝並使用docker@Windows——第一章(安裝docker)
※北航軟體學院推移動雲計算創新型教育方式
※雲計算--簡簡單單介紹,輕輕鬆鬆理解
※雲計算是個什麼玩意(下)
※七劍合璧——聚通達攜七大產品亮相中國雲計算技術應用大會
TAG:雲計算 |