天天看點

如何為Keepalived服務建立基于Rancher的Catalog

Keepalived的作用是檢測伺服器的狀态,如果有一台web伺服器當機,或工作出現故障,Keepalived 将檢測到,并将有故障的伺服器從系統中剔除,當伺服器工作正常後Keepalived自動将伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工幹涉,需要人工做的隻是修複故障的伺服器。

首先我們簡要說明一下Keepalived 的相關啟動腳本及配置檔案:keepalived.sh是核心的腳本用來啟動服務,keepalived.conf檔案則是該服務的配置檔案。對于 Keepalived,我們需要關心的幾個重要參數如下:

虛拟IP位址及其掩碼

VRRP所偵聽檢測的端口(也就是HA針對具體哪一個端口做健康檢查)

VRRP基于哪個網卡接口釋出。

我相信Rancher的官方手冊已經對Catalog的制作流程做了詳盡的說明,但是仍然有一些朋友看了Rancher手冊上Catalog那一節,暈暈乎乎,不懂如何制作應用的 Catalog。

(官方手冊連結在此):http://docs.rancher.com/rancher/latest/en/catalog/private-catalog/ 

結合Keepalived,我們來看具體的Catalog是如何建立的吧。

首先,你需要在github或者你自己的gitlab上建立一個項目,這個項目隻要能被git clone指令正常處理就 OK。 例如我們在github網站上建立的項目結構如下圖所示: 

<a href="https://s5.51cto.com/wyfs02/M02/8C/E8/wKiom1h9eR3T0MxCAAHTbrP3j9M478.jpg" target="_blank"></a>

templates目錄裡對應的是我們Rancher裡Cattle環境的Catalog。kubernetes-templates和swarm-templates以及mesos-templates則對應不同環境的模闆。進入這個templates,我們可以看見在Rancher Catalog頁面對應的那些軟體模闆名。 

我們進入Keepalived檔案夾看個究竟,就會很容易的了解官方文檔對Catalog編制的流程指引。 

這個catalogIcon-keepalived.png圖正是我們看見的它:

<a href="https://s5.51cto.com/wyfs02/M01/8C/E8/wKiom1h9eVjhOmWdAAA9kI5I-sY910.jpg" target="_blank"></a>

config.yml檔案則是該catalog的基礎描述;0目錄是指第一個版本,那麼下一次你發新版的Catalog,則需另建立一個1目錄。 

<a href="https://s2.51cto.com/wyfs02/M00/8C/E8/wKiom1h9eWeTAr5eAAAZWL2UFGs957.jpg" target="_blank"></a>

每個版本檔案夾例如0裡面均包含了三個檔案。

<a href="https://s5.51cto.com/wyfs02/M00/8C/E5/wKioL1h9eXWztu3oAAENrIVuVSg387.jpg" target="_blank"></a>

這正是我們建立一個Stack所需要的docker-compose.yml以及rancher-compose.yml,當然還有一個README.md 檔案,用以對Stack進行較長的描述。

<a href="https://s1.51cto.com/wyfs02/M01/8C/E8/wKiom1h9eYewb7g6AACSnus3Zj4731.jpg" target="_blank"></a>

對于這個Keepalived,其 docker-compose.yml特别的簡單:

<a href="https://s2.51cto.com/wyfs02/M01/8C/E5/wKioL1h9eZmw5B_sAAAuJhR2tyc715.png" target="_blank"></a>

不過這裡的image你可需要花點功夫了,你需要處理正确的環境變量、參數的傳遞。否則我們在Rancher Catalog裡看到的這些參數傳遞一旦出現問題,那麼服務肯定跑不起來了,用于制作image的Dockerfile内容如下 :

<a href="https://s1.51cto.com/wyfs02/M02/8C/E8/wKiom1h9eauTLx4-AAAsWRHUyTA479.png" target="_blank"></a>

這些自定義配置選項是如何實作的呢?

<a href="https://s4.51cto.com/wyfs02/M01/8C/E5/wKioL1h9ebmiym9NAACKTGGgeVU914.jpg" target="_blank"></a>

官方文檔告訴我們,是在 rancher-compose檔案裡來定義。還是以我們的Keepalived服務為例子:

<a href="https://s2.51cto.com/wyfs02/M02/8C/E5/wKioL1h9ednR08vkAABOk3PpzDQ663.png" target="_blank"></a>

在rancher-compse.yml檔案的question小節裡定義了很多UI對象的屬性(例如:變量名、資料類型、是否必選項、标簽、描述、預設值等等),而在answers.txt檔案中則相應的給出了這些項目的預設值狀态。

以實際的Keepalived服務而言,我們可以看見docker-compose.yml檔案裡定義了四個環境變量 (VIRTUAL_IP、 CHECK_PORT、 INTERFACE、 NETMASK_BIT)以及一個常量VRID:

<a href="https://s5.51cto.com/wyfs02/M02/8C/E8/wKiom1h9efGQrdS5AAASuIeSf6I151.png" target="_blank"></a>

以上四個環境變量是可以被容器的shell所直接調用的,例如keepalived.sh腳本中就調用了這四個變量,而這四個變量的具體指派正是在Catalog制作階段完成的,其值由rancher-compose.yml檔案裡的變量進行輸出,也就是:

<a href="https://s2.51cto.com/wyfs02/M00/8C/E5/wKioL1h9ef_TreNZAAAcNRXUG6o763.png" target="_blank"></a>

特别需要注意的是 keepalived.sh 腳本在運作期是需要讀取配置檔案 keepalived.conf 檔案裡的參數的,特别是上述這四個參數,那麼由于 keepalived.conf 檔案必須在 images 生成之前在 Dockerfile 裡寫好,是以在 Dockerfile 裡,它們一定是變量,而在容器運作起來之後,keepalive.sh 運作之前需要把變量指派,這些值正是使用者填寫的。我們看一下 keepalived.sh 是如何實作的呢?

通過關鍵的四句 sed 指令配合正規表達式: 

<a href="https://s5.51cto.com/wyfs02/M02/8C/E5/wKioL1h9ehHQoEDOAAD0aTAPuHE685.jpg" target="_blank"></a>

keepalived.sh腳本成功的将容器運作期的 keepalived.conf配置檔案中的變量參數替換為了常量(這個常量由容器的環境變量傳遞進 Linux Shell 環境)。

這樣一個完整的Catalog建立流程包括如何處理環境變量與自定義參數的傳遞機制就解釋清晰了,按照這種思路,我們可以很友善地建立各種不同的應用模闆,以實作 Rancher 的一鍵部署功能。 

本文轉自 RancherLabs 51CTO部落格,原文連結:http://blog.51cto.com/12462495/1892490

繼續閱讀