一、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