Operator 是由 CoreOS 開(kāi)發(fā)的,用來(lái)擴(kuò)展 Kubernetes API,特定的應(yīng)用程序控制器至会,它用來(lái)創(chuàng)建痘系、配置和管理復(fù)雜的有狀態(tài)應(yīng)用,如數(shù)據(jù)庫(kù)、緩存和監(jiān)控系統(tǒng)。Operator 基于 Kubernetes 的資源和控制器概念之上構(gòu)建,但同時(shí)又包含了應(yīng)用程序特定的領(lǐng)域知識(shí)晦毙。創(chuàng)建Operator 的關(guān)鍵是CRD(自定義資源)的設(shè)計(jì)。
應(yīng)用分為無(wú)狀態(tài)和有狀態(tài)耙蔑,對(duì)于無(wú)狀態(tài)的應(yīng)用见妒,擴(kuò)縮容非常簡(jiǎn)單,但是對(duì)于有狀態(tài)的應(yīng)用的運(yùn)維則比較麻煩甸陌,有狀態(tài)應(yīng)用一般都是有自己的領(lǐng)域知識(shí)须揣。
拿etcd舉例
etcd是k8s里面主要的存儲(chǔ)盐股,如果對(duì)它做一個(gè)scale up的話(huà),需要往集群中添加一些新節(jié)點(diǎn)的連接信息耻卡,從而獲取到集群的不同Member的配置連接疯汁。然后用它的集群信息去啟動(dòng)一個(gè)新的etcd節(jié)點(diǎn)。
如果有了etcd Operator卵酪,會(huì)怎么樣幌蚊?
etcd的部署,擴(kuò)縮容則變得非常簡(jiǎn)單
想要部署一個(gè)etcd的集群溃卡,其實(shí)很方便溢豆。因?yàn)椴恍枰偃ス芾磉@個(gè)集群的配置信息了,你只要告訴我瘸羡,你需要多少的節(jié)點(diǎn)漩仙,你需要什么版本的etcd,然后創(chuàng)建這樣一個(gè)自定義的資源犹赖,Operator會(huì)監(jiān)聽(tīng)你的需求队他,幫你創(chuàng)建出配置信息來(lái)。
要擴(kuò)容的話(huà)也很簡(jiǎn)單峻村,只要更新數(shù)量(比如從3改到5)麸折,再apply一下,它同樣會(huì)監(jiān)聽(tīng)這個(gè)自定義資源的變動(dòng)粘昨,去做對(duì)應(yīng)的更新磕谅。
這樣就相當(dāng)于把以前需要運(yùn)維人員去處理集群的一些工作全部都交付給Operator去完成了
Operator是怎么做到的呢?
本質(zhì)上走的就是K8S里面的Controller的模式雾棺。K8S Controller會(huì)對(duì)它的resource做這樣的一個(gè)管理:去監(jiān)聽(tīng)或者是說(shuō)檢查它預(yù)期的狀態(tài),然后跟當(dāng)前的狀態(tài)作對(duì)比衬浑。如果其中它會(huì)有一些差異的話(huà)捌浩,它會(huì)去做對(duì)應(yīng)的更新。
etcd的做法是在拉起一個(gè)etcd Operator的時(shí)候工秩,創(chuàng)建一個(gè)叫etcd cluster的自定義資源尸饺,監(jiān)聽(tīng)?wèi)?yīng)用的變化。比如你的聲明你的更新助币,它都會(huì)去產(chǎn)生對(duì)應(yīng)的一個(gè)事件浪听,去做對(duì)應(yīng)的更新,將你的etcd集群維護(hù)在這樣的狀態(tài)眉菱。