本節書摘來自華章出版社《開源容器雲openshift:建構基于kubernetes的企業應用雲平台》一書中的第2章,第2.3節,作者 陳耿 ,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視
在部署更複雜的應用之前,有一項重要的任務需要完成,那就是完善openshift叢集。在上一章中,通過二進制的安裝包,我們快速完成了openshift叢集的安裝,但是這個叢集還隻是一個“空”的叢集。面對複雜的應用,openshift需要更多元件的支援。而這些元件并沒有在上一章的安裝中完成。同時,openshift作為一個容器雲平台,預設提供了一系列使用者開箱即用、一鍵部署的應用和服務,這些應用和服務的資訊也需要在系統中注冊,以便使用者在類似軟體市場(app store)的服務目錄中選用。現在讓我們一起完善這個openshift執行個體。
在上一章中,我們使用openshf?it的web控制台部署了第一個容器應用。openshift的web控制台的使用者體驗非常好,通過圖形界面,使用者可以高效快速地完成操作。除了web控制台外,openshift還提供了一系列指令行工具。
oc是openshift中一個重要的指令行用戶端。openshift web控制台能完成的事情,通過oc指令也能完成。在進行自動化及重複性的操作時,指令行工具比圖形界面更加高效。為了友善讀者進行實驗操作,本書後續的示例将以指令行進行操作。
可以嘗試執行oc version指令檢視openshift的叢集版本資訊,測試oc指令是否正常工作。
可以看到指令輸出了openshift及其使用的kubernetes的版本資訊。
因為oc指令是帶有權限管控的,是以在使用oc指令進行實際的操作前,需要先通過oc login指令登入。如下例所示,通過oc login指令,以dev使用者的身份登入。
通過oc new-project指令建立一個新項目hello-world-oc。
前文我們通過web控制台部署了hello-openshift鏡像。在指令行可以通過oc new-app指令友善地部署dockerhub等docker鏡像倉庫的鏡像。
執行oc get pod指令可以檢視目前項目的容器的清單。和在kubernetes一樣,在open-
shift中,所有的docker容器都是被“包裹”在一種稱為pod的容器内部。使用者可以近似地認為pod就是我們要運作的docker容器本身。
openshift-1-8gv1i的詳細資訊,包含容器的名稱、狀态、所處的命名空間(項目)、标簽、ip位址等。
在後續的介紹中,我們會使用oc指令進行大量的操作,相信你很快就會熟悉它的使用方法。
在安裝元件之前,我們需要以叢集管理者的角色登入。在openshift中,預設的叢集管理者是system:admin。system:admin這個使用者擁有最高的權限。有意思的是,和其他使用者不同,system:admin使用者并沒有密碼!system:admin的登入依賴于證書密鑰。以下是登入的方法。
1)拷貝登入配置檔案。如果提示檔案已存在,請選擇覆寫。
2)通過oc login指令登入。
3)執行ocwhoami指令,即可見目前登入使用者為system:admin。
可以嘗試執行oc get node指令檢視叢集節點資訊。隻有叢集管理者才有權限檢視叢集的節點資訊。
可以看到我們的機器中有且隻有一個節點master.example.com,它的狀态是就緒(ready)的。在實際的生産環境中,叢集中将會有許多節點,這會是一個龐大的清單。
首先,為叢集添加一個router元件。router是openshift叢集中一個重要的元件,它是外界通路叢集内容器應用的入口。叢集外部的請求都會到達router,并由router分發到具體的容器中。關于router的詳細資訊我們會在後續的章節詳細探讨。
切換到default項目。
router元件需要讀取叢集的資訊,是以它關聯一個系統賬号service account,并為這個賬号賦權。service account是openshift中專門供程式群組件使用的賬号。openshift中有嚴格的權限和安全保障機制。不同的使用者會關聯到不同的安全上下文(security context constraint,scc)。同時,使用者或組也會關聯到不同的系統角色(role)。
執行oadm router指令建立router執行個體。
oadm指令是oc指令的好搭檔。oc指令更多地是面向一般使用者,而oadm指令是面向叢集管理者,可以進行叢集的管理和配置。在上面的指令中,我們指定建立一個名為router的router。
參數--replicas=1表明,我們隻想建立一個執行個體。在實際的生産中,為了達到高可用的效果,可以建立多個router執行個體實作負載均衡并防止單點失效。
執行片刻之後,通過oc get pod -n default指令可以檢視router容器的狀态。
上面的輸出顯示router容器的狀态是running。如果此時檢查實驗主機上的端口監聽狀态,可以發現主機的端口80、443正在被haproxy監聽。
其實,從技術上來說,router就是一個運作在容器中的haproxy,當然這個haproxy經過了特别的配置來實作特殊的功能。這些我們在後面再詳細讨論。
至此,router元件部署就已經完成了。
接下來部署叢集内部的docker registry,即内部的docker鏡像倉庫。從功能上說,open-
shift内部的鏡像倉庫和外部的企業鏡像倉庫或者dockerhub沒有本質的差別。隻是這個内部的鏡像倉庫會用來存放一些“特殊的”鏡像,這些鏡像是由一個叫source to image(s2i)的流程産生的。簡單地說,s2i的工作是輔助将應用的源代碼轉換成可以部署的docker鏡像。關于s2i,後續再詳細介紹。
1)切換到default項目。
2)執行如下指令部署registry。
3)稍候片刻,執行oc get pod便可見registry容器處于運作狀态了。
4)重新開機docker服務,使修改的配置生效。
至此,registry元件部署完成。
image stream是一組鏡像的集合。可以在一個image stream中定義一些名稱及标簽(tag),并定義這些名字及标簽指向的具體鏡像。值得指出的是,在openshift上部署容器應用,并不一定要用到image stream,直接指定鏡像的位址也可以完成部署。使用image stream為的是友善地将一組相關聯的鏡像進行整合管理和使用。openshift origin預設為使用者定義了一系列開箱即用的image stream。
1)切換到openshift項目。
2)通過以下指令可以導入image stream。
3)通過oc get is -n openshift指令,可以列出剛才導入的image stream對象。
此時,如果通路openshift的web控制台,進入hello world項目,單擊項目overview頁面頂部的add to project按鈕,則會看見一系列可用的鏡像被羅列在頁面上,如圖2-11所示。
部署容器應用,可以很簡單:直接通過docker run或oc new-app指令即可完成。但是有時候它也可以是一項很複雜的任務。在現實中,企業的應用往往不是孤立存在的,應用往往有多個子產品;部署需要滿足外部的依賴;使用者需要根據實際的需求,結合環境的配置給部署傳遞不同的參數。為了滿足使用者對複雜應用部署的需求,提高應用部署的效率,openshift引入了應用部署模闆(template)的概念。通過template,使用者可以定義一個或多個需要部署的鏡像,定義部署依賴的對象,定義可供使用者輸入配置的參數項。openshift預設提供了一些示例的template供使用者使用。後續使用者可以根據實際的需求,定義滿足企業需求的應用部署模闆,建構企業内部的軟體市場。
2)下載下傳并建立一個cakephp示例應用的template。通過這個template,使用者可以在服務目錄單擊相關的條目一鍵部署一個cakephp應用和一個mysql資料庫。
3)建立完畢後,可以通過oc get template -n openshift指令檢視導入的模闆資訊。
如果要檢視模闆的詳細内容,可以通過oc get template cakephp-mysql-example
-o json -n openshift指令檢視。-o參數指定了指令以json格式輸出傳回值。
重新整理openshift web控制台的服務目錄界面,在過濾器中輸入cake,即可看到剛導入的應用模闆,如圖2-12所示。
在openshift origin的github倉庫中還有許多預定義好的template示例。你可以按需下載下傳,并通過oc create -f指令導入系統中。
請執行下面的指令導入wildfly-basic-s2i模闆,這在後面的章節會使用到。
細心的讀者也許會發現之前建立router和registry是在default項目中,而建立image stream是在openshift項目中。openshift項目是一個特殊的項目,在這個項目下建立的所有image stream及template對叢集内所有的使用者和項目可見。如果image stream及template在其他項目建立,則隻能在建立這些對象的項目内可見。