3.4 控制器——StatefulSet(狀態集)

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。

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