天天看點

Kubernetes - 4.5 Workload - StatefulSet

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

繼續閱讀