天天看點

使用Kubernets Pet Set部署上千個Cassandra執行個體

衆所周知,Kubernetes來源于古希臘神話中的κυβερνήτης,詞義為:舵手(helmsman、steersman)、飛行員(pilot)或者船長(ship master)。為了追蹤比賽結果,我們需要一個資料倉儲,我們選擇使用Cassandra。在古希臘神話中,Cassandra(Κασσάνδρα)是特洛伊國王普裡阿摩斯(Priam)和王後赫卡帕(Hecuba)的女兒。既然Kubernetes和Cassandra都與古希臘文化有關,我們就打算進行一次古希臘巨獸之間的賽跑比賽。

上面的故事有點帶偏了Cassandra,其實在本文中Cassandra是部署在Pet中的應用程式,接下來我們将介紹Pet Set。

Pet Set是Kubernetes 1.3版本中令人興奮的新功能之一。在Kubernetes中為了對容器部署進行組織管理,可以使用不同的部署機制,例如Resource Controllers以及Daemon Set。Pet Sets是一種新功能,在Kubernetes中,其将容器部署劃分成多個Pet,并保證每個Pet都有确定性的唯一身份,身份内容包括DNS域名、一緻性存儲以及順序化pod索引。在此之前,使用Deployments和Replication Controllers進行部署,隻會給應用程式配置設定一個非耦合的弱身份。弱身份比較适合微服務等應用程式,這類應用程式不關心pod的名稱,其重點在于服務發現,并且這些應用程式是無狀态的。然而有很多軟體應用程式是需要強身份,例如多種不同類型的分布式有狀态系統。Cassandra就是一個比較好的例子,它需要一緻的網絡辨別以及固定的存儲。

Pet Sets提供了如下功能:

在DNS中具有固定的hostname,同一個Pet Set中的Pet hostname以Pet Set名稱為基礎,加上從0開始的順序化數字,例如cassandra-0。

順序化索引,例如0、1、2、3。

連結到Pet序列以及hostname的固定存儲。

通過DNS發現同伴,在Pet建立之前,同伴的名稱是已知的。

順序啟動與銷毀Pet,通過Pet編号,下一個需要被建立的Pet是已知的,并且當Pet Set規模減小時,哪些Pet需要被銷毀也是已知的。當縮減叢集規模時,對于從一個Pet中抽取資料這類管理任務來說,該功能是非常有用的。

如果你的應用程式具有如上需求,可以考慮使用Pet Set進行部署。我們來舉個形象的例子,假設你有一個寵物集合(Pet Set)由寵物狗(Pet dog)組成。你有白色、棕色或者黑色的寵物狗,然後棕色的寵物狗突然逃跑了,當你用另外一直棕色寵物狗來替換原來的那隻,沒有人會發現;如果你用白色的寵物狗進行替換,就會有人察覺到。Pet Set可以讓你Pet中運作的應用程式持有一個唯一的身份。

使用Pet Set的應用程式示例:

叢集化軟體,例如Cassandra、Zookeeper、etcd或者需要固有關系的彈性化軟體。

資料庫軟體,例如MySQL或者PostgreSQL,這種需要單一執行個體在任何時候都挂上一個持久化volume。

隻有當你的應用程式需要如上所述的一些屬性時才建議使用Pet Set,因為管理無狀态的pod要更加容易。

讓我們回歸比賽!

你會看到這些容器是比較大的,一般生産環境中Cassandra隻用8個CPU以及16GB記憶體。你需要注意兩個關鍵的新功能,即動态volume供應(dynamic volume provisioning)以及Pet Set。通過上述的YAML檔案将會建立5個Cassandra Pet,并且從第0個開始啟動,即cassandra-data-0、cassandra-data-1等等。

為了給這場比賽産生資料,我們使用了Kubernetes的另一個功能,即Jobs。使用簡單的python代碼在比賽過程的每一秒為巨獸産生一個随機速度,然後将速度、位置資訊、獲勝者、其他資料點以及度量資料存放到Cassandra。為了資料可視化,我們使用JHipster來建構一個AngularJS UI界面,然後使用D3進行圖表化。

如下是Job的配置示例:

最終,所有的pet都部署好了。一千個執行個體被分成了兩個不同的Cassandra資料中心。Cassandra的分布式架構特别适合多資料中心的部署方式。通常為了分離工作負載,同一個實體或虛拟資料中心上會部署多個Cassandra資料中心。在多個資料中心之間資料是重複的,但是不同資料中心的工作負載可能是不一樣的,是以應用程式的性能也可能是不一樣的。兩個資料中心分别命名為'DC1-Analytics'和'DC1-Data',每個資料中心各自部署了500個pet。由批量python Jobs産生的資料存放到DC1-Data中,而JHipster UI則連接配接到DC1-Analytics。

最終的叢集規模如下:

8072核,master結點使用了24核,所有的minion結點使用了剩下的部分。

1009個IP位址。

Google Cloud Platform上通過Kubernetes配置了1009個路由。

100510GB持久化磁盤,供給Minion結點以及Master結點使用。

380020GB SSD磁盤,master使用了20GB,而每一個Cassandra Pet使用了340GB。

1000個Cassandra執行個體。

是的,我們确實部署了1000個pet,但我們不希望看到的事情也發生了。當Cassandra叢集啟動後,有333個結點或者服務沒起來,或者資料丢失了。

Pet Set是具有α屬性的資源,1.3版本以前的Kubernetes都不能使用。

Pet所使用的存儲必須是通過基于請求擷取存儲的動态存儲供應器提供(dynamic storage provisioner)或者是通過管理者事先提供。

删除Pet Set并不會删除任何的Pet或者Pet的存儲。你必須手動删除Pet及其存儲。

目前,所有的Pet Set都需要一個“管理服務(governing service)”,或者是一個可以管理Pet網絡辨別的服務。這個服務由使用者自己負責。

目前,更新已有的Pet Set需要手動操作。你可以重新建構一個使用新版鏡像的Pet Set,或者一個一個地替換已有Pet的鏡像,然後重新把它加入到叢集中。

首先,什麼是Pet?Pet是一個有狀态應用程式,本質上它是一個具有确定性名稱以及唯一身份的Pod,身份内容包括:

DNS中可以識别的固定hostname

順序化索引(Pet名稱組成:PetSetName-Ordinal)

連結到索引與hostname的固定存儲

顧名思義,Pet Set就是Pet集合,它具有特定數量的Pet,其目的就在于解耦叢集化有狀态應用程式,例如MySQL、PostgreSQL等資料庫應用程式,或者Zookeeper、Etcd以及Elasticsearch等叢集化應用程式。一般叢集化應用程式都是部署在固定的結點上,具有永久性存儲以及靜态的IP位址,并且在部署過程中需要在結點之間建立一定的關聯聯系。而Pet Set會給每個應用程式執行個體配置設定一個身份,這樣應用程式執行個體就不必固定在實體基礎服務上,執行個體之間依靠身份建立聯系。

<b>原文釋出時間為:</b>2016-07-27

<b>本文作者:</b>肖遠昊

<b>本文來自雲栖社群合作夥伴Dockerone.io,了解相關資訊可以關注Dockerone.io。</b>

<b></b>

<b>原文标題:</b><b>使用Kubernets Pet Set部署上千個Cassandra執行個體</b>