对 DaemonSet 执行回滚
本页面展示了如何在 DaemonSet 上执行回滚操作。
开始之前
你需要拥有一个 Kubernetes 集群,并且配置 kubectl 命令行工具与集群通信。建议你在至少包含两个非控制平面主机节点的集群上运行本教程。如果你还没有集群,可以使用 minikube 创建一个,或者使用这些 Kubernetes 演练场之一。
你的 Kubernetes 服务器版本必须是 1.7 或更高。要检查版本,请输入 kubectl version
。
你应该已经知道如何在 DaemonSet 上执行滚动更新。
在 DaemonSet 上执行回滚
步骤 1:找到你想要回滚到的 DaemonSet 修订版本
如果你只想回滚到上一个修订版本,可以跳过此步骤。
列出 DaemonSet 的所有修订版本
kubectl rollout history daemonset <daemonset-name>
这将返回 DaemonSet 修订版本的列表
daemonsets "<daemonset-name>"
REVISION CHANGE-CAUSE
1 ...
2 ...
...
- Change cause (变更原因) 会在创建时从 DaemonSet 的注解
kubernetes.io/change-cause
复制到其修订版本中。你可以在kubectl
中指定--record=true
选项,以便在变更原因注解中记录执行的命令。
要查看特定修订版本的详情
kubectl rollout history daemonset <daemonset-name> --revision=1
这将返回该修订版本的详情
daemonsets "<daemonset-name>" with revision #1
Pod Template:
Labels: foo=bar
Containers:
app:
Image: ...
Port: ...
Environment: ...
Mounts: ...
Volumes: ...
步骤 2:回滚到特定修订版本
# Specify the revision number you get from Step 1 in --to-revision
kubectl rollout undo daemonset <daemonset-name> --to-revision=<revision>
如果成功,该命令将返回
daemonset "<daemonset-name>" rolled back
注意
如果未指定--to-revision
标志,kubectl 会选择最近的修订版本。步骤 3:查看 DaemonSet 回滚的进度
kubectl rollout undo daemonset
命令告诉服务器开始回滚 DaemonSet。实际的回滚是在集群的 控制平面 内部异步完成的。
要查看回滚的进度
kubectl rollout status ds/<daemonset-name>
回滚完成后,输出类似于
daemonset "<daemonset-name>" successfully rolled out
理解 DaemonSet 修订版本
在前面的 kubectl rollout history
步骤中,你获得了一个 DaemonSet 修订版本列表。每个修订版本都存储在一个名为 ControllerRevision 的资源中。
要查看每个修订版本中存储了什么,请查找 DaemonSet 修订版本的原始资源
kubectl get controllerrevision -l <daemonset-selector-key>=<daemonset-selector-value>
这将返回 ControllerRevisions 的列表
NAME CONTROLLER REVISION AGE
<daemonset-name>-<revision-hash> DaemonSet/<daemonset-name> 1 1h
<daemonset-name>-<revision-hash> DaemonSet/<daemonset-name> 2 1h
每个 ControllerRevision 都存储了 DaemonSet 修订版本的注解和模板。
kubectl rollout undo
命令会选取特定的 ControllerRevision,并将 DaemonSet 模板替换为该 ControllerRevision 中存储的模板。kubectl rollout undo
等同于通过其他命令(例如 kubectl edit
或 kubectl apply
)将 DaemonSet 模板更新到之前的修订版本。
注意
DaemonSet 修订版本只向前滚动。也就是说,回滚完成后,被回滚到的 ControllerRevision 的修订版本号(.revision
字段)将前进。例如,如果你的系统中存在修订版本 1 和 2,并且从修订版本 2 回滚到修订版本 1,那么 .revision: 1
的 ControllerRevision 将变成 .revision: 3
。排障
- 请参阅DaemonSet 滚动更新排障。