1. 程式人生 > >kubernetes有狀態集群服務部署與管理

kubernetes有狀態集群服務部署與管理

什麽是 依次 重建 bsp per 高級 一個 所有 地址

有狀態集群服務的兩個需求:一個是存儲需求,另一個是集群需求。
對存儲需求,Kubernetes的解決方案是:Volume、Persistent Volume 。對PV,除了手動創建PV池外,還可以通過Storage Class來讓存儲系統自動創建。

對集群需求,Kubernetes的解決方案是Pet Set。Pet Set 又通過Init Container來做集群初始化,通過Headless Service來為集群成員提供穩定 的網絡身份。

在K8S運行的服務,從簡單到復雜可以分成三類:無狀態服務、普通有狀態服務和有狀態集群服務。下面分別來看K8S是如何運行這三類服務的。

  • 無狀態服務,K8S使用RC(或更新的Replica Set)來保證一個服務的實例數量,如果說某個Pod實例由於某種原因Crash了,RC會立刻用這個Pod的模版新啟一個Pod來替代它,由於是無狀態的服務,新啟的Pod與原來健康狀態下的Pod一模一樣。在Pod被重建後它的IP地址可能發生變化,為了對外提供一個穩定的訪問接口,K8S引入了Service的概念。一個Service後面可以掛多個Pod,實現服務的高可用。
  • 普通有狀態服務,和無狀態服務相比,它多了狀態保存的需求。Kubernetes提供了以Volume和Persistent Volume為基礎的存儲系統,可以實現服務的狀態保存。
  • 有狀態集群服務,與普通有狀態服務相比,它多了集群管理的需求。K8S為此開發了一套以Pet Set為核心的全新特性,方便了有狀態集群服務在K8S上的部署和管理。具體來說是通過Init Container來做集群的初始化工作,用 Headless Service 來維持集群成員的穩定關系,用動態存儲供給來方便集群擴容,最後用Pet Set來綜合管理整個集群。

要運行有狀態集群服務要解決的問題有兩個,一個是狀態保存,另一個是集群管理。 我們先來看如何解決第一個問題:狀態保存。Kubernetes 有一套以Volume插件為基礎的存儲系統,通過這套存儲系統可以實現應用和服務的狀態保存。

K8S的存儲系統從基礎到高級又大致分為三個層次:普通Volume,Persistent Volume 和動態存儲供應。

總結一下,兩種存儲卷:普通Volume 和Persistent Volume。普通Volume在定義Pod的時候直接定義,Persistent Volume通過Persistent Volume Claim來動態綁定。PV可以手動創建,也可以通過StorageClass來動態創建。

什麽是Init Container?

從名字來看就是做初始化工作的容器。可以有一個或多個,如果有多個,這些 Init Container 按照定義的順序依次執行,只有所有的Init Container 執行完後,主容器才啟動。由於一個Pod裏的存儲卷是共享的,所以 Init Container 裏產生的數據可以被主容器使用到。

Init Container可以在多種 K8S 資源裏被使用到如 Deployment、Daemon Set, Pet Set, Job等,但歸根結底都是在Pod啟動時,在主容器啟動前執行,做初始化工作。

而Pet代表有狀態服務。具體在K8S資源對象裏,Pet是一種需要特殊照顧的Pod。它有狀態、有身份、當然也比普通的Pod要復雜一些。

一個Pet有三個特征。

一是有穩定的存儲,

二是穩定的網絡身份,這是通過一種叫 Headless Service 的特殊Service來實現的。

三是序號命名規則。

kubernetes有狀態集群服務部署與管理