K8S脉络整理(011)-Rolling Update、回滚rollout revision

滚动更新是一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新。滚动更新的最大的好处是零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性。

实践

下面我们部署三副本应用,初始镜像为 httpd:2.2.31,然后将其更新到 httpd:2.2.32。

httpd:2.2.31 的配置文件如下:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: httpd
spec:
  replicas: 3
  template:
    metadata:
      labels:
        run: httpd
    spec:
      containers:
      - name: httpd
        image: httpd:2.2.31
        ports:
        - containerPort: 80

 

通过 kubectl apply 部署。

daweij@master:~/stady01/httpd$ kubectl apply -f httpd2.2.31.yml 
deployment "httpd" created

daweij@master:~/stady01/httpd$ kubectl get deployment httpd -o wide
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS   IMAGES         SELECTOR
httpd     3         3         3            0           20s       httpd        httpd:2.2.31   run=httpd
daweij@master:~/stady01/httpd$ 
daweij@master:~/stady01/httpd$ kubectl get replicaset -o wide
NAME                             DESIRED   CURRENT   READY     AGE       CONTAINERS            IMAGES                                       SELECTOR
httpd-784688cccb                 3         3         0         45s       httpd                 httpd:2.2.31                                 pod-template-hash=3402447776,run=httpd

daweij@master:~/stady01/httpd$ kubectl get pod
NAME                                   READY     STATUS             RESTARTS   AGE
httpd-784688cccb-6vxt7                 0/1       ImagePullBackOff   0          51s
httpd-784688cccb-9bjlg                 0/1       ImagePullBackOff   0          51s
httpd-784688cccb-lm4vv                 0/1       ImagePullBackOff   0          51s

 

部署过程如下:

  1. 创建 Deployment httpd
  2. 创建 ReplicaSet httpd-784688cccb
  3. 创建三个 Pod
  4. 当前镜像为 httpd:2.2.31

将配置文件中 httpd:2.2.31 替换为 httpd:2.2.32,再次执行 kubectl apply

daweij@master:~/stady01/httpd$ kubectl get deployment httpd -o wide
NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE       CONTAINERS   IMAGES         SELECTOR
httpd     3         4         1            0           7m        httpd        httpd:2.2.32   run=httpd
daweij@master:~/stady01/httpd$
daweij@master:~/stady01/httpd$ kubectl get replicaset -o wide
NAME                             DESIRED   CURRENT   READY     AGE       CONTAINERS            IMAGES                                       SELECTOR
httpd-5cf5884d6f                 1         1         0         51s       httpd                 httpd:2.2.32                                 pod-template-hash=1791440829,run=httpd
httpd-784688cccb                 3         3         0         7m        httpd                 httpd:2.2.31                                 pod-template-hash=3402447776,run=httpd

 

我们发现了如下变化:

  1. Deployment httpd 的镜像更新为 httpd:2.2.32
  2. 新创建了 ReplicaSet  ,镜像为 httpd:2.2.32,并且管理了三个新的 Pod。
  3. 之前的 ReplicaSet  里面已经没有任何 Pod。

结论是:ReplicaSet httpd-784688cccb 的三个 httpd:2.2.31 Pod 已经被 ReplicaSet httpd-5cf5884d6f 的三个 httpd:2.2.32 Pod 替换了。

具体过程可以通过 kubectl describe deployment httpd 查看。

每次只更新替换一个 Pod:

  1. ReplicaSet httpd-新 增加一个 Pod,总数为 1。
  2. ReplicaSet httpd-旧 减少一个 Pod,总数为 2。
  3. ReplicaSet httpd-新 增加一个 Pod,总数为 2。
  4. ReplicaSet httpd-旧 减少一个 Pod,总数为 1。
  5. ReplicaSet httpd-新 增加一个 Pod,总数为 3。
  6. ReplicaSet httpd-旧 减少一个 Pod,总数为 0。

每次替换的 Pod 数量是可以定制的。Kubernetes 提供了两个参数 maxSurge和 maxUnavailable 来精细控制 Pod 的替换数量,我们将在后面结合 Health Check 特性一起讨论。


kubectl apply 每次更新应用时 Kubernetes 都会记录下当前的配置,保存为一个 revision(版次),这样就可以回滚到某个特定 revision。

默认配置下,Kubernetes 只会保留最近的几个 revision,可以在 Deployment 配置文件中通过 revisionHistoryLimit 属性增加 revision 数量

下面实践回滚功能。

应用有如下三个配置文件 httpd.v1.ymlhttpd.v2.yml和 httpd.v3.yml,分别对应不同的 httpd 镜像 2.4.162.4.17 和 2.4.18

711.png

712.png

713.png

通过 kubectl apply 部署并更新应用:

kubectl apply -f httpd.v1.yml --record

714.png

--record 的作用是将当前命令记录到 revision 记录中,这样我们就可以知道每个 revison 对应的是哪个配置文件。

通过 kubectl rollout history deployment httpd 查看 revison 历史记录

715.png

CHANGE-CAUSE 就是 --record 的结果。

如果要回滚到某个版本,比如 revision 1,可以执行命令 kubectl rollout undo deployment httpd --to-revision=1

716.png

此时,revison 历史记录也会发生相应变化。

717.png

revison 1 变成了 revison 4。

不过我们可以通过 CHANGE-CAUSE 知道每个 revison 的具体含义。

所以一定要在执行 kubectl apply 时加上 --record 参数

滚动更新我们就讨论到这里,下一节开始学习 k8s 的 Health Check 功能。

 

posted @ 2018-03-21 17:18  Cslc-DaweiJ  阅读(544)  评论(0)    收藏  举报