什麼是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。一般情況下不需要使用分區,在金絲雀、預釋出等場景下是比較有用的。