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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章