什麼是StatefulSet?
StatefulSet表示一組具有唯一持久身份標識和穩定主機名的有狀態Pod,無論Pod在哪一個Node上運行,身份標識及持久化的數據其都會保留。一般用於持久化存儲、固定網絡標記、有序部署、有伸縮等場景。
什麼是有狀態應用?
有狀態應用是將數據或應用程序狀態持久化到關聯的存儲中,例如MySQL、Kafka、Zookeeper等應用場景,需要對其進行唯一持久身份的標識及數據的永久保存到存儲中。
StatefulSet操作
像Deployment一樣StatefulSet管理基於相同容器規範的Pod。但唯一不同的是StatefulSet爲其每個Pod維護一個標識身份,StatefulSet需要Headless Service來負責Pod的網絡身份。每個Pod具有一個存儲類及存儲聲明,無論Pod被調度到哪一個節點,相關的存儲掛載將伴隨Pod。在刪除Pod或者Stateful時,不會刪除掉關聯的PersistentVolume及PersistentVolumes。
通過yaml資源定義清單創建
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: nginx:1.16
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
查看StatefulSet列表kubectl get statefulset
查看StatefulSet描述信息kubectl describe statefulset
StatefulSet更新策略
通過指定 spec: updateStrategy
中定義的更新策略來確定如何處理更新。
OnDelete: 當手動刪除舊的Pod時新的Pod纔會被自動被創建。
RollingUpdate: 默認的更新策略。舊的Pod自動被刪除,新的Pod也自動創建。
分區
通過指定 .spec.updateStrategy.rollingUpdate.partition
中定義的來對 RollingUpdate 更新策略進行分區,如果指定了分區,則當 StatefulSet 的 .spec.template 更新時,具有大於或等於分區序數的所有 Pod 將被更新。具有小於分區的序數的所有 Pod 將不會被更新,即使刪除它們也將被重新創建。
如果 StatefulSet 的 .spec.updateStrategy.rollingUpdate.partition 大於其 .spec.replicas,則其 .spec.template 的更新將不會傳播到 Pod。一般情況下不需要使用分區,在金絲雀、預發佈等場景下是比較有用的。