StatefulSet介紹
前面使用
Deployment創建的Pod是無狀態的,當掛載了volume之后,如果該Pod掛了,Replication Controller會再啟動一個Pod來保證可用性,但是由于Pod是無狀態的,pod掛了就會和之前的Volume的關系斷開,新創建的Pod無法找到之前的Pod,但是對于用戶來說,他們對底層的Pod掛了是沒有感知的,但是當Pod掛了之后就無法再使用之前掛載的存盤卷,為了解決這一問題,就引入了StatefulSet用于保留Pod的狀態資訊,
StatefulSet是Pod資源控制器的一種實作,用于部署和擴展有狀態應用的Pod資源,確保它們的運行順序及每個Pod資源的唯一性,其應用場景包括:
穩定的持久化存盤,即
Pod重新調度后還是能訪問到相同的持久化資料,基于PVC來實作,穩定的網路標識,即
Pod重新調度后其PodName和HostName不變,基于Headless Service(即沒有Cluster IP的Service)來實作有序部署,有序擴展,即
Pod是有順序的,在部署或者擴展的時候要依據定義的順序依次進行(即從0到N-1,在下一個Pod運行之前的所有之前的Pod必須都是Running和Ready狀態),基于init Containers來實作有序收縮,有序洗掉(即從N-1到0)
StatefulSet由以下幾個部分組成:
用于定義網路標志(
DNS domain)和Headless Service用于創建
PersistentVolumes和VolumeClaimTemplates定義具體應用的
StatefulSet
StatefulSet中的每個Pod的DNS格式為statefulSetName-{0..N-1}.serviceName.namespace.svc.cluster.local,其中
serviceName:為
Headless Service的名字0..N-1:為Pod所在的序號,從0開始到N-1
statefulSetName:為
StatefulSet的名字namespace:為服務所在的
namaspace,Headless Service和StatefulSet必須在相同的namespace.cluster.local:為
Cluster Domain
為什么要有headless?
在
Deployment中,每一個pod是沒有名稱,是隨機字串,是無序的,而statefulSet中是要求有序的,每一個Pod的名稱必須是固定的,當節點掛了,重建之后的識別符號是不變的,每一個節點的節點名稱是不會改變的,Pod名稱是作為Pod識別的唯一識別符號,必須保證其識別符號的穩定并且唯一,為了實作識別符號的穩定,這時候就需要一個
headless service決議直達到Pod,還需要給Pod配置一個唯一的名稱,
為什么要有volumeClainTemplate?
大部分有狀態副本集都會用到持久存盤,比如分布式系統來說,由于資料是不一樣的,每個節點都需要自己專用的存盤節點,而在
Deployment中Pod模板中創建的存盤卷是一個共享的存盤卷,多個Pod使用同一個存盤卷,而statefulSet定義中的每一個Pod都不能使用同一個存盤卷,由此基于Pod模板創建Pod是不適應的,這就需要引入volumeClainTemplate,當在使用StatefulSet創建Pod時,會自動生成一個PVC,從而請求系結一個PV,從而有自己專用的存盤卷,
Pod名稱、PVC和PV的關系圖如下:

