3.4 StatefulSet(狀態集)
statefulset是用於管理有狀態應用程序的WorkloadAPI對象,管理Deployment和一組Pod,保證有序和Pod唯一性的。和Deployment類似,狀態集StatefulSet基於一個相同的容器規格spec管理Pod,不同的是,狀態集Statefuli爲他們每個Pod保持一個粘性身份,Pod從同樣的規範創建,但不可交換,每個都有一個持久標識符(在任何調度中都會保持標識)。狀態集與任何其他控制器在相同的模式下運行,StatefulSet Controller將會做一些必要的更新使其更新到期望的狀態。
【StatefulSet的使用場景】
狀態集StatefulSet對如下的應用具備價值:需要穩定、唯一網絡標識的,需要穩定、持久存儲的,需要有序、優雅的Deployment和擴展的,需要有序、自動滾動升級的,其中穩定是跨POD調度的持久性的同義詞。如果應用不需要任何穩定標識或有序Deployment、刪除、擴展,那就不需要通過創建stateful對象來創建的,可能像Deployment、ReplicaSet控制器可能更符合此時的需求。
【侷限】
爲Pod提供的存儲要麼使由PersistentVolume Provisioner基於請求的storage class
提供、要麼由admin提供提供;刪除或擴展狀態集Stateful將不會刪除相關聯的volumes;當前狀態集Stateful需要一個Headless Service負責網絡Pod的標識;當StatefulSet刪除時不提供任何終止Pod的保證,所以必須手動先縮減狀態集爲0,然後再刪除;
【組成】
下面是一個示例:
# Headless Service,這裏是Nginx
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
# 狀態集
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
serviceName: "nginx"
replicas: 3 # by default is 1
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
# 使用 PersistentVolumes 提供的存儲
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "my-storage-class"
resources:
requests:
storage: 1Gi
【升級策略】
.spec.updateStrategy
字段可以配置容器、標籤、資源等的自動滾動更新策略,當.spec.updateStrategy.type
設置爲OnDelete
,狀態集Stateful控制器將不會自動更新狀態集中的Pod,用戶必須手動刪除Pod以便控制器可以在修改.spec.template
後創建新的Pod;如果.spec.updateStrategy.type
設置爲RollingUpdate
,狀態集控制器將會刪除並重新創建狀態中的每個Pod。