一個例子體會Kubernetes內容器的高可用性和彈性伸縮
上一篇文章 在Kubernetes上執行SAP UI5應用(上) ,我介紹瞭如何在Docker裡執行一個簡單的SAP UI5應用,並且已經成功地將一個包含了這個UI5應用的docker映象上傳到Docker hub上。
這篇文章作為這個主題的下半部分,將會介紹如何在Kubernetes裡執行這個docker映象。
文章目錄
-
Kubernetes裡的兩個重要概念:pod和deployment
-
Kubernetes保證應用程式高可用性和伸縮性的一些體驗
-
Kubernetes滾動升級(Rolling Update)特性體驗
在Kubernetes上執行我們的應用,有什麼收益?根據Jerry這十多天有限的時間裡對Kubernetes的學習,我的理解是,Kubernetes可以幫助應用開發人員確保其開發出的應用程式以一種 高可用的、可伸縮和容錯 的方式進行部署和執行,應用開發人員無需花費大量時間和精力去學習Kubernetes底層細節。
換句話說,Kubernetes環境的搭建,系統的配置,可以全部交給Kubernetes的管理員,而應用開發人員作為Kubernetes的消費者,只需要記住幾個簡單的kubectl命令,就能夠輕鬆完成應用程式到Kubernetes上的部署,幾乎不需付出額外的代價就能享受到Kubernetes作為一個平臺給應用程式帶來的上述非功能性的提升。
我們繼續用前一篇文章使用到的UI5應用進行講解。
Jerry很窮,沒有錢購買額外的伺服器自己搭建Kubernetes叢集環境。幸運的是,Kubernetes並沒有拋棄我們這些貧窮的程式設計師,我們還可以選擇Kubernetes Clusters as a Service這種解決方案。
在我另一篇文章 站在巨人肩膀上的牛頓:Kubernetes和SAP Kyma 裡我提到過Gardener, 一個開源的建立Kubernetes叢集的解決方案:
我在SAP內部的Gardener上建立一個基於Google Cloud Platform的Kubernetes叢集,取名jerry1204:
可以看到這個建立好的叢集上的Kubernetes版本還是比較新的, 1.12.3僅僅低於12月3日剛剛釋出的1.13版。
點選上圖Access標籤頁裡的Dashboard(控制檯)超連結,即可對這個Kubernetes叢集進行操作。當然像SAP上海研究院Kubernetes培訓課程上講課的那些老司機們更喜歡用命令列。
因為是免費的叢集,只分配了一個工作節點:
控制檯裡看到的Kubernetes叢集工作節點資訊和命令列kubectl get node -o wide看到的一致:
Kubernetes裡的兩個重要概念:pod和deployment
下面我們使用命令列來消費我們前一篇文章上傳到Docker Hub上的映象i042416/ui5-nginx:
kubectl run jerry-ui5 --image=i042416/ui5-nginx
這個命令列背後發生了很多事情。
首先,執行在Kubernetes上的應用程式,其 高可用性,可伸縮性和容錯性 到底是透過Kubernetes什麼機制保證的?
答案是pod。請單擊上面Kubernetes的架構圖,然後放大,能看到node(節點)裡包含了多個pod,每個pod裡又包含了多個容器。像它的中文含義(豆莢,飛機,航天器或船隻上可與主體分離的分離倉)暗示的一樣,pod就是應用程式執行的載體,是Kubernetes的基本操作單元。整套Kubernetes系統的設計都是圍繞著pod展開,例如pod的部署和執行,如何保證處於執行狀態的pod總數量等於一個恆定值,如何將pod裡應用提供的服務暴露給外部訪問等等。
回到我們之前的命令列,我們試著執行另一個命令 kubectl get pod ,果然發現了一個pod被建立出來,誕生已經40秒了(Age = 40s)。
用describe命令檢視這個pod的明細:
kubectl describe pod jerry-ui5-6ffd46bb95-6bgpg
下圖Container ID後面的docker://說明這是一個docker容器,當然並不意味著Kubernetes只支援Docker這一種容器技術,比如Kubernetes還支援CoreOS的Rocket。
describe命名輸出的Events區域揭示了一個pod從誕生到開始服役的生命週期狀態跳轉:
Scheduled->Pulling->Pulled->Created->Started
image.gif
從每個狀態的from欄位也能看出很多資訊。
Scheduled狀態的from: default-scheduler。Scheduler是Kubernetes的元件之一,負責排程pod到合適的節點上。具體什麼樣的節點算合適,取決於Kubernetes Scheduler排程演算法的實現,Jerry沒有研究過。如果把Scheduler看成一個黑匣子,那麼它的輸入是pod和由多個節點組成的列表,輸出是Pod和一個匹配節點的繫結。這個狀態message顯示的內容"Successfully assigned XXX to shoot--jerrytest-jerry1204-worker-yamer-z1-XXX "後面這個 shoot--jerrytest 開頭的字串就是pod被分配到的節點的名稱。
後面幾個狀態的from欄位都是 kubelet,shoot--jerrytest-jerry1204-worker-yamer-z1-XXX ,其中kubelet是Kubernetes節點上一個重要的模組,負責維護和管理執行於該節點上的所有容器,確保pod的執行狀態與使用者期望一致。
在Kubernetes web控制檯裡也一樣能看到這個處於執行狀態的pod:
除了pod之外,Kubernetes第二個重要的概念就是deployment。
執行另一個命令 kubectl get deploy ,發現 kubectl run 命令除了生成一個pod外,還生成了一個deployment。從這個命令輸出的Desired, Current和Up-to-Date, Available下面的數字,結合前面提到的 Kubernetes裡幾乎所有的設計都是圍繞著pod來展開 這一指導思想,我們不難猜測出,這個生成的deployment也是為pod服務的。
實際上,Kubernetes的初學者可以把deployment的主要職責理解成是保證pod的數量和健康。
在前面的文章裡,我們已經知道了怎樣使用 docker run 啟動一個docker映象。然而在Kubernetes的世界裡,我們不會直接和執行在pod裡的docker容器打交道,而是透過Kubernetes service將pod裡的應用提供的服務暴露給外界消費。
到目前為止,Kubernetes叢集上還沒有任何和應用程式相關的service生成。命令kubectl get svc只返回了一個Kubernetes的標準服務。
因此我們使用命令 kubectl expose 基於剛剛使用 kubectl run 生成的deployment建立一個service:
kubectl expose deployment jerry-ui5 --type=LoadBalancer --port=80 --target-port=80
image.gif
一旦expose命令執行後, get svc 命令這次就返回了一個和deployment同名的service,暴露給外界訪問的IP地址為35.205.230.209:
於是,使用url 35.205.230.209/webapp 就能訪問執行在Kubernetes pod裡的SAP UI5了:
Kubernetes保證應用程式高可用性和伸縮性的一些體驗
到目前為止我們的SAP UI5應用僅僅執行在Kubernetes叢集上的一個工作節點的單個pod裡,還沒有感受到這個應用執行時的表現和之前執行在Docker容器裡有什麼差異。
我們現在就來嘗試下Kubernetes deployment的水平擴充套件功能。在Kubernetes操作檯裡選中deployment,從選單裡執行Scale命令,
設定新的pod的數量:下面截圖的3,意思是告訴這個deployment,在命令執行完畢後,它必須要努力保證,在任何時候由它控制和監控的pod個數必須等於3。
當然這個控制檯上的圖形選單在命令列裡也存在對應的命令,我們後面會用到。
上圖OK按鈕點選後,再次執行 kubectl get pod , 能觀察到水平擴充套件執行之後,生成了兩個新的deployment,所以這次 get pod 命令總共返回了3個pod,其中後兩個pod從Age能看出是水平擴充套件執行之後剛剛建立的。
使用 kubectl describe 命令檢視deployment的明細,在Replicas這個欄位裡看到這個deployment控制的pod的執行時明細:
3 desired | 3 updated | 3 total | 3 available | 0 unavailable
我們現在故意用 kubectl delete 刪除一個pod,再次檢視,發生一個新的pod瞬間就自動生成了,處於執行狀態的pod總數仍然為3。
Kubernetes滾動升級(Rolling Update)特性體驗
滾動升級是Kubernetes一大特色,顧名思義,這是一種平滑過渡的升級方式,透過逐個容器替代升級的方式,來實現無中斷的服務升級。下圖deployment的describe命令的輸出,其中欄位StrategyType欄位表明 kubectl run 建立的deployment預設的升級方式就是滾動升級。
我設計了這樣一個簡單的升級場景:我的SAP UI5應用1.0版本同時執行在一個Kubernetes節點的10個pod上。在整個應用不中斷的前提下,透過滾動升級的方式升級到2.0版本。
由於上一篇文章我上傳到Docker Hub上的映象的標籤為預設的latest,所以我需要在Docker Hub上分別製造兩個標籤為v1.0和v2.0的映象。
下面的命令列推送一個標籤為 v1.0 的映象到Docker Hub:
修改UI5應用明細頁面的標題,在文字後加上一個 (v2.0) , 用來表示這一版的應用為2.0版本:
同樣將這個2.0版本的映象推送到Docker Hub上:
Docker Hub上兩個版本的映象都就緒了:
首先使用1.0版本的映象,啟動單個pod去執行SAP UI5應用:
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個處於執行狀態的pod。
使用下面的命令觸發滾動升級,把名為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已經處於可用狀態。
-
X old replicas are pending termination
-
X of Y updated replicas are available
任意點開一個pod檢視明細,發現其使用的docker映象已經是 v2.0 版本了:
最後在瀏覽器裡看到訂單明細頁面的標題,後面已經出現(v2.0), 再次確認了滾動升級已經成功結束了。
本文介紹的只是Kubernetes特性的冰山一角,更多細節,有待我們去學習,畢竟SAP雲平臺即將支援Kubernetes環境了。感謝閱讀。
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2284641/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SpringCloud 應用在 Kubernetes 上的最佳實踐 —— 高可用(彈性伸縮)SpringGCCloud
- 如何使用 Kubernetes 實現應用程式的彈性伸縮
- Kubernetes彈性伸縮全場景解讀(五) - 定時伸縮元件釋出與開源元件
- Knative Autoscaler 自定義彈性伸縮
- 彈性佈局(伸縮佈局)
- 如何基於容器網路流量指標進行彈性伸縮指標
- Fluid 給資料彈性一雙隱形的翅膀 -- 自定義彈性伸縮UI
- 通過一個實際例子理解Kubernetes裡pod的自動scale - 水平自動伸縮
- AutoScaling彈性伸縮配置重大升級
- 如何利用容器與中介軟體實現微服務架構下的高可用性和彈性擴充套件微服務架構套件
- Serverless:基於個性化服務畫像的彈性伸縮實踐Server
- 使用 MaxScale 實現資料庫的高可用性和彈性資料庫
- 彈性伸縮:高可用架構利器(架構+演算法+思維)架構演算法
- Effective HPA:預測未來的彈性伸縮產品
- EMQX Operator 如何快速建立彈性伸縮的 MQTT 叢集MQQT
- 在騰訊雲容器服務 TKE 中利用 HPA 實現業務的彈性伸縮
- 我們總結了彈性伸縮的五個條件與六個教訓
- AutoScaling彈性伸縮附加與分離RDS例項
- AutoScaling 彈性伸縮附加與分離RDS例項
- 使用 tke-autoscaling-placeholder 實現秒級彈性伸縮
- 5、pgpool-II高可用性(一)資料庫的高可用性資料庫
- AutoScaling彈性伸縮附加與分離負載均衡例項負載
- 雲端乾貨|降本必備—彈性伸縮的基本原理
- Node.js的可伸縮性Node.js
- 阿里云云計算ACP認證重點梳理3—彈性伸縮阿里
- 配置Apache Kafka生產者引數以獲得高可用性和彈性 - NabrajApacheKafka
- KubeVela + KEDA:為應用帶來“與生俱來”的彈性伸縮能力
- 雲原生的彈性 AI 訓練系列之三:藉助彈性伸縮的 Jupyter Notebook,大幅提高 GPU 利用率AIGPU
- RDS for MySQL Serverless公測上線:彈性伸縮,最高可降成本超80%MySqlServer
- Kubernetes stateful set講解以及一個基於postgreSQL的具體例子SQL
- 從一個例子中體會React的基本面React
- 透過HPA+CronHPA組合應對業務複雜彈性伸縮場景
- Pfsense HA(高可用性群集)
- 免運維、彈性伸縮、按需付費...Serverless還有多少驚喜是我不知道的?運維Server
- 通過一個例子學習Kubernetes裡的PersistentVolumeClaim的用法AI
- 大型網站的可伸縮性架構如何設計?網站架構
- Flex彈性盒子與容器屬性Flex
- SQL Server中的高可用性概覽SQLServer