回覆列表
-
1 # 程式設計師Dong哥的雜貨鋪
-
2 # 歐巴雲
K8S從最初的釋出到現在,已經更新迭代到了v1.18版本,v1.18版本增強了38個功能:其中 15 個增強功能已趨於穩定,11 個 beta,12 個進入 alpha。目前我們已經將測試叢集升級至v1.18,並開始測試其最新引入的Windows CSI等功能。
目前我們在K8S叢集中部署了Elasticsearch Cluster、Mysql Cluster、Redis Cluster、MongoDB-Replica-Set、Rabbit-MQ等應用,並在叢集中持續穩定執行最少一年以上時間,其中大部份應用經過了百萬級資料的生產環境考驗。從目前的實踐來看,K8S的有狀態部署已經達到了可用狀態,當然這與部署的方式有很大的關係,資料持久化的配置、親和性設定等都很有必要。
RabbitMQ叢集:
ES叢集:
MySQL叢集:
Kubernetes 專案很早就擴展出了對“有狀態應用”的初步支援。這個編排功能,就是:StatefulSet。
StatefulSet 的設計把真實世界裡的應用狀態,抽象為了兩種情況:
拓撲狀態:應用的多個例項之間不是完全對等的關係。
儲存狀態:應用的多個例項分別綁定了不同的儲存資料。
StatefulSet 的核心功能,就是透過某種方式記錄這些狀態,然後在 Pod 被重新建立時,能夠為新 Pod 恢復這些狀態。
StatefulSet Pod 的建立過程,會給它所管理的所有 Pod 的名字,進行了編號,編號規則是:-。這些編號都是從 0 開始累加,與 StatefulSet 的每個 Pod 例項一一對應,絕不重複。Pod 的建立,也是嚴格按照編號順序進行的。此外,K8s透過Headless Service為每個Pod分配一個穩定的DNS地址。當我們把些Pod 刪除之後,Kubernetes 會按照原先編號的順序,創建出新的 Pod。並且,Kubernetes 依然為它們分配了與原來相同的“網路身份”。從而,實現了拓撲狀態的保持。
而儲存狀態的保持主要是運用了Persistent Volume Claim(PVC)和 Persistent Volume(PV)。StatefulSet透過volumeClaimTemplates欄位為StatefulSet管理的每一個Pod宣告一個PVC,這個 PVC 的名字,會被分配一個與這個 Pod 完全一致的編號。StatefulSet控制器在一個 Pod刪除之後,這個 Pod 對應的 PVC 和 PV,並不會被刪除,而這個 Volume 裡已經寫入的資料,也依然會儲存在遠端儲存服務裡。在新的 Pod 創建出來後,它宣告使用的 PVC 的名字保持不變,K8s找到舊 Pod 遺留下來的同名的 PVC,進而找到跟這個 PVC 繫結在一起的 PV。這樣,新的 Pod 就可以掛載到舊 Pod 對應的那個 Volume,並且獲取到儲存在 Volume 裡的資料。
這裡給出一個StatefulSet定義的例子: