前言
本來(lái)計(jì)劃這篇寫(xiě)一寫(xiě)k8s設(shè)計(jì)特點(diǎn),但是最近在做技術(shù)路線規(guī)劃方面的事情尊浓,筆者在曠視科技做一款名為devops的私有云產(chǎn)品(此devops非彼devops)后文稱之為MDO(megvii devops私有云)戳寸,自研了一套類似k8s的編排調(diào)度工具。k8s只是私有云中的一個(gè)子集,私有云不僅關(guān)注編排部署渠驼,還關(guān)注自身部署升級(jí)、易用性运吓、穩(wěn)定性渴邦、異構(gòu)、安全性拘哨、監(jiān)控告警谋梭、災(zāi)備、基礎(chǔ)設(shè)施倦青、文檔在地化等瓮床。
從這個(gè)角度上看,對(duì)比MDO和k8s并不公平,因?yàn)閗8s只是私有云中管理編排調(diào)度隘庄、網(wǎng)絡(luò)存儲(chǔ)等方面的一個(gè)核心組件踢步。雖然對(duì)比并不全面,但是很有意義和價(jià)值丑掺,可以從架構(gòu)組件获印,對(duì)于云管理的概念抽象兩個(gè)角度縱向?qū)Ρ人伎迹由顚?duì)云管理的認(rèn)知街州。
組件架構(gòu)
MDO
mdo架構(gòu)如下兼丰, 通過(guò)manager + agent兩個(gè)概念管理集群,manager 和 agent上運(yùn)行的都是無(wú)狀態(tài)的服務(wù)唆缴,集群狀態(tài)持久化到etcd中鳍征。
- manager
主要包括mdo-manager服務(wù)、etcd集群面徽、Prometheus艳丛、Altermanager、Grafana監(jiān)控告警系統(tǒng)趟紊、Ntp server時(shí)間同步組件氮双、Nginx、keepalived织阳、CoreDns高可用負(fù)載均衡網(wǎng)絡(luò)組件眶蕉。 -
agent
主要包括mdo-monitor自定義監(jiān)控組件、mdo-ctl唧躲、Ntp Client造挽、Node Exporter等。
K8S
k8s架構(gòu)如下也是manager + agent兩個(gè)概念管理集群(我個(gè)人理解master + slave和manager+agent是一個(gè)意思弄痹,只不過(guò)狗屁的政治正確導(dǎo)致還是叫manager, agent文明一些)饭入。集群的狀態(tài)持久化到etcd中,這樣天然好做高可用肛真。
- manager
manager上有controller manager谐丢、scheduler、API server + etcd蚓让。其中API Server是etcd的入口乾忱,提供持久化的抽象。 -
agent(即Node)
包含CNI網(wǎng)絡(luò)組件历极、Kubelet窄瘟、CRI組件、持久化組件趟卸。
從架構(gòu)上來(lái)看MDO和k8s基本一致蹄葱,如果k8s加監(jiān)控告警也基本上使用prometheus+altermanager+exporter三件套氏义,時(shí)鐘同步也會(huì)用ntp server+client兩件套。但是图云,k8s的容器運(yùn)行時(shí)和網(wǎng)絡(luò)都采用組件化的方式惯悠。
抽象概念
K8S
- Deployment
編排部署, 復(fù)雜應(yīng)用一般還需要Deployment上 再有一層依賴竣况。 - Ingress
對(duì)外暴露service克婶,Ingress在k8s中是一層概念抽象,有多種實(shí)現(xiàn)丹泉,常見(jiàn)的有Nginx ingress, haproxy ingress鸠补。 - Service
對(duì)外暴露pod,由于Pod自身啟動(dòng)的ip不是固定的嘀掸,k8s設(shè)計(jì)service這個(gè)概念,通過(guò)dns的方式對(duì)外代理服務(wù)规惰,service是k8s proxy 完成(待續(xù)) - Pod
邏輯概念睬塌,k8s并不真實(shí)存在pod。 Pod的目的是為了解決容器進(jìn)程的問(wèn)題歇万,容器的本質(zhì)是進(jìn)程揩晴,但是編排部署的時(shí)候,需要做進(jìn)程組級(jí)別的管理贪磺,pod大致對(duì)標(biāo)虛擬機(jī)硫兰,承擔(dān)調(diào)度,網(wǎng)絡(luò)寒锚,存儲(chǔ)劫映,安全方面的功能,在pod里提供sidecar功能刹前。 - Container
服務(wù)容器化泳赋,k8s容器化的起點(diǎn),以container的形式運(yùn)行在k8s集群中 - CronJob
定期任務(wù) - Job
任務(wù)喇喉, 通常我們關(guān)注的重點(diǎn)是job的并發(fā)機(jī)制祖今,exit code != 0后,retry機(jī)制等拣技。 - StatefulSet
有狀態(tài)服務(wù)千诬,主要包括兩點(diǎn),持久化存儲(chǔ)的有狀態(tài)膏斤,服務(wù)啟動(dòng)的有狀態(tài)即服務(wù)之間的依賴關(guān)系徐绑,k8s通過(guò)給stateful set的pod編號(hào),這樣服務(wù)之間的依賴關(guān)系可以根據(jù)編號(hào)的順序啟動(dòng)掸绞,MDO中使用rank來(lái)實(shí)現(xiàn)服務(wù)之間的依賴泵三。持久化存儲(chǔ)是依賴pv/pvc的編號(hào)實(shí)現(xiàn)的耕捞。 - DaemonSet
守護(hù)進(jìn)程通常出現(xiàn)早于集群的出現(xiàn),通常管理網(wǎng)絡(luò)烫幕、安全俺抽、存儲(chǔ)、日志等事宜较曼。守護(hù)進(jìn)程exp網(wǎng)絡(luò)插件通常先運(yùn)行在pod上磷斧,pod才能變成schedule,也就是說(shuō)網(wǎng)絡(luò)守護(hù)運(yùn)行前捷犹,pod還沒(méi)有進(jìn)入schedule, 普通的進(jìn)程是不能運(yùn)行在unschedule的pod上的弛饭,這里就出現(xiàn)了悖論,不運(yùn)行網(wǎng)絡(luò)進(jìn)程萍歉,pod并不會(huì)變成schedule侣颂,但是正常邏輯網(wǎng)絡(luò)進(jìn)程無(wú)法運(yùn)行在unschedule的Pod上。
k8s并沒(méi)有做黑魔法操作枪孩,而是引入了tolerations概念憔晒,即污點(diǎn)容忍,用來(lái)描述進(jìn)程可以運(yùn)行在某種污染比如unschedule的節(jié)點(diǎn)上蔑舞。daemonset運(yùn)行時(shí)自動(dòng)加上tolerations字段拒担,這樣就可以運(yùn)行在unschedule的pod上。 - Horizontal PodAutoscaler
水平擴(kuò)展 - ConfigMap
Config配置 - Secret
數(shù)據(jù)安全相關(guān)
MDO 功能與抽象概念
Node
機(jī)器節(jié)點(diǎn)攻询,運(yùn)行的實(shí)體機(jī)器資源抽象从撼,包括GPU、Memory钧栖、CPU低零、NVME等計(jì)算內(nèi)存存儲(chǔ)資源Deploy
container組級(jí)別的服務(wù)部署:可以多個(gè)container部署在同一個(gè)Deploy中生命周期
instance啟動(dòng)時(shí),可以自定義Pre操作桐经,結(jié)束時(shí)可以運(yùn)行Post操作毁兆,pre和post是按照順序執(zhí)行的,instance運(yùn)行狀態(tài)為運(yùn)行中和服務(wù)健康檢查阴挣,對(duì)標(biāo)k8s的liveness和readiness气堕。容器治理
mdo的服務(wù)治理策略和k8s完全不同,k8s主要用于公司內(nèi)部有運(yùn)維的治理畔咧,可以理解為是標(biāo)準(zhǔn)機(jī)房或者機(jī)房的基礎(chǔ)設(shè)施較好茎芭。所以k8s對(duì)于pod等管理方法為當(dāng)list到某個(gè)pod不存在(exp:防火墻斷網(wǎng)等情況)會(huì)重新生成新的Pod調(diào)度資源。
mdo使用的場(chǎng)景為私有化機(jī)房誓沸,非標(biāo)準(zhǔn)梅桩、無(wú)運(yùn)維、網(wǎng)絡(luò)設(shè)施較差的場(chǎng)景拜隧,調(diào)度部署是manager來(lái)處理宿百,但是調(diào)度部署后趁仙,對(duì)容器的運(yùn)維拉起等在每個(gè)Node節(jié)點(diǎn),依靠supervisor來(lái)管理垦页。假設(shè)集群節(jié)點(diǎn)間斷網(wǎng)雀费,那么斷網(wǎng)的Node上容器是正常運(yùn)行的,還可以被supervisor治理痊焊。manager不會(huì)重新生成pod盏袄。Service
Deploy組級(jí)別的服務(wù)部署,提供deploy之間公用的變量薄啥、配置辕羽、部署依賴等。提供patch垄惧、diff刁愿、回滾等功能-
Job
- Runonce
只運(yùn)行一次的job,job的運(yùn)行狀態(tài)會(huì)被記錄到etcd中到逊,如果失敗不會(huì)自動(dòng)retry酌毡,運(yùn)行失敗需要手動(dòng)retry。 - Normal
可以retry蕾管,運(yùn)行時(shí)exit code為0時(shí)標(biāo)識(shí)Done否則會(huì)retry,和runonce區(qū)別在于normal job是冪等或者是可以重復(fù)執(zhí)行的菩暗。
- Runonce
通常用來(lái)處理數(shù)據(jù)庫(kù)初始化等掰曾。
- 網(wǎng)絡(luò)
- instance獨(dú)立IP
使用Flannel vxlan + etcd + coredns實(shí)現(xiàn)每個(gè)docker 容器有自己的ip。flannel vxlan模式通過(guò)分配子網(wǎng)的方式停团,提供三層上的兩層網(wǎng)絡(luò)旷坦,實(shí)現(xiàn)ip獨(dú)立。 - 高可用
使用KeepAlived + VIP + nginx提供高可用入口佑稠,其他高可以服務(wù)秒梅。etcd自身高可用,備份舌胶,恢復(fù) - 單向網(wǎng)絡(luò)
通過(guò)隧道的方式實(shí)現(xiàn)manager到agent的單向網(wǎng)絡(luò)捆蜀。
- instance獨(dú)立IP
- Debug
調(diào)試不是一個(gè)概念,而是MDO對(duì)用戶提供的調(diào)試工具幔嫂,mdo通過(guò)提供webterminal功能辆它,是的用戶可以通過(guò)界面登錄到節(jié)點(diǎn)或者container中調(diào)試分析,同時(shí)webterminal還具有操作審計(jì)履恩,回放歷史等功能锰茉。 - 文檔在地化
對(duì)于一個(gè)項(xiàng)目文檔的重要性不言而喻,尤其對(duì)于像MDO這種toB的私有云切心,不同的版本飒筑,文檔會(huì)有變動(dòng)片吊,靠?jī)?nèi)部wiki等記錄文檔是不好的。exp:某個(gè)現(xiàn)場(chǎng)部署的一年前的版本协屡,某個(gè)現(xiàn)場(chǎng)部署的是兩年前的版本俏脊,遇到這樣的現(xiàn)場(chǎng)oncall問(wèn)題,搜索內(nèi)部wiki等方式是無(wú)法很好應(yīng)對(duì)的著瓶。
MDO是把文檔集成到repo中联予,直接在自身web服務(wù)的界面中顯示。優(yōu)點(diǎn)如下:
- 私有化現(xiàn)場(chǎng)出現(xiàn)問(wèn)題可以在現(xiàn)場(chǎng)查閱文檔材原,本地文檔直接對(duì)應(yīng)本地feature沸久。
-
當(dāng)一個(gè)同學(xué)開(kāi)發(fā)新的feature或者有修改時(shí),在commit同時(shí)必須包好文檔的變動(dòng)余蟹,可以review代碼的時(shí)候也review到文檔卷胯,甚至對(duì)于新入職的同學(xué)或者是不熟悉相關(guān)模塊的同學(xué)根據(jù)文檔的變化反過(guò)來(lái)review code的合理性。