k8s筆記七(使用statefulset控制器部署有狀態的pod應用)

1、statefulset控制器

        Setatefulset控制器是pod資源控制器的一種實現,用於部署和擴展有狀態應用的pod資源,確保他們的運行順序及每個pod資源的唯一性。Statefulset主要用於以下類型的應用程序:

(1)未定且唯一的網絡標識符

(2)穩定且持久的存儲

(3)有序、優雅的部署和擴展

(4)有序、優雅的刪除和終止

(5)有序而自動的滾動更新

2、statefulset控制器的創建與管理

(1)創建statefulset對象

        一個完整的statefulset控制器是由一個Headless Service、statefulset、volumeClaimTemplate三個組件組成。爲了方便pvc的創建,使用glusterfs提供動態的pv供給。

# 查看創建的存儲類
]# kubectl get StorageClass
NAME        PROVISIONER               AGE
glusterfs   kubernetes.io/glusterfs   16s
# 爲stateful對象創建創建headless service
]# cat stateful-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
  labels: 
    app: myapp-svc
spec:
  ports:
  - name: web
    port: 80
  clusterIP: None
  selector:
app: myapp-sfs
# 定義創建stateful格式對象
]# cat statefulset-pod.yaml 
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: myapp
spec:
  serviceName: myapp-svc
  replicas: 2
  selector:
    matchLabels:
      app: myapp-sfs
  template:
    metadata:
      labels:
        app: myapp-sfs
    spec:
      containers:
      - name: myapp
        image: nginx:1.12
        ports:
        - name: http
          containerPort: 80
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: html
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "glusterfs"
      resources:
        requests:
          storage: 2Gi

        默認情況下,statefulset控制器以串行的方式運行創建各pod副本,如果想要以並行的方式創建和刪除pod資源,則可以設定.spec.podManagementPolicy字段值爲“Parallel”,默認值爲“OrderadReady”。

(2)setatefulset控制器中pod資源的標識符及存儲卷

         由statefulset控制器創建的pod資源擁有固定、唯一的標識和專用的存儲卷,即使重新調度或終止後重建,其名稱也依然保持不變,且此前的存儲卷及數據不會丟失。它們的唯一標識符是通過唯一的索引號及相關的statefulset對象的名稱而生成,格式爲“<statefulset name>-<ordinalindex>”。

(3)statefulset資源擴縮容

        Statefulset資源的擴縮容與deployment資源相似,均可通過“kubectl scale”或“kubectl patch”或“kubectl edit”命令直接修改其副本數。    

3、statefulset資源升級

        statefulset控制器支持資源自動更新機制,更新策略由spec.updateStrategy字段定義。

        默認爲RollingUpdate,即滾動更新;另一個可用策略爲OnDelete即刪除更新。

(1)滾動更新

         滾動更新是以逆序的方式從其最大索引編號的pod資源逐一進行。

# 升級nginx版本
]# kubectl set image statefulset myapp myapp=nginx:1.14-alpine
statefulset.apps/myapp image updated
# 觀察升級過程
~]# kubectl get pods -l app=myapp-sfs -w
NAME      READY   STATUS    RESTARTS   AGE
myapp-0   1/1     Running   0          55s
myapp-1   1/1     Running   0          67s
myapp-2   1/1     Running   0          75s
myapp-2   1/1   Terminating   0     86s
myapp-2   0/1   Terminating   0     87s
myapp-2   0/1   Terminating   0     88s
myapp-2   0/1   Terminating   0     88s
myapp-2   0/1   Pending   0     0s
myapp-2   0/1   Pending   0     0s

(2)暫存更新

         當用戶需要設定一個更新操作,但又不希望他立即執行時,可將跟新操作予以“暫存”,待條件滿足後再手動觸發更新。Statefulset資源的分區跟新機制能夠實現此項功能。

# 首先將滾動更新分區制設置大於pod副本數量
]# kubectl patch statefulset myapp -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":3}}}}'
statefulset.apps/myapp patched
# 更新pod鏡像
]# kubectl set image statefulset myapp myapp=nginx:latest
statefulset.apps/myapp image updated
# 檢查各pod中鏡像版本並未發生改變
~]# kubectl get pods -l app=myapp-sfs -o custom-columns=NAME:metadata.name,IMAGE:spec.containers[0].image
NAME      IMAGE
myapp-0   nginx:1.14-alpine
myapp-1   nginx:1.14-alpine
myapp-2   nginx:1.14-alpine

(3)金絲雀部署

         將處於暫存狀態的更新操作的partition定位於pod資源的最大索引號,即只放出一隻金絲雀,由其測試第一輪的跟新操作,在確認無誤後通過修改partition屬性的值跟新其他的pod對象。

(4)並行操作

         Statefulset控制器管理的pod資源的策略除了默認的OrderedReady(順序創建及逆序刪除)外,還支持並行的創建及刪除操作,即同事創建所有的pod資源及同事刪除所有的pod資源,完成該操作需要將spec.podManageMentPolicy字段的值設置爲Parallel。

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