我們接下來說說Operator。為什么講Operator呢?Operator其實並不是一個工具,而是為了解決一個問題而存在的一個思路。什么問題?就是我們在管理應用時,會遇到無狀態和有狀態的應用。管理無狀態的應用是相對來說比較簡單的,但是有狀態的應用則比較復雜。在Helm chart的stable倉庫里面,很多數據庫的chart其實是單節點的,因為分布式的數據庫做起來會較為麻煩。
  
Operator的理念是希望注入領域知識,用軟件管理復雜的應用。例如對於有狀態應用來說,每一個東西都不一樣,都可能需要你有專業的知識去處理。對於不同的數據庫服務,擴容縮容以及備份等方式各有區別。能不能利用K8S便捷的特性去把這些復雜的東西簡單化呢?這就是Operator想做的事情。
  
以無狀態應用來說,把它做成一個Scale UP的話是比較簡單的:擴充一下它的數量就行了。
 
基於Helm和Operator的K8S應用管理的分享
基於Helm和Operator的K8S應用管理的分享

   

接着在deployment或者是說ReplicaSet的controller中,會去判斷它當前的狀態,並向目標狀態進行遷移。對有狀態的應用來說,我們常常需要考慮很多復雜的事情,包括升級、配置更新、備份、災難恢復、Scale調整數量等等,有時相當於將整個配置刷一遍,甚至可能要重啟一些服務。
   
比如像Zookeeper315以前不能實時更新集群狀態,想要擴容非常麻煩,可能需要把整個節點重啟一輪。有些數據庫可能方便一點,到master那里注冊一下就好。因此每個服務都會有它自己的特點。
  
拿etcd來說,它是K8S里面主要的存儲。如果對它做一個Scale up的話,需要往集群中添加一些新節點的連接信息,從而獲取到集群的不同Member的配置連接。然后用它的集群信息去啟動一個新的etcd節點。
  
如果有了etcd Operator,會怎么樣?Operator其實是CoreOS布道的東西。CoreOS給社區出了幾個開源的Operator,包括etcd,那么如何在這種情況下去擴容一個etcd集群?
  
首先可以以deployment的形式把etcd Operator部署到K8S中。部署完這個Operator之后,想要部署一個etcd的集群,其實很方便。因為不需要再去管理這個集群的配置信息了,你只要告訴我,你需要多少的節點,你需要什么版本的etcd,然后創建這樣一個自定義的資源,Operator會監聽你的需求,幫你創建出配置信息來。
  
$ kubectl create –f etcd-cluster.yaml
基於Helm和Operator的K8S應用管理的分享
 
 
要擴容的話也很簡單,只要更新數量(比如從3改到5),再apply一下,它同樣會監聽這個自定義資源的變動,去做對應的更新。
  
$ kubectl apply -f upgrade-example.yaml

基於Helm和Operator的K8S應用管理的分享

這樣就相當於把以前需要運維人員去處理集群的一些工作全部都交付給Operator去完成了。如何做到的呢?即應用了K8S的一個擴展性的API——CRD(在以前稱為第三方資源)。
  
在部署了一個etcd Operator之后,通過kubernetes API去管理和維護目標的應用狀態。本質上走的就是K8S里面的Controller的模式。K8S Controller會對它的resource做這樣的一個管理:去監聽或者是說檢查它預期的狀態,然后跟當前的狀態作對比。如果其中它會有一些差異的話,它會去做對應的更新。
  
Kubernetes Controller 模式:

基於Helm和Operator的K8S應用管理的分享

  
etcd的做法是在拉起一個etcd Operator的時候,創建一個叫etcd cluster的自定義資源,監聽應用的變化。比如你的聲明你的更新,它都會去產生對應的一個事件,去做對應的更新,將你的etcd集群維護在這樣的狀態。
  
除了etcd以外,社區比如還有普羅米修斯Operator都可以以這種方便的形式,去幫你管理一些有狀態的應用。
  
值得一提的是,Rancher2.0廣泛采用了Kubernetes-native的Controller模式,去管理應用負載乃至K8S集群,調侃地說,是個Kubernetes operator。
 

五、Helm和Operator的對比

這兩個東西講完了,我們來對比一下二者吧。
   
Operator本質上是針對特定的場景去做有狀態服務,或者說針對擁有復雜應用的應用場景去簡化其運維管理的工具。Helm的話,它其實是一個比較普適的工具,想法也很簡單,就是把你的K8S資源模板化,方便共享,然后在不同的配置中重用。
  
其實Operator做的東西Helm大部分也可以做。用Operator去監控更新etcd的集群狀態,也可以用定制的Chart做同樣的事情。只不過你可能需要一些更復雜的處理而已,例如在etcd沒有建立起來時候,你可能需要一些init Container去做配置的更新,去檢查狀態,然后把這個節點用對應的信息給拉起來。刪除的時候,則加一些PostHook去做一些處理。所以說Helm是一個更加普適的工具。兩者甚至可以結合使用,比如stable倉庫里就有etcd-operator chart。
  
就個人理解來說,在K8S這個龐然大物之上,他們兩者都誕生於簡單但自然的想法,helm是為了配置分離,operator則是針對復雜應用的自動化管理。