StatefulSet定義
在創建
StatefulSet之前需要準備的東西,創建順序非常關鍵,如下1、Volume
2、Persistent Volume
3、Persistent Volume Clain
4、Service
5、StatefulSet
Volume可以有很多中型別,比如nfs、gluster等,下面使用nfs
statefulSet欄位說明:
[root@k8s-master ~]# kubectl explain statefulset KIND: StatefulSet VERSION: apps/v1 DESCRIPTION: StatefulSet represents a set of pods with consistent identities. Identities are defined as: - Network: A single stable DNS and hostname. - Storage: As many VolumeClaims as requested. The StatefulSet guarantees that a given network identity will always map to the same storage identity. FIELDS: apiVersion <string> kind <string> metadata <Object> spec <Object> status <Object> [root@k8s-master ~]# kubectl explain statefulset.spec podManagementPolicy <string> #Pod管理策略 replicas <integer> #Pod副本數量 revisionHistoryLimit <integer> #歷史版本限制 selector <Object> -required- #標簽選擇器,根據標簽選擇管理的Pod資源;必選欄位 serviceName <string> -required- #服務名稱,必選欄位 template <Object> -required- #模板,定義pod資源,必選欄位 updateStrategy <Object> #更新策略 volumeClaimTemplates <[]Object> #存盤卷申請模板,串列物件形式
示例,清單定義StatefulSet
通過上面的描述,下面示例定義StatefulSet資源,在定義之前首先得準備PV資源物件,這里同樣使用NFS作為后端存盤,
1)準備NFS(安裝軟體省略,參考)
(1)創建存盤卷對應的目錄 [root@storage ~]# mkdir /data/volumes/v{1..5} -p (2)修改nfs的組態檔 [root@storage ~]# vim /etc/exports /data/volumes/v1 192.168.1.0/24(rw,no_root_squash) /data/volumes/v2 192.168.1.0/24(rw,no_root_squash) /data/volumes/v3 192.168.1.0/24(rw,no_root_squash) /data/volumes/v4 192.168.1.0/24(rw,no_root_squash) /data/volumes/v5 192.168.1.0/24(rw,no_root_squash) (3)查看nfs的配置 [root@storage ~]# exportfs -arv exporting 192.168.1.0/24:/data/volumes/v5 exporting 192.168.1.0/24:/data/volumes/v4 exporting 192.168.1.0/24:/data/volumes/v3 exporting 192.168.1.0/24:/data/volumes/v2 exporting 192.168.1.0/24:/data/volumes/v1 (4)使配置生效 [root@storage ~]# showmount -e Export list for storage: /data/volumes/v5 192.168.1.0/24 /data/volumes/v4 192.168.1.0/24 /data/volumes/v3 192.168.1.0/24 /data/volumes/v2 192.168.1.0/24 /data/volumes/v1 192.168.1.0/24
2)創建PV;這里創建5個PV,存盤大小各不相等,是否可讀也不相同,這里新創建一個目錄用于存放statefulset所有的資源清單檔案等
[root@k8s-master ~]# mkdir statefulset && cd statefulset (1)撰寫創建pv的資源清單 [root@k8s-master statefulset]# vim pv-nfs.yaml apiVersion: v1 kind: PersistentVolume metadata: name: pv-nfs-001 labels: name: pv001 spec: nfs: path: /data/volumes/v1 server: 192.168.1.34 readOnly: false accessModes: ["ReadWriteOnce","ReadWriteMany"] capacity: storage: 5Gi persistentVolumeReclaimPolicy: Retain --- apiVersion: v1 kind: PersistentVolume metadata: name: pv-nfs-002 labels: name: pv002 spec: nfs: path: /data/volumes/v2 server: 192.168.1.34 readOnly: false accessModes: ["ReadWriteOnce"] capacity: storage: 5Gi persistentVolumeReclaimPolicy: Retain --- apiVersion: v1 kind: PersistentVolume metadata: name: pv-nfs-003 labels: name: pv003 spec: nfs: path: /data/volumes/v3 server: 192.168.1.34 readOnly: false accessModes: ["ReadWriteOnce","ReadWriteMany"] capacity: storage: 5Gi persistentVolumeReclaimPolicy: Retain --- apiVersion: v1 kind: PersistentVolume metadata: name: pv-nfs-004 labels: name: pv004 spec: nfs: path: /data/volumes/v4 server: 192.168.1.34 readOnly: false accessModes: ["ReadWriteOnce","ReadWriteMany"] capacity: storage: 5Gi persistentVolumeReclaimPolicy: Retain --- apiVersion: v1 kind: PersistentVolume metadata: name: pv-nfs-005 labels: name: pv005 spec: nfs: path: /data/volumes/v5 server: 192.168.1.34 readOnly: false accessModes: ["ReadWriteOnce","ReadWriteMany"] capacity: storage: 5Gi persistentVolumeReclaimPolicy: Retain (2)創建PV [root@k8s-master statefulset]# kubectl apply -f pv-nfs.yaml persistentvolume/pv-nfs-001 created persistentvolume/pv-nfs-002 created persistentvolume/pv-nfs-003 created persistentvolume/pv-nfs-004 created persistentvolume/pv-nfs-005 created (3)查看PV [root@k8s-master statefulset]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv-nfs-001 2Gi RWO,RWX Retain Available 3s pv-nfs-002 5Gi RWO Retain Available 3s pv-nfs-003 5Gi RWO,RWX Retain Available 3s pv-nfs-004 5Gi RWO,RWX Retain Available 3s pv-nfs-005 5Gi RWO,RWX Retain Available 3s
3)撰寫定義StatefulSet的資源清單,首先我們要定義一個Headless Service,這里headless Service和StatefulSet寫在一個檔案,
[root@k8s-master statefulset]# vim statefulset-demo.yaml #定義一個Headless Service apiVersion: v1 kind: Service metadata: name: nginx-svc labels: app: nginx-svc spec: ports: - name: http port: 80 clusterIP: None selector: app: nginx-pod --- #定義StatefulSet apiVersion: apps/v1 kind: StatefulSet metadata: name: nginx-statefulset spec: serviceName: nginx-svc #指定service,和上面定義的service對應 replicas: 5 #指定副本數量 selector: #指定標簽選擇器,和后面的pod的標簽對應 matchLabels: app: nginx-pod template: #定義后端Pod的模板 metadata: labels: app: nginx-pod spec: containers: - name: nginx image: nginx:1.12 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 volumeMounts: - name: nginxdata mountPath: /usr/share/nginx/html volumeClaimTemplates: #定義存盤卷申請模板 - metadata: name: nginxdata spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 5Gi #--- 決議上面的資源清單:由于StatefulSet資源依賴于一個事先存在的Service資源,所以需要先定義一個名為nginx-svc的Headless Service資源,用于關聯到每個Pod資源創建DNS資源記錄,接著定義了一個名為nginx-statefulset的StatefulSet資源,它通過Pod模板創建了5個Pod資源副本,并基于volumeClaiTemplate向前面創建的PV進行了請求大小為5Gi的專用存盤卷,
4)創建StatefulSet資源,這里打開另外一個視窗實時查看pod
[root@k8s-master statefulset]# kubectl apply -f statefulset-demo.yaml service/nginx-svc created statefulset.apps/nginx-statefulset created [root@k8s-master statefulset]# kubectl get svc #查看創建的無頭服務nginx-svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d19h nginx-svc ClusterIP None <none> 80/TCP 29s [root@k8s-master statefulset]# kubectl get pv #查看PV系結 NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv-nfs-001 2Gi RWO,RWX Retain Available 3m49s pv-nfs-002 5Gi RWO Retain Bound default/nginxdata-nginx-statefulset-0 3m49s pv-nfs-003 5Gi RWO,RWX Retain Bound default/nginxdata-nginx-statefulset-1 3m49s pv-nfs-004 5Gi RWO,RWX Retain Bound default/nginxdata-nginx-statefulset-2 3m49s pv-nfs-005 5Gi RWO,RWX Retain Available 3m48s [root@k8s-master statefulset]# kubectl get pvc #查看PVC系結 NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nginxdata-nginx-statefulset-0 Bound pv-nfs-002 5Gi RWO 21s nginxdata-nginx-statefulset-1 Bound pv-nfs-003 5Gi RWO,RWX 18s nginxdata-nginx-statefulset-2 Bound pv-nfs-004 5Gi RWO,RWX 15s [root@k8s-master statefulset]# kubectl get statefulset #查看StatefulSet NAME READY AGE nginx-statefulset 3/3 58s [root@k8s-master statefulset]# kubectl get pods #查看Pod資訊 NAME READY STATUS RESTARTS AGE nginx-statefulset-0 1/1 Running 0 78s nginx-statefulset-1 1/1 Running 0 75s nginx-statefulset-2 1/1 Running 0 72s [root@k8s-master ~]# kubectl get pods -w #動態查看pod創建程序,可以發現它是按照順序從0-(n-1)的順序創建 nginx-statefulset-0 0/1 Pending 0 0s nginx-statefulset-0 0/1 Pending 0 0s nginx-statefulset-0 0/1 Pending 0 1s nginx-statefulset-0 0/1 ContainerCreating 0 1s nginx-statefulset-0 1/1 Running 0 3s nginx-statefulset-1 0/1 Pending 0 0s nginx-statefulset-1 0/1 Pending 0 0s nginx-statefulset-1 0/1 Pending 0 1s nginx-statefulset-1 0/1 ContainerCreating 0 1s nginx-statefulset-1 1/1 Running 0 3s nginx-statefulset-2 0/1 Pending 0 0s nginx-statefulset-2 0/1 Pending 0 0s nginx-statefulset-2 0/1 Pending 0 2s nginx-statefulset-2 0/1 ContainerCreating 0 2s nginx-statefulset-2 1/1 Running 0 4s
5)洗掉測驗,同樣在另外一個視窗動態查看pod
[root@k8s-master statefulset]# kubectl delete -f statefulset-demo.yaml service "nginx-svc" deleted statefulset.apps "nginx-statefulset" deleted [root@k8s-master ~]# kubectl get pods -w #動態查看洗掉程序,可以也是按照順序洗掉,逆向關閉, NAME READY STATUS RESTARTS AGE nginx-statefulset-0 1/1 Running 0 18m nginx-statefulset-1 1/1 Running 0 18m nginx-statefulset-2 1/1 Running 0 18m nginx-statefulset-2 1/1 Terminating 0 18m nginx-statefulset-0 1/1 Terminating 0 18m nginx-statefulset-1 1/1 Terminating 0 18m nginx-statefulset-2 0/1 Terminating 0 18m nginx-statefulset-0 0/1 Terminating 0 18m nginx-statefulset-1 0/1 Terminating 0 18m nginx-statefulset-2 0/1 Terminating 0 18m nginx-statefulset-2 0/1 Terminating 0 18m nginx-statefulset-2 0/1 Terminating 0 18m nginx-statefulset-1 0/1 Terminating 0 18m nginx-statefulset-1 0/1 Terminating 0 18m nginx-statefulset-0 0/1 Terminating 0 18m nginx-statefulset-0 0/1 Terminating 0 18m 此時PVC依舊存在的,再重新創建pod時,依舊會重新去系結原來的PVC [root@k8s-master statefulset]# kubectl apply -f statefulset-demo.yaml service/nginx-svc created statefulset.apps/nginx-statefulset created [root@k8s-master statefulset]# kubectl get pvc #查看PVC系結 NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nginxdata-nginx-statefulset-0 Bound pv-nfs-002 5Gi RWO 30m nginxdata-nginx-statefulset-1 Bound pv-nfs-003 5Gi RWO,RWX 30m nginxdata-nginx-statefulset-2 Bound pv-nfs-004 5Gi RWO,RWX 30m
6)名稱決議,在創建的每一個Pod中,每一個Pod自己的名稱都是可以被決議的,如下:
[root@k8s-master statefulset]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-statefulset-0 1/1 Running 0 12m 10.244.2.96 k8s-node2 <none> <none> nginx-statefulset-1 1/1 Running 0 12m 10.244.1.96 k8s-node1 <none> <none> nginx-statefulset-2 1/1 Running 0 12m 10.244.2.97 k8s-node2 <none> <none> [root@k8s-master statefulset]# dig -t A nginx-statefulset-0.nginx-svc.default.svc.cluster.local @10.96.0.10 ...... ;; ANSWER SECTION: nginx-statefulset-0.nginx-svc.default.svc.cluster.local. 30 IN A 10.244.2.96 [root@k8s-master statefulset]# dig -t A nginx-statefulset-1.nginx-svc.default.svc.cluster.local @10.96.0.10 ...... ;; ANSWER SECTION: nginx-statefulset-1.nginx-svc.default.svc.cluster.local. 30 IN A 10.244.1.96 [root@k8s-master statefulset]# dig -t A nginx-statefulset-2.nginx-svc.default.svc.cluster.local @10.96.0.10 ...... ;; ANSWER SECTION: nginx-statefulset-2.nginx-svc.default.svc.cluster.local. 30 IN A 10.244.2.97 也可以進入到容器中進行決議,通過對Pod的名稱決議得到IP # pod_name.service_name.ns_name.svc.cluster.local eg: nginx-statefulset-0.nginx-svc.default.svc.cluster.local
StatefulSet資源擴縮容
StatefulSet資源的擴縮容與Deployment資源相似,即通過修改資源的副本數來改動其目標Pod資源數量,對StatefulSet資源來說,kubectl scale和kubectl patch命令均可以實作此功能,也可以使用kubectl edit命令直接修改其副本數,或者修改資源清單檔案,由kubectl apply命令重新宣告,
1)通過scale將nginx-statefulset資源副本數量擴容為4個
[root@k8s-master statefulset]# kubectl scale statefulset/nginx-statefulset --replicas=4 #擴容副本增加到4個 statefulset.apps/nginx-statefulset scaled [root@k8s-master statefulset]# kubectl get pods #查看pv資訊 NAME READY STATUS RESTARTS AGE nginx-statefulset-0 1/1 Running 0 16m nginx-statefulset-1 1/1 Running 0 16m nginx-statefulset-2 1/1 Running 0 16m nginx-statefulset-3 1/1 Running 0 3s [root@k8s-master statefulset]# kubectl get pv #查看pv系結 NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv-nfs-001 2Gi RWO,RWX Retain Available 21m pv-nfs-002 5Gi RWO Retain Bound default/nginxdata-nginx-statefulset-0 21m pv-nfs-003 5Gi RWO,RWX Retain Bound default/nginxdata-nginx-statefulset-1 21m pv-nfs-004 5Gi RWO,RWX Retain Bound default/nginxdata-nginx-statefulset-2 21m pv-nfs-005 5Gi RWO,RWX Retain Bound default/nginxdata-nginx-statefulset-3 21m
2)通過patch將nginx-statefulset資源副本數量縮容為3個
[root@k8s-master statefulset]# kubectl patch sts/nginx-statefulset -p '{"spec":{"replicas":2}}' #通過patch打補丁方式縮容 statefulset.apps/nginx-statefulset patched [root@k8s-master ~]# kubectl get pods -w #動態查看縮容程序 NAME READY STATUS RESTARTS AGE nginx-statefulset-0 1/1 Running 0 17m nginx-statefulset-1 1/1 Running 0 17m nginx-statefulset-2 1/1 Running 0 17m nginx-statefulset-3 1/1 Running 0 1m nginx-statefulset-3 1/1 Terminating 0 20s nginx-statefulset-3 0/1 Terminating 0 20s nginx-statefulset-3 0/1 Terminating 0 22s nginx-statefulset-3 0/1 Terminating 0 22s nginx-statefulset-2 1/1 Terminating 0 24s nginx-statefulset-2 0/1 Terminating 0 24s nginx-statefulset-2 0/1 Terminating 0 36s nginx-statefulset-2 0/1 Terminating 0 36s
更新策略
StatefulSet的默認更新策略為滾動更新,也可以暫停更新
滾動更新示例:
[root@k8s-master statefulset]# kubectl patch sts/nginx-statefulset -p '{"spec":{"replicas":4}}' #這里先將副本擴容到4個,方便測驗 [root@k8s-master ~]# kubectl set image statefulset nginx-statefulset nginx=nginx:1.14 #更新鏡像版本 statefulset.apps/nginx-statefulset image updated [root@k8s-master ~]# kubectl get pods -w #動態查看更新 NAME READY STATUS RESTARTS AGE nginx-statefulset-0 1/1 Running 0 18m nginx-statefulset-1 1/1 Running 0 18m nginx-statefulset-2 1/1 Running 0 13m nginx-statefulset-3 1/1 Running 0 13m nginx-statefulset-3 1/1 Terminating 0 13m nginx-statefulset-3 0/1 Terminating 0 13m nginx-statefulset-3 0/1 Terminating 0 13m nginx-statefulset-3 0/1 Terminating 0 13m nginx-statefulset-3 0/1 Pending 0 0s nginx-statefulset-3 0/1 Pending 0 0s nginx-statefulset-3 0/1 ContainerCreating 0 0s nginx-statefulset-3 1/1 Running 0 2s nginx-statefulset-2 1/1 Terminating 0 13m nginx-statefulset-2 0/1 Terminating 0 13m nginx-statefulset-2 0/1 Terminating 0 14m nginx-statefulset-2 0/1 Terminating 0 14m nginx-statefulset-2 0/1 Pending 0 0s nginx-statefulset-2 0/1 Pending 0 0s nginx-statefulset-2 0/1 ContainerCreating 0 0s nginx-statefulset-2 1/1 Running 0 1s nginx-statefulset-1 1/1 Terminating 0 18m nginx-statefulset-1 0/1 Terminating 0 18m nginx-statefulset-1 0/1 Terminating 0 18m nginx-statefulset-1 0/1 Terminating 0 18m nginx-statefulset-1 0/1 Pending 0 0s nginx-statefulset-1 0/1 Pending 0 0s nginx-statefulset-1 0/1 ContainerCreating 0 0s nginx-statefulset-1 1/1 Running 0 2s nginx-statefulset-0 1/1 Terminating 0 18m nginx-statefulset-0 0/1 Terminating 0 18m nginx-statefulset-0 0/1 Terminating 0 18m nginx-statefulset-0 0/1 Terminating 0 18m nginx-statefulset-0 0/1 Pending 0 0s nginx-statefulset-0 0/1 Pending 0 0s nginx-statefulset-0 0/1 ContainerCreating 0 0s nginx-statefulset-0 1/1 Running 0 2s [root@k8s-master statefulset]# kubectl get pods -l app=nginx-pod -o custom-columns=NAME:metadata.name,IMAGE:spec.containers[0].image #查看更新完成后的鏡像版本 NAME IMAGE nginx-statefulset-0 nginx:1.14 nginx-statefulset-1 nginx:1.14 nginx-statefulset-2 nginx:1.14 nginx-statefulset-3 nginx:1.14
通過上面示例可以看出,默認為滾動更新,倒序更新,更新完成一個接著更新下一個,
暫停更新示例
有時候設定了一個更新操作,但是又不希望一次性全部更新完成,想先更新幾個,觀察其是否穩定,然后再更新所有的,這時候只需要將
.spec.spec.updateStrategy.rollingUpdate.partition欄位的值進行修改即可,(默認值為0,所以我們看到了更新效果為上面那樣,全部更新),該欄位表示如果設定為2,那么只有當編號大于等于2的才會進行更新,類似于金絲雀的發布方式,示例如下:
[root@k8s-master ~]# kubectl patch sts/nginx-statefulset -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":2}}}}}' #將更新值partition設定為2 statefulset.apps/nginx-statefulset patched [root@k8s-master ~]# kubectl set image statefulset nginx-statefulset nginx=nginx:1.12 #更新鏡像版本 statefulset.apps/nginx-statefulset image updated [root@k8s-master ~]# kubectl get pods -w #動態查看更新 NAME READY STATUS RESTARTS AGE nginx-statefulset-0 1/1 Running 0 11m nginx-statefulset-1 1/1 Running 0 11m nginx-statefulset-2 1/1 Running 0 11m nginx-statefulset-3 1/1 Running 0 11m nginx-statefulset-3 1/1 Terminating 0 12m nginx-statefulset-3 0/1 Terminating 0 12m nginx-statefulset-3 0/1 Terminating 0 12m nginx-statefulset-3 0/1 Terminating 0 12m nginx-statefulset-3 0/1 Pending 0 0s nginx-statefulset-3 0/1 Pending 0 0s nginx-statefulset-3 0/1 ContainerCreating 0 0s nginx-statefulset-3 1/1 Running 0 2s nginx-statefulset-2 1/1 Terminating 0 11m nginx-statefulset-2 0/1 Terminating 0 11m nginx-statefulset-2 0/1 Terminating 0 12m nginx-statefulset-2 0/1 Terminating 0 12m nginx-statefulset-2 0/1 Pending 0 0s nginx-statefulset-2 0/1 Pending 0 0s nginx-statefulset-2 0/1 ContainerCreating 0 0s nginx-statefulset-2 1/1 Running 0 2s [root@k8s-master statefulset]# kubectl get pods -l app=nginx-pod -o custom-columns=NAME:metadata.name,IMAGE:spec.containers[0].image #查看更新完成后的鏡像版本,可以發現只有當編號大于等于2的進行了更新, NAME IMAGE nginx-statefulset-0 nginx:1.14 nginx-statefulset-1 nginx:1.14 nginx-statefulset-2 nginx:1.12 nginx-statefulset-3 nginx:1.12 將剩余的也全部更新,只需要將更新策略的partition的值改為0即可,如下: [root@k8s-master ~]# kubectl patch sts/nginx-statefulset -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":0}}}}}' #將更新值partition設定為0 statefulset.apps/nginx-statefulset patche [root@k8s-master ~]# kubectl get pods -w #動態查看更新 NAME READY STATUS RESTARTS AGE nginx-statefulset-0 1/1 Running 0 18m nginx-statefulset-1 1/1 Running 0 18m nginx-statefulset-2 1/1 Running 0 6m44s nginx-statefulset-3 1/1 Running 0 6m59s nginx-statefulset-1 1/1 Terminating 0 19m nginx-statefulset-1 0/1 Terminating 0 19m nginx-statefulset-1 0/1 Terminating 0 19m nginx-statefulset-1 0/1 Terminating 0 19m nginx-statefulset-1 0/1 Pending 0 0s nginx-statefulset-1 0/1 Pending 0 0s nginx-statefulset-1 0/1 ContainerCreating 0 0s nginx-statefulset-1 1/1 Running 0 2s nginx-statefulset-0 1/1 Terminating 0 19m nginx-statefulset-0 0/1 Terminating 0 19m nginx-statefulset-0 0/1 Terminating 0 19m nginx-statefulset-0 0/1 Terminating 0 19m nginx-statefulset-0 0/1 Pending 0 0s nginx-statefulset-0 0/1 Pending 0 0s nginx-statefulset-0 0/1 ContainerCreating 0 0s nginx-statefulset-0 1/1 Running 0 2s
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/55402.html
標籤:其他
