基本概念
有狀態工作負載:即kubernetes中的“StatefulSet”,有狀態工作負載支持實例有序部署和刪除,支持持久化存儲,適用于實例間存在互訪的場景,如ETCD、mysql-HA等。
操作場景
在運行過程中會保存數據或狀態的工作負載稱為“有狀態工作負載(statefulset)”。例如Mysql,它需要存儲產生的新數據。
因為容器可以在不同主機間遷移,所以在宿主機上并不會保存數據,這依賴于云容器引擎提供的高可用存儲卷,將存儲卷掛載在容器上,從而實現有狀態工作負載的數據持久化。
前提條件
在創建容器工作負載前,您需要存在一個可用集群。若沒有請參照集群開通中內容創建。
若工作負載需要被外網訪問,請確保集群中至少有一個節點已綁定彈性IP,或已購買負載均衡實例。
創建多個工作負載時,請確保容器使用的端口不沖突 ,否則部署會失敗。
操作步驟及說明
創建StatefulSet與創建Deployment的過程類似,但主要有以下幾個方面的差異,需要注意:
數據卷

除了Deployment能夠使用的六種類型的數據卷之外,StatefulSet還多了新建PVC這種類型的數據卷掛載,而且這種類型的數據卷僅StatefulSet能夠使用。一般情況下,如果我們使用StatefulSet來做數據的持久化,即可使用新建PVC這種數據卷。
使用這種數據卷掛載的時候,我們需要提前創建好存儲類,然后點擊上面的新建pvc。

新建pvc時的參數需要留意,只有同時滿足下述條件,新建PVC才能成功綁定到我們提前創建的持久存儲卷上:
- 名稱可以任意填寫 -StorageClass;名稱要選擇我們提前創建好的持久存儲類。
- 所需容器:不能超過我們提前創建好的持久存儲卷的容量。
- 訪問模式:要和我們提前創建的持久存儲卷的訪問模式一致。
高級設置-升級方式

StatefulSet的另外一個差異點就是升級方式和Deployment不同,(升級方式需要點開工作負載的高級設置):
1、刪除升級:如果設置StatefulSet的升級方式為刪除升級,那么我們全量替換升級StatefulSet時,全量替換更新的內容在我們重新部署Pods前是不會生效的。
2、滾動升級(不推薦這種升級方式):如果設置StatefulSet的升級方式為滾動升級,那么我們全量替換升級StatefulSet時,k8s會自動幫我們刪除重建StatefulSet的每一個Pod,此時有一個可選的參數Partition。一般建議不設置Partition。
以下場景可以設置Partition:執行預發布 - 執行金絲雀更新 - 執行按階段的更新。
Partition含義:只有序號大于或等于partition值時, Pod 將被刪除重建,即序號小于partition值,Pod會維持原狀不更新。
partition默認值為0,意味著所有的Pod都會被刪除重建(序號的含義:假設StatefulSet有3個副本,即對應三個Pod,那么StatefulSet的這三個Pod會依次命名為0, 1, 2號,這里的編號即是序號)。 序號小于partition的Pod不會被升級,即使手動刪除該Pod,重新創建出來的也是舊版本的Pod。
服務名稱

強烈建議創建有狀態工作負載的同時創建Headless服務,同時創建有狀態工作負載和服務時可以忽略這個參數 。這個參數僅對于分開創建有狀態工作負載和服務的用戶有效 - 如果分開創建有狀態工作負載和服務,那么請務必設置這個參數,并且后續創建服務時,服務名稱必須和這個參數保持一致。