StatefulSet是用來管理stateful(有狀態)應用的
StatefulSet管理Pod時,確保Pod有一個按序增加的ID
與Deployment最大的不一樣是StatefulSet始終將一系列不變的名字分配給Pod.這些Pod從一個模板建立,可是並不能相互替換html
對於有以下要求的應用程序,StatefulSet很是適用
須要穩定、惟一的網絡標識(dnsname)
每一個Pod始終對應各自的存儲路徑(PersistantVolumeClaimTemplate)
按順序的增長副本、減小副本,並在減小副本時執行清理
安順序自動的執行滾動更新nginx
若是一個應用不須要一個穩定的網絡標識,或者不須要按順序部署、刪除、增長副本,應該用deployment(無狀態)控制器web
Pod的存儲要麼由storage clas對應的PersistentVolume Provisioner提供,要麼由集羣管理員事先建立api
刪除或scale down一個StatefulSet將不會刪除其對應的數據卷,這樣保證數據安全安全
刪除StatefulSet時,將沒法保證Pod正常終止.若是要按順序優雅的終止StatefulSet中的Pod,能夠在刪除StatefulSet以前,將scale down 到0 網絡
當使用默認的Pod Management Policy(OrderedReady)進行滾動更新時,可能進入一個錯誤狀態,並須要人工介入app
apiVersion: v1 kind: Service metadata: name: nginx-service #headless service的名稱 labels: app: nginx #自定義標籤 spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx #關聯app: nginx的pod --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web-d #statefulset控制器的名稱 spec: selector: matchLabels: app: nginx #關聯app: nginx的pod進行控制 serviceName: "nginx-service" #指定headless service replicas: 2 template: metadata: labels: app: nginx #pod的標籤 spec: terminationGracePeriodSeconds: 10 containers: - name: nginx #pod裏容器的名稱 image: nginx:1.7.9 ports: - containerPort: 80 name: web
StatefulSet中的Pod具有一個惟一標識,該標識由如下幾部分組成less
2.1序號dom
假設一個StatefulSet的副本數爲N,其中每一個Pod都會被分配一個須要,序號的取值範圍從0開始,而且該須要在StatefulSet是惟一的.spa
Pod的Name是StatefulSet的Name + 序號;好比這個配置文件裏,有兩個副本,第一個Pod的Name就是web-d-0,第二個Pod的Name就是web-d-1
2.2穩定的網絡ID
1)StatefulSet中Pod的hostname格式爲$(statefulSet name)-$(Pod序號),上面的例子將要建立2個Pod,第一個Pod的Name爲:web-d-0,第二個Pod的Name爲web-d-1
2)StatefulSet可使用Headless service來控制其Pod所在的域;該域(domain)的格式爲: $(service name).$(namespace).svc.cluster.local;
上面例子的域就是:nginx-service.defaule.svc.cluster.local
3)StatefulSet中每一個Pod都被分配一個dnsNmae,格式爲:$(pod name).$(所在域)
上面的例子 Pod的dnsName就是 web-d-0.nginx-server.default.svc.cluster.local,其餘pod能夠經過這個地址找到它
2.3穩定的存儲
kubernetes爲每個VolumeClaimTemplate建立一份PersistentVolum(存儲卷).在上面的例子中,每個Pod都將由StorageClass(存儲類)my-storage-class爲其建立一個1GB大小的存儲卷.
StatefulSet 中 pod.spec.terminationGracePeriodSeconds
不能爲 0
上面例子中StatefulSet被建立時:
OrderedReady
OrderedReady 是 .spec.podManagementPlicy
的默認值。其對 Pod 的管理方式已經在 部署和伸縮 StatefulSet 時的執行順序 詳細描述
Parallel
.spec.podManagementPlicy
的取值爲 Parallel,則 StatefulSet Controller 將同時並行地建立或終止其全部的 Pod。此時 StatefulSet Controller 將不會逐個建立 Pod,等待 Pod 進入 Running 和 Ready 狀態以後再建立下一個 Pod,也不會逐個終止 Pod。
注意:此選項隻影響到伸縮(scale up/scale down)操做。更新操做不受影響。
On Delete
若是StatefulSet的.spec.updateStrategy.type字段被設置爲OnDelete,當修改.spce.template的內容時,StatefulSet Controller將不會自動更新Pod.必須得手動刪除Pod,從新用修改的過得配置文件建立的時候,纔會按照修改過得配置文件 建立Pod
Rolling Updates
.spec.updateStrategy字段的默認值是RollingUpdates,該策略爲StatefulSet實現了Pod的自動滾動更新,在用戶更新StatefulSet的.spec.template字段的時候,StatefulSet Controller將自動的刪除並重建StatefulSet中的每一個Pod,處理順序以下:
1)從序號最大的Pod開始,逐個刪除和更新每個Pod,直到序號最小的Pod被更新
2)當正在更新的Pod達到了Running和Ready狀態後,才繼續更新其前序Pod
Partitions參數:
經過指定.spce.updateStrtegy.rollingUpdate.partition字段,能夠分片(partitioned)執行rolling update更新策略;當更新StatefulSet的.spec.template時:
··序號大於或等於.spce.updateStrtegy.rollingUpdate.partition的Pod將被刪除重建
··序號小於.spce.updateStrtegy.rollingUpdate.partition的Pod將不會更新,即便手工刪除該Pod,kubernetes也會使用前一個版本的.spec.template重建該Pod
··若是.spce.updateStrtegy.rollingUpdate.partition大於.spec.replicas,更新.spec.template將不會影響任何Pod
大部分狀況,都用不到.spce.updateStrtegy.rollingUpdate.partition參數,除非:執行預發佈、執行金絲雀更新、執行按階段更新
參考如下文檔:https://kuboard.cn/learning/k8s-intermediate/workload/wl-statefulset/#statefulset-%E6%A6%82%E8%BF%B0