一、StatefulSet更新策略
### --- 查看StatefulSet资源文件
[root@k8s-master01 ~]# kubectl get sts web -o yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
creationTimestamp: "2021-04-19T06:24:33Z"
generation: 1
manager: kube-controller-manager
operation: Update
time: "2021-04-19T06:25:18Z"
name: web
namespace: default
resourceVersion: "32795"
uid: 1f9db18a-bcb3-4ae4-8aba-90417aa10540
spec:
podManagementPolicy: OrderedReady
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
serviceName: nginx
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.15.2
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
name: web
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate
status:
collisionCount: 0
currentReplicas: 2
currentRevision: web-6949d64dc8
observedGeneration: 1
readyReplicas: 2
replicas: 2
updateRevision: web-6949d64dc8
updatedReplicas: 2
### --- StatefulSet和Deployment一样,也是选择了几种更新方式
~~~ 在使用StatefulSet的时候我们启动了5个副本,而把这个partition设置为3,
~~~ 它就会更新大于3的这个pod,不大于3的他就不更新。
~~~ 所以说可以利用这个机制来实现简单的分段更新发布。
~~~ 可以看到他现在更新方式RollingUpdate,也就是滚动更新。
~~~ 之前创建的时候是没有指定更新方式的,也就是说他默认的更新方式是RollingUpdate
[root@k8s-master01 ~]# kubectl get sts web -o yaml
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate
二、StatefulSet更新策略一:RollingUpdate
### --- 准备StatefulSet需要的配置资源
~~~ # 使用RollingUpdate策略去更新容器
~~~ StatefulSet和Deployment更新方式是不一样的,Deployment是随机去更新的,而它呢
~~~ 查看一下RollingUpdate是怎么样更新的:是从下往上更新的,从最后一个Pod向上更新
~~~ # 扩容StatefulSet容器副本数量为3
[root@k8s-master01 ~]# kubectl scale --replicas=3 sts web
statefulset.apps/web scaled
~~~ # 查看所有的pod状态
~~~ 它会先更新web-2,若是在更新web-2的时候,web-0宕机,
~~~ 它会先等待web-0完全启动之后,再去更新web-1,继续向下更新
[root@k8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 7m13s
web-1 1/1 Running 0 6m45s
web-2 1/1 Running 0 30s
### --- 更改镜像版本,触发容器
~~~ # 更改镜像版本
[root@k8s-master01 ~]# kubectl edit sts web
spec:
containers:
- image: nginx:1.15.3
~~~ # 在更新的时候删除web-0,查看更新过程
[root@k8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 31s
web-1 1/1 Running 0 48s
web-2 1/1 Terminating 0 90s // web-2已经在更新了
[root@k8s-master01 ~]# kubectl delete po web-0 // web-2更新的时候删除掉web-0
pod "web-0" deleted
[root@k8s-master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
web-0 0/1 ContainerCreating 0 2s // web-0被删除
web-1 1/1 Running 0 59s
web-2 0/1 Terminating 0 101s // web-2更新完成之后会重启启动web-0,web-0启动完成之后才会去继续更新web-1
### --- 查看StatefulSet更新流程
[root@k8s-master01 ~]# kubectl get po -l app=nginx -w
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 3m53s
web-1 1/1 Running 0 3m20s
web-2 1/1 Running 0 3m33s
web-2 1/1 Terminating 0 4m7s // 从web-2开始更新
web-0 1/1 Terminating 0 4m30s // 在更新web-2的过程中web-0宕机,它会暂停web-2的更新,去启动web-0,web-0启动之后继续之前的web-2更新
web-0 0/1 Pending 0 0s
web-0 0/1 ContainerCreating 0 1s
web-0 1/1 Running 0 3s // web-0启动
web-2 0/1 Terminating 0 5m // 继续web-2的更新
web-2 0/1 Pending 0 1s
web-2 0/1 ContainerCreating 0 1s
web-2 1/1 Running 0 3s // web-2更新成功
web-1 1/1 Terminating 0 4m50s
web-1 0/1 Pending 0 0s
web-1 0/1 ContainerCreating 0 0s
web-1 1/1 Running 0 2s // web-1更新成功