一、DaemonSet更新策略

如果添加了新节点或修改了节点标签(Label),DaemonSet 将立刻向新匹配上的节点添加 Pod,同时删除不能匹配的节点上的 Pod。

在 Kubernetes 1.6 以后的版本中,可以在 DaemonSet 上执行滚动更新,未来的 Kubernetes 版 本将支持节点的可控更新。

1.1 OnDelete 策略

以下进行举例说明:

1.定义一个yaml文件,修改image以及On Delete 策略

$ vim nginx-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  updateStrategy:
    type: OnDelete
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.15.12
        name: nginx

2.创建一个DaemonSet

$ k create -f nginx-ds.yaml

3.查看所有Pod的镜像

$ k get po -l app=nginx -oyaml | grep image:
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12

4.修改镜像nginx:1.15.12为registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2

$ vim nginx-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  updateStrategy:
    type: OnDelete
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
        name: nginx

5.更新DaemonSet

$ k replace -f nginx-ds.yaml
daemonset.apps/nginx replaced

6.查看查看所有Pod的镜像,观察到未更新

$ k get po -l app=nginx -oyaml | grep image:
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12

7.删除nginx-7r8xq

$ k get po -l app=nginx
NAME          READY   STATUS    RESTARTS   AGE
nginx-7r8xq   1/1     Running   0          5m2s
nginx-8nf7k   1/1     Running   0          5m2s
nginx-ntvzk   1/1     Running   0          5m2s
nginx-qzrkc   1/1     Running   0          5m2s
nginx-vf4ch   1/1     Running   0          5m2s

$ k delete po nginx-vf4ch
pod "nginx-vf4ch" deleted

8.再次查看删除pod镜像,观察到nginx-vf4ch已更新镜像

$ k get po -l app=nginx -oyaml | grep image:
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12
    - image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
      image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2

1.2 RollingUpdate 策略

RollingUpdate(滚动更新)更新策略会自动更新一个 DaemonSet 中所有的 Pod,采用与序号 索引相反的顺序进行滚动更新。

以下进行举例说明:

1.定义一个yaml文件,修改image以及RollingUpdate 策略

$ vim nginx-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.15.12
        name: nginx

2.创建一个DaemonSet

$ k create -f nginx-ds.yaml

3.查看所有Pod的镜像

$ k get po -l app=nginx -oyaml | grep image:
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12
    - image: nginx:1.15.12
      image: docker.io/library/nginx:1.15.12

4.修改镜像nginx:1.15.12为registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2

$ vim nginx-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
        name: nginx

5.更新DaemonSet

$ k replace -f nginx-ds.yaml
daemonset.apps/nginx replaced

6.查看所有Pod的镜像,观察到所有Pod更新

$ k get po -l app=nginx -oyaml | grep image:
    - image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
      image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
    - image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
      image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
    - image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
      image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
    - image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
      image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
    - image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
      image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
    - image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
      image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
    - image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
      image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
    - image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
      image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2

二、回滚DaemonSet

当更新版本后出现不稳定或配置不合理时,可以对其进行回滚操作。默认情况下,DaemonSet 的所有上线记录都保留在系统中,以便可以随时回滚 (你可以通过修改修订历史记录限制来更改这一约束)。当我们进行回滚时,既可以回滚到上一个版本,也可以回滚到指定版本。

假设我们又进行了几次更新 ,此处以更新镜像版本触发更新(更改配置效果类似):

$ k set image daemonset nginx nginx=nginx:1.9.1 --record
$ k set image daemonset nginx nginx=nginx:1.16.1 --record

2.1 回滚到上一个版本

1.查看更新历史,此时镜像版本为1.16.1

$ k rollout history ds nginx
daemonset.apps/nginx
REVISION  CHANGE-CAUSE
1         <none>
10        <none>
11        kubectl set image daemonset nginx nginx=nginx:1.9.1 --record=true
12        kubectl set image daemonset nginx nginx=nginx:1.16.1 --record=true

说明:这里实践证明DaemonSet 更新历史会被覆盖,而Deployment则不会

2.查看 DaemonSet 某次更新的详细信息,使用--revision 指定某次更新版本号

$ k rollout history daemonset nginx --revision=12
daemonset.apps/nginx with revision #12
Pod Template:
  Labels:   app=nginx
  Containers:
   nginx:
    Image:  nginx:1.16.1
    Port:   <none>
    Host Port:  <none>
    Environment:    <none>
    Mounts: <none>
  Volumes:  <none>

3.回滚到上一个稳定版本

$ k rollout undo daemonset nginx
daemonset.apps/nginx rolled back

4.再次查看更新历史,此时镜像版本为1.9.1

$ k rollout history daemonset nginx
daemonset.apps/nginx
REVISION  CHANGE-CAUSE
1         <none>
10        <none>
12        kubectl set image daemonset nginx nginx=nginx:1.16.1 --record=true
13        kubectl set image daemonset nginx nginx=nginx:1.9.1 --record=true

5.查看回滚副本

$ k get controllerrevision
NAME               CONTROLLER             REVISION   AGE
nginx-556dd4f789   daemonset.apps/nginx   10         79m
nginx-59d4f6646f   daemonset.apps/nginx   12         70m
nginx-66895c6456   daemonset.apps/nginx   1          80m
nginx-7886496b9c   daemonset.apps/nginx   13         19m

2.2 回滚到指定版本

1.查看更新历史,此时镜像版本为1.16.1

$ k rollout history ds nginx
daemonset.apps/nginx
REVISION  CHANGE-CAUSE
1         <none>
10        <none>
11        kubectl set image daemonset nginx nginx=nginx:1.9.1 --record=true
12        kubectl set image daemonset nginx nginx=nginx:1.16.1 --record=true

2.查看 daemonset 某次更新的详细信息,使用--revision 指定某次更新版本号

$ k rollout history daemonset nginx --revision=12
daemonset.apps/nginx with revision #12
Pod Template:
  Labels:   app=nginx
  Containers:
   nginx:
    Image:  nginx:1.16.1
    Port:   <none>
    Host Port:  <none>
    Environment:    <none>
    Mounts: <none>
  Volumes:  <none>

3.回滚到指定稳定版本1.9.1,使用--to-revision 参数

$ k rollout undo deployment nginx-deployment --to-revision=11
deployment.apps/nginx-deployment rolled back

4.再次查看更新历史,此时镜像版本为1.9.1

$ k rollout history daemonset nginx
daemonset.apps/nginx
REVISION  CHANGE-CAUSE
1         <none>
10        <none>
12        kubectl set image daemonset nginx nginx=nginx:1.16.1 --record=true
13        kubectl set image daemonset nginx nginx=nginx:1.9.1 --record=true

5.查看回滚副本

$ k get controllerrevision
NAME               CONTROLLER             REVISION   AGE
nginx-556dd4f789   daemonset.apps/nginx   10         79m
nginx-59d4f6646f   daemonset.apps/nginx   12         70m
nginx-66895c6456   daemonset.apps/nginx   1          80m
nginx-7886496b9c   daemonset.apps/nginx   13         19m