摘要:后面幾個狀態(tài)的字段都是,其中是節(jié)點上一個重要的模塊,負責(zé)維護和管理運行于該節(jié)點上的所有容器,確保的運行狀態(tài)與使用者期望一致。
上一篇文章?在Kubernetes上運行SAP UI5應(yīng)用(上),我介紹了如何在Docker里運行一個簡單的SAP UI5應(yīng)用,并且已經(jīng)成功地將一個包含了這個UI5應(yīng)用的docker鏡像上傳到Docker hub上。
這篇文章作為這個主題的下半部分,將會介紹如何在Kubernetes里運行這個docker鏡像。
文章目錄
Kubernetes里的兩個重要概念:pod和deployment
Kubernetes保證應(yīng)用程序高可用性和伸縮性的一些體驗
Kubernetes滾動升級(Rolling Update)特性體驗
在Kubernetes上運行我們的應(yīng)用,有什么收益?根據(jù)Jerry這十多天有限的時間里對Kubernetes的學(xué)習(xí),我的理解是,Kubernetes可以幫助應(yīng)用開發(fā)人員確保其開發(fā)出的應(yīng)用程序以一種高可用的、可伸縮和容錯的方式進行部署和運行,應(yīng)用開發(fā)人員無需花費大量時間和精力去學(xué)習(xí)Kubernetes底層細節(jié)。
換句話說,Kubernetes環(huán)境的搭建,系統(tǒng)的配置,可以全部交給Kubernetes的管理員,而應(yīng)用開發(fā)人員作為Kubernetes的消費者,只需要記住幾個簡單的kubectl命令,就能夠輕松完成應(yīng)用程序到Kubernetes上的部署,幾乎不需付出額外的代價就能享受到Kubernetes作為一個平臺給應(yīng)用程序帶來的上述非功能性的提升。
我們繼續(xù)用前一篇文章使用到的UI5應(yīng)用進行講解。
Jerry很窮,沒有錢購買額外的服務(wù)器自己搭建Kubernetes集群環(huán)境。幸運的是,Kubernetes并沒有拋棄我們這些貧窮的程序員,我們還可以選擇Kubernetes Clusters as a Service這種解決方案。
在我另一篇文章?站在巨人肩膀上的牛頓:Kubernetes和SAP Kyma?里我提到過Gardener, 一個開源的創(chuàng)建Kubernetes集群的解決方案:
https://github.com/gardener
我在SAP內(nèi)部的Gardener上創(chuàng)建一個基于Google Cloud Platform的Kubernetes集群,取名jerry1204:
可以看到這個創(chuàng)建好的集群上的Kubernetes版本還是比較新的, 1.12.3僅僅低于12月3日剛剛發(fā)布的1.13版。
點擊上圖Access標簽頁里的Dashboard(控制臺)超鏈接,即可對這個Kubernetes集群進行操作。當(dāng)然像SAP上海研究院Kubernetes培訓(xùn)課程上講課的那些老司機們更喜歡用命令行。
因為是免費的集群,只分配了一個工作節(jié)點:
控制臺里看到的Kubernetes集群工作節(jié)點信息和命令行kubectl get node -o wide看到的一致:
Kubernetes里的兩個重要概念:pod和deployment
下面我們使用命令行來消費我們前一篇文章上傳到Docker Hub上的鏡像i042416/ui5-nginx:
kubectl run jerry-ui5 --image=i042416/ui5-nginx
這個命令行背后發(fā)生了很多事情。
首先,運行在Kubernetes上的應(yīng)用程序,其高可用性,可伸縮性和容錯性到底是通過Kubernetes什么機制保證的?
答案是pod。請單擊上面Kubernetes的架構(gòu)圖,然后放大,能看到node(節(jié)點)里包含了多個pod,每個pod里又包含了多個容器。像它的中文含義(豆莢,飛機,航天器或船只上可與主體分離的分離倉)暗示的一樣,pod就是應(yīng)用程序運行的載體,是Kubernetes的基本操作單元。整套Kubernetes系統(tǒng)的設(shè)計都是圍繞著pod展開,例如pod的部署和運行,如何保證處于運行狀態(tài)的pod總數(shù)量等于一個恒定值,如何將pod里應(yīng)用提供的服務(wù)暴露給外部訪問等等。
回到我們之前的命令行,我們試著執(zhí)行另一個命令kubectl get pod,果然發(fā)現(xiàn)了一個pod被創(chuàng)建出來,誕生已經(jīng)40秒了(Age = 40s)。
用describe命令查看這個pod的明細:
kubectl describe pod jerry-ui5-6ffd46bb95-6bgpg
下圖Container ID后面的docker://說明這是一個docker容器,當(dāng)然并不意味著Kubernetes只支持Docker這一種容器技術(shù),比如Kubernetes還支持CoreOS的Rocket。
describe命名輸出的Events區(qū)域揭示了一個pod從誕生到開始服役的生命周期狀態(tài)跳轉(zhuǎn):
Scheduled->Pulling->Pulled->Created->Started
從每個狀態(tài)的from字段也能看出很多信息。
Scheduled狀態(tài)的from:?default-scheduler。Scheduler是Kubernetes的組件之一,負責(zé)調(diào)度pod到合適的節(jié)點上。具體什么樣的節(jié)點算合適,取決于Kubernetes Scheduler調(diào)度算法的實現(xiàn),Jerry沒有研究過。如果把Scheduler看成一個黑匣子,那么它的輸入是pod和由多個節(jié)點組成的列表,輸出是Pod和一個匹配節(jié)點的綁定。這個狀態(tài)message顯示的內(nèi)容"Successfully assigned XXX to?shoot--jerrytest-jerry1204-worker-yamer-z1-XXX"后面這個shoot--jerrytest開頭的字符串就是pod被分配到的節(jié)點的名稱。
后面幾個狀態(tài)的from字段都是kubelet,shoot--jerrytest-jerry1204-worker-yamer-z1-XXX,其中kubelet是Kubernetes節(jié)點上一個重要的模塊,負責(zé)維護和管理運行于該節(jié)點上的所有容器,確保pod的運行狀態(tài)與使用者期望一致。
在Kubernetes web控制臺里也一樣能看到這個處于運行狀態(tài)的pod:
除了pod之外,Kubernetes第二個重要的概念就是deployment。
執(zhí)行另一個命令kubectl get deploy,發(fā)現(xiàn)kubectl run命令除了生成一個pod外,還生成了一個deployment。從這個命令輸出的Desired, Current和Up-to-Date, Available下面的數(shù)字,結(jié)合前面提到的Kubernetes里幾乎所有的設(shè)計都是圍繞著pod來展開這一指導(dǎo)思想,我們不難猜測出,這個生成的deployment也是為pod服務(wù)的。
實際上,Kubernetes的初學(xué)者可以把deployment的主要職責(zé)理解成是保證pod的數(shù)量和健康。
在前面的文章里,我們已經(jīng)知道了怎樣使用docker run啟動一個docker鏡像。然而在Kubernetes的世界里,我們不會直接和運行在pod里的docker容器打交道,而是通過Kubernetes service將pod里的應(yīng)用提供的服務(wù)暴露給外界消費。
到目前為止,Kubernetes集群上還沒有任何和應(yīng)用程序相關(guān)的service生成。命令kubectl get svc只返回了一個Kubernetes的標準服務(wù)。
因此我們使用命令kubectl expose基于剛剛使用kubectl run生成的deployment創(chuàng)建一個service:
kubectl expose deployment jerry-ui5 --type=LoadBalancer --port=80 --target-port=80
一旦expose命令執(zhí)行后,get svc命令這次就返回了一個和deployment同名的service,暴露給外界訪問的IP地址為35.205.230.209:
于是,使用url?35.205.230.209/webapp就能訪問運行在Kubernetes pod里的SAP UI5了:
Kubernetes保證應(yīng)用程序高可用性和伸縮性的一些體驗
到目前為止我們的SAP UI5應(yīng)用僅僅運行在Kubernetes集群上的一個工作節(jié)點的單個pod里,還沒有感受到這個應(yīng)用運行時的表現(xiàn)和之前運行在Docker容器里有什么差異。
我們現(xiàn)在就來嘗試下Kubernetes deployment的水平擴展功能。在Kubernetes操作臺里選中deployment,從菜單里執(zhí)行Scale命令,
設(shè)定新的pod的數(shù)量:下面截圖的3,意思是告訴這個deployment,在命令執(zhí)行完畢后,它必須要努力保證,在任何時候由它控制和監(jiān)控的pod個數(shù)必須等于3。
當(dāng)然這個控制臺上的圖形菜單在命令行里也存在對應(yīng)的命令,我們后面會用到。
上圖OK按鈕點擊后,再次執(zhí)行kubectl get pod, 能觀察到水平擴展執(zhí)行之后,生成了兩個新的deployment,所以這次get pod命令總共返回了3個pod,其中后兩個pod從Age能看出是水平擴展執(zhí)行之后剛剛創(chuàng)建的。
使用kubectl describe命令查看deployment的明細,在Replicas這個字段里看到這個deployment控制的pod的運行時明細:
3 desired | 3 updated | 3 total | 3 available | 0 unavailable
我們現(xiàn)在故意用kubectl delete刪除一個pod,再次查看,發(fā)生一個新的pod瞬間就自動生成了,處于運行狀態(tài)的pod總數(shù)仍然為3。
Kubernetes滾動升級(Rolling Update)特性體驗
滾動升級是Kubernetes一大特色,顧名思義,這是一種平滑過渡的升級方式,通過逐個容器替代升級的方式,來實現(xiàn)無中斷的服務(wù)升級。下圖deployment的describe命令的輸出,其中字段StrategyType字段表明kubectl run創(chuàng)建的deployment默認的升級方式就是滾動升級。
我設(shè)計了這樣一個簡單的升級場景:我的SAP UI5應(yīng)用1.0版本同時運行在一個Kubernetes節(jié)點的10個pod上。在整個應(yīng)用不中斷的前提下,通過滾動升級的方式升級到2.0版本。
由于上一篇文章我上傳到Docker Hub上的鏡像的標簽為默認的latest,所以我需要在Docker Hub上分別制造兩個標簽為v1.0和v2.0的鏡像。
下面的命令行推送一個標簽為v1.0的鏡像到Docker Hub:
修改UI5應(yīng)用明細頁面的標題,在文字后加上一個(v2.0), 用來表示這一版的應(yīng)用為2.0版本:
同樣將這個2.0版本的鏡像推送到Docker Hub上:
Docker Hub上兩個版本的鏡像都就緒了:
首先使用1.0版本的鏡像,啟動單個pod去執(zhí)行SAP UI5應(yīng)用:
kubectl run jerry-ui5 --image=i042416/ui5-nginx:v1.0
使用scale命令將單個pod水平擴展到10個pod:
kubectl scale --replicas=10 deployment/jerry-ui5
上圖看出kubectl get pod返回10個處于運行狀態(tài)的pod。
使用下面的命令觸發(fā)滾動升級,把名為jerry-ui5的deployent基于的鏡像從v1.0升級到v2.0:
kubectl set image deployment/jerry-ui5 i042416/ui5-nginx=i042416/ui5-nginx:v2.0
使用kubectl rollout status deployment/jerry-ui5查看滾動升級的實時進展情況。上圖顯示的日志表明,在某個時間點,有多少個舊版本的pod正等待被終止,有多少個新版本的pod已經(jīng)處于可用狀態(tài)。
X old replicas are pending termination
X of Y updated replicas are available
任意點開一個pod查看明細,發(fā)現(xiàn)其使用的docker鏡像已經(jīng)是v2.0版本了:
最后在瀏覽器里看到訂單明細頁面的標題,后面已經(jīng)出現(xiàn)(v2.0), 再次確認了滾動升級已經(jīng)成功結(jié)束了。
本文介紹的只是Kubernetes特性的冰山一角,更多細節(jié),有待我們?nèi)W(xué)習(xí),畢竟SAP云平臺即將支持Kubernetes環(huán)境了。感謝閱讀。
要獲取更多Jerry的原創(chuàng)文章,請關(guān)注公眾號"汪子熙":
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/33111.html
摘要:后面幾個狀態(tài)的字段都是,其中是節(jié)點上一個重要的模塊,負責(zé)維護和管理運行于該節(jié)點上的所有容器,確保的運行狀態(tài)與使用者期望一致。 上一篇文章?在Kubernetes上運行SAP UI5應(yīng)用(上),我介紹了如何在Docker里運行一個簡單的SAP UI5應(yīng)用,并且已經(jīng)成功地將一個包含了這個UI5應(yīng)用的docker鏡像上傳到Docker hub上。 這篇文章作為這個主題的下半部分,將會介紹如何...
摘要:后面幾個狀態(tài)的字段都是,其中是節(jié)點上一個重要的模塊,負責(zé)維護和管理運行于該節(jié)點上的所有容器,確保的運行狀態(tài)與使用者期望一致。 上一篇文章?在Kubernetes上運行SAP UI5應(yīng)用(上),我介紹了如何在Docker里運行一個簡單的SAP UI5應(yīng)用,并且已經(jīng)成功地將一個包含了這個UI5應(yīng)用的docker鏡像上傳到Docker hub上。 這篇文章作為這個主題的下半部分,將會介紹如何...
摘要:小的時候,聽過牛頓這樣謙虛的一句話如果說我看得比別人更遠些,那是因為我站在巨人的肩膀上。。發(fā)布一個的事件,事件包含創(chuàng)建訂單的字段。 這周Jerry在SAP上海研究院參加了一個為期4天的Kubernetes培訓(xùn),度過了忙碌而又充實的4天。Jason,Benny和Peng三位大神的培訓(xùn)干貨滿滿,借此機會,Jerry和過去的兩位老領(lǐng)導(dǎo)Patrick和Evan敘了敘舊,也拜見了上海SAP圈子里...
摘要:小的時候,聽過牛頓這樣謙虛的一句話如果說我看得比別人更遠些,那是因為我站在巨人的肩膀上。。發(fā)布一個的事件,事件包含創(chuàng)建訂單的字段。 這周Jerry在SAP上海研究院參加了一個為期4天的Kubernetes培訓(xùn),度過了忙碌而又充實的4天。Jason,Benny和Peng三位大神的培訓(xùn)干貨滿滿,借此機會,Jerry和過去的兩位老領(lǐng)導(dǎo)Patrick和Evan敘了敘舊,也拜見了上海SAP圈子里...
閱讀 540·2021-08-31 09:45
閱讀 1647·2021-08-11 11:19
閱讀 883·2019-08-30 15:55
閱讀 821·2019-08-30 10:52
閱讀 2845·2019-08-29 13:11
閱讀 2924·2019-08-23 17:08
閱讀 2833·2019-08-23 15:11
閱讀 3066·2019-08-23 14:33