1、statefulset控制器
Setatefulset控制器是pod資源控制器的一種實現,用於部署和擴展有狀態應用的pod資源,確保他們的運行順序及每個pod資源的唯一性。Statefulset主要用於以下類型的應用程序:
(1)未定且唯一的網絡標識符
(2)穩定且持久的存儲
(3)有序、優雅的部署和擴展
(4)有序、優雅的刪除和終止
(5)有序而自動的滾動更新
2、statefulset控制器的創建與管理
(1)創建statefulset對象
一個完整的statefulset控制器是由一個Headless Service、statefulset、volumeClaimTemplate三個組件組成。爲了方便pvc的創建,使用glusterfs提供動態的pv供給。
# 查看創建的存儲類
]# kubectl get StorageClass
NAME PROVISIONER AGE
glusterfs kubernetes.io/glusterfs 16s
# 爲stateful對象創建創建headless service
]# cat stateful-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
labels:
app: myapp-svc
spec:
ports:
- name: web
port: 80
clusterIP: None
selector:
app: myapp-sfs
# 定義創建stateful格式對象
]# cat statefulset-pod.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: myapp
spec:
serviceName: myapp-svc
replicas: 2
selector:
matchLabels:
app: myapp-sfs
template:
metadata:
labels:
app: myapp-sfs
spec:
containers:
- name: myapp
image: nginx:1.12
ports:
- name: http
containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: html
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "glusterfs"
resources:
requests:
storage: 2Gi
默認情況下,statefulset控制器以串行的方式運行創建各pod副本,如果想要以並行的方式創建和刪除pod資源,則可以設定.spec.podManagementPolicy字段值爲“Parallel”,默認值爲“OrderadReady”。
(2)setatefulset控制器中pod資源的標識符及存儲卷
由statefulset控制器創建的pod資源擁有固定、唯一的標識和專用的存儲卷,即使重新調度或終止後重建,其名稱也依然保持不變,且此前的存儲卷及數據不會丟失。它們的唯一標識符是通過唯一的索引號及相關的statefulset對象的名稱而生成,格式爲“<statefulset name>-<ordinalindex>”。
(3)statefulset資源擴縮容
Statefulset資源的擴縮容與deployment資源相似,均可通過“kubectl scale”或“kubectl patch”或“kubectl edit”命令直接修改其副本數。
3、statefulset資源升級
statefulset控制器支持資源自動更新機制,更新策略由spec.updateStrategy字段定義。
默認爲RollingUpdate,即滾動更新;另一個可用策略爲OnDelete即刪除更新。
(1)滾動更新
滾動更新是以逆序的方式從其最大索引編號的pod資源逐一進行。
# 升級nginx版本
]# kubectl set image statefulset myapp myapp=nginx:1.14-alpine
statefulset.apps/myapp image updated
# 觀察升級過程
~]# kubectl get pods -l app=myapp-sfs -w
NAME READY STATUS RESTARTS AGE
myapp-0 1/1 Running 0 55s
myapp-1 1/1 Running 0 67s
myapp-2 1/1 Running 0 75s
myapp-2 1/1 Terminating 0 86s
myapp-2 0/1 Terminating 0 87s
myapp-2 0/1 Terminating 0 88s
myapp-2 0/1 Terminating 0 88s
myapp-2 0/1 Pending 0 0s
myapp-2 0/1 Pending 0 0s
(2)暫存更新
當用戶需要設定一個更新操作,但又不希望他立即執行時,可將跟新操作予以“暫存”,待條件滿足後再手動觸發更新。Statefulset資源的分區跟新機制能夠實現此項功能。
# 首先將滾動更新分區制設置大於pod副本數量
]# kubectl patch statefulset myapp -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":3}}}}'
statefulset.apps/myapp patched
# 更新pod鏡像
]# kubectl set image statefulset myapp myapp=nginx:latest
statefulset.apps/myapp image updated
# 檢查各pod中鏡像版本並未發生改變
~]# kubectl get pods -l app=myapp-sfs -o custom-columns=NAME:metadata.name,IMAGE:spec.containers[0].image
NAME IMAGE
myapp-0 nginx:1.14-alpine
myapp-1 nginx:1.14-alpine
myapp-2 nginx:1.14-alpine
(3)金絲雀部署
將處於暫存狀態的更新操作的partition定位於pod資源的最大索引號,即只放出一隻金絲雀,由其測試第一輪的跟新操作,在確認無誤後通過修改partition屬性的值跟新其他的pod對象。
(4)並行操作
Statefulset控制器管理的pod資源的策略除了默認的OrderedReady(順序創建及逆序刪除)外,還支持並行的創建及刪除操作,即同事創建所有的pod資源及同事刪除所有的pod資源,完成該操作需要將spec.podManageMentPolicy字段的值設置爲Parallel。