對于開發人員而言,他們的最終目標是擁有自己的數據中心(data center),使他們能夠在貼近真實情況的副本上測試他們的服務。然而,開發人員的開發過程中卻充滿了妥協。因為,數據要么是個簡化集,要么被匿名,這加大了開發人員的開發難度。并且公司也還沒有準備好為每一位開發人員搭建一個數據中心。
今天,我將提供一個過程摘要來闡明如何使用Rancher和本地計算機減少開發人員在開發時的妥協。我們的目標是為開發人員提供盡可能具有代表性的環境,以至于其可被用于真實的生產環境中,我們將使用Docker和Rancher來做到這一點。
如果您遇到過下列任何一項煩惱:
-
共享的開發環境因多個問題而崩潰
-
測試數據不一致
-
網絡問題拖延開發進度
我希望能夠提供給您一些解決這些問題的想法。
Rancher and Docker can Help
一個所有服務都在裸機上運行的數據中心,無法將其復制到筆記本上。選擇使用虛機方式遷移則有助于這個過程,部分原因在于虛擬化可以讓用戶運行多個(agent)服務。這樣一來,硬件環境隨即成為問題的關鍵所在。無論是磁盤的輸入輸出不足以支持服務還是沒有足夠的內存,都會使得搭建一個產品級的生產環境副本以失敗告終。然而Docker和Rancher卻可以幫您解決這些難題。Docker幫您快速啟動容器,Rancher幫您解決編排、網絡和負載均衡等一系列問題。
通過這種組合,在您的筆記本電腦上運行數據中心逐漸變為可能。這個想法在最近的六個月來變得非常受歡迎,因為許多大型機構已經開始為開發人員提供一個完整的docker management layer以讓數據中心能夠在本地運行。許多公司正在進行這項投資,因為他們能夠獲得各種各樣的好處,其中包括:
-
開發人員在看到問題時更熟悉如何使用工具解決
-
開發人員在交付代碼之前能夠找出問題
-
開發人員能夠獨立工作,甚至離線工作
-
新的開發者可以在幾分鐘內進行工作,而不需要花費幾天或是幾周來適應開發環境
-
DevOps工作的主機永遠不會宕機。
那么,我們該如何做呢?出于寫這個博客的目的,我會假設正在Mac或Windows上使用Docker Toolbox。下載安裝和說明文件可以在這里找到https://www.docker.com/products/docker-toolbox。
首先,讓我們來看看它長什么樣子:
我們將運行兩個虛擬機,一個虛擬機只運行Rancher Server,另一個虛擬機作為主機運行并運行應用程序堆棧。用這樣的配置有幾個原因。首先,它對于真正的情形比較有代表性。其次,一旦出現問題,您的應用程序無法使Rancher因資源不足而發生饑餓現象。
所以,首先第一件事,讓我們創建一個具有512 GB和8 GB磁盤的VirtualBox虛擬機。
1 | docker-machine?create?rancher?--driver?virtualbox?--virtualbox-cpu-count? "-1" ?--virtualbox-disk-size? "8000" ?--virtualbox-memory? "512" ?--virtualbox-boot2docker-url=https: //github.com/boot2docker/boot2docker/releases/download/v1.10.3/boot2docker.iso |
我們指定的URL指向的是Rancher能夠運行的Docker v1.10.3版本。
Docker Toolbox是在本地運行Docker的理想選擇,但運行它確實有一些挑戰性。原因之一是它使用了DHCP協議,如果你不想托管靜態服務的話,這將是一個不錯的選擇。但是,要繞開這個ssh協議連接到Rancher虛擬機的話,加上下面的這一行代碼到/var/lib/boot2docker/profile:
1 | sudo?cat?/var/run/udhcpc.eth1.pid?|?xargs?sudo?killsudo?ifconfig?eth1?<ip?address?to?assign>?netmask?<subnet?mask>?broadcast?<broadcast?address>?up |
此時,您將在docker-machine中出現一個關于IP地址不匹配的錯誤。您可以在主機操作系統上運行以下命令來解決這個問題:
1 | docker-machine?regenerate-certs?rancher?-f |
這將給我們的Rancher服務器分配一個靜態IP地址。然后,您可以運行:
1 | docker?run?-d?--restart=always?-p? 8080 : 8080 ?rancher/server |
幾分鐘后,將有一個Rancher服務器在您指定的IP地址的8080端口上運行。保持Rancher服務器的IP地址不變很重要,因為這是我們部署的任何主機代理都需要訪問的地方。
登錄到Rancher服務器之后,轉到“添加主機(add host)”并生成自定義代理命令。復制這個命令并保留它,因為我們將使用這個命令來添加主機。
現在讓我們創建第二個虛擬機。使用與上述相同的命令,您可以自行調整虛擬機的名稱、內存和磁盤空間,以滿足您的開發需求。
等待虛擬機再一次啟動后,您可以進入并為其分配一個靜態IP地址。
現在,我們遇到了boot2docker虛擬機的另一個限制:其數據持久性的限制。
如果我們向主機添加一個Rancher代理,它會創建一個/var/lib/rancher文件夾并在其中存儲一些信息。如果重新啟動虛擬機,這些信息將被銷毀。因此,當代理再次出現時,主機會認為它是一個新的服務器,之前的服務器信息在那時就全部丟失了。
幸運的是,面對這樣的窘境有一個解決方法。在運行Rancher代理腳本日志到主機上之前,運行以下命令:
1 | sudo?mkdir?/mnt/sda1/var/lib/rancher |
這將創建一個文件夾,這個文件夾在重新啟動時能被保留下來。現在,在每次啟動時,我需要將此文件夾映射到/var/lib/rancher。因此,我們需要再次編輯/var/lib/boot2docker/profile并添加以下內容:
1 | sudo?mkdir?/var/lib/ranchersudo?mount?-r?/mnt/sda1/var/lib/rancher?/var/lib/rancher |
這將確保我們的代理狀態在重新啟動之間能被保留。
通過ssh協議連接到機器,并運行您從Rancher服務器獲得的自定義代理字符串。
現在您已經有了一個Rancher服務器,它的主機完全在本地運行,它的應用程序棧準備完畢等待您的部署。
在此,是否將它提高到一個新的水平取決于您自己。但現在,您有了一個可運轉的Rancher / Docker環境。您能夠從外部存儲庫拉取數據,編寫腳本在本地構建應用程序或者運行目錄中的條目。
雖然這種開發方式并不完美,但對于大多數情況來說是“足夠好”的了,并且這樣的開發方式值得分析參考,并以此作為繼續改進開發的方法。