|NO.Z.00142|——————————|CloudNative|——|KuberNetes&资源调度.V12|——|statefulset.v04|更新.V01|RollingUpdate|

一、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更新成功

 
 
 
 
 
 
 
 
 

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
                                                                                                                                                   ——W.S.Landor

 

 

posted on 2022-03-30 11:57  yanqi_vip  阅读(46)  评论(0)    收藏  举报

导航