在瞭解Kubernetes應用狀態部署前,我們先看看Kubernetes的高階架構,方便更好的理解Kubernetes的狀態。
Kubernetes 的高階架構
包括應用程式部署模型,服務發現和負載均衡,內部/外部路由分離、persistentvolume 的使用,部署節點守護程式,部署有狀態分散式系統,作業後臺執行,部署資料庫,配置管理,憑證管理,滾動更新,自動縮放和包管理。
A、Kubernetes的基本設計策略之一就是,無需更改應用程式程式碼,就能部署在虛擬機器上執行的現有應用程式。另外,任何執行在虛擬機器上的應用程式都可以通過容器化元件在 Kubernetes 上實現部署。這是通過容器分組、容器編排、覆蓋網路、基於第 4 層虛擬IP、服務發現、支援守護程式執行、部署有狀態應用程式元件、以及擴充套件容器編排系統這些核心功能實現的。
B、Kubernetes 可以提供一組可動態擴充套件的主機,可以應用容器執行 workload,並使用一組稱為 master 的管理主機來提供管理整個容器基礎架構的 API。這些 workload 包括長期執行服務,批處理作業和容器主機的守護程式。為了提供容器到容器的路由,所有容器主機都用覆蓋網路連線在一起。部署在 Kubernetes 上的應用程式在叢集網路中是動態可見的,並可通過傳統負載均衡器向外部網路暴露。叢集管理器的狀態儲存在一個高度分佈的 key/value 儲存(etcd)中,該儲存在 master上執行。
Kubernetes應用狀態部署
在K8s執行的服務,分為無狀態服務和有狀態服務,下面分別看看K8s是如何執行這兩類不同的服務的
01“無狀態”服務
無狀態服務,即 Web 伺服器、代理和應用程式程式碼這樣的應用程式,它們可以處理資料但不進行儲存。編排過程中,開發者比較喜歡使用它們,因為它們易於部署且易於擴充套件。如果流量上升,則只需新增更多的負載平衡。更重要的是,它們是“不變動的”;上游容器映象和基礎架構中正在執行的容器其實幾乎沒有區別。這意味著它們可以隨時被替代,而且容器例項切換過程中幾乎不需要耗費“切換成本”。
無狀態服務,K8s使用Replicaset來保證一個服務的例項數量,如果說某個Pod例項由於某個原因被crash了,RC會立即用一個Pod的模板新啟一個Pod來替代它,由於是無狀態的服務,新啟的Pod與原來健康狀態下的Pod是一模一樣。當Pod被重建後它的IP地址可能發生變化,為了對外提供一個穩定的訪問介面,K8s引入了Service的概念,一個Service後面可以掛多個Pod,實現服務的高可用。
在Kubernetes中,Deployment和Replicasets都是運用無狀態服務的有效手段。
02"有狀態"服務
有狀態的服務,即路由器、CDN(內容傳送網路)、streaming 伺服器和認證伺服器。從部署開始,這些容器就開始與上游映象不同了,時間越長它們的差異越大。這種差異就被稱為“state(狀態)”。事實上,每個執行的應用程式都至少有一個小狀態(差異),但對於“無狀態”應用程式來說,狀態(差異)很小,而且可以進行快速替換。
普通有狀態服務,和無狀態服務相比,它多了狀態儲存的需求,K8s提供了以Volmume和Peristent Volmume為基礎的儲存系統,可以實現服務的狀態儲存。
而在容器化應用程式最困難的任務之一,就是設計有狀態分散式元件的部署體系結構。由於無狀態元件可能沒有預定義的啟動順序、叢集要求、點對點 TCP 連線、唯一的網路識別符號、正常的啟動和終止要求等,因此可以很容易地進行容器化。諸如資料庫,大資料分析系統,分散式 key/value 儲存和 message brokers 可能有複雜的分散式體系結構,都可能用到上述功能。
Kubernetes 引入了 StatefulSets 資源來支援這種複雜的需求,用來管理POD部署和擴容,併為這些pod提供順序和唯一性的保證。
03 StatefulSet部署—有狀態應用
用於解決各個pod例項獨立生命週期管理,提供各個例項的啟動順序和唯一性。
使用StatefulSet的前提是:
1、Kubernetes叢集的版本≥1.5;
2、安裝好DNS叢集外掛,版本≥15。
StatefulSet為什麼適合有狀態的程式,看看它的特性:
A、穩定,唯一的網路識別符號。可以發現叢集內部的其他成員。
B、穩定的持久化儲存。通過Kubernetes的PV/PVC或者外部儲存(預先提供)來實現。
C、啟動或關閉時有序。有序的,優雅的部署和擴充套件。有序,優雅的刪除和終止。有序的自動滾動更新。實現部署和擴容保證。
04運用StatefulSet會帶來什麼好處呢?
部署和擴容的保證
對於帶有N個副本集的StatefulSet,當pod被部署,它們將按0到N-1的順序被建立。
當一Pod被刪除時,它們將按照N-1到0的順序被終止。
在進行Pod擴容前,所有依賴的Pod應該都已在執行和準備好。
在Pod被終止前,所有的依賴它的Pod都必須完全停止。
如果你的系統是微服務構成的生態系統,就會比較繁瑣的交付新服務,如果更近一步,服務是有狀態的,那麼kubernetes的自動化和健壯性特性會對你有很大的幫助,StatefulSet的目的就是給眾多的有狀態負載提供正確的控制器支援。