《OpenShift / RHEL / DevSecOps 汇总目录》
文本已在OpenShift 4.10环境中进行验证。
文章目录
当 OpenShift 集群中的节点出现无法访问的故障,集群会发生什么?
当 OpenShift 集群中的节点(例如下图中 worker-1 节点)出现“无法访问”类型的故障,集群不知道故障节点是宕机还是断网了。因为集群 Master 已经无法访问到 Worker-1 节点,因此无法向故障节点发送任何指令(比如停止 Pod 运行)。因此故障节点不会自动恢复,其上的 Pod 更不会自动停止,故障节点的资源也不会自动释放。在此时,那些运行在 Worker-1 节点上并通过 Deployment 运行的 Pod 可以在集群其他节点中得到重新调度并恢复运行。但通过 Statefulset 运行的 Pod 将不会在其它节点上被自动恢复。
为了恢复集群,通常管理员只能手动恢复故障节点。为了提高集群节点的可用性,同时简化运维,OpenShift 提供了“节点健康检查 Operator”和“毒丸Operator” 来实现自动化恢复故障节点。
以下对一个标准 OpenShift 集群(建议 worker 节点至少为 3 个)进行测试,验证“节点健康检查 Operator”和“毒丸Operator” 是如何在 OpenShift 集群在发生节点故障自动恢复。
OpenShift 节点健康检查 Operator 和毒丸 Opeartor 的作用
在 OpenShift 中提供了“节点健康检查 Operator 和“毒丸 Opeartor” 来自动恢复出故障的节点,以提高整个集群的可用性。
- 节点健康检查 Operator 负责持续判断运行节点是否运行正常。节点健康检查运行在每个节点上,它们检查自己是否能直接或间接(通过其他节点的监控检查)访问到 Master 的 API Server。如果任何方法都访问不到 Master 的 API Server,则认为自己所在节点已经不健康,此时会触发“毒丸 Opeartor” 恢复环境。
- 毒丸 Opeartor 负责对故障节点进行恢复,默认通过重启操作系统恢复环境。这是由于 OpenShift 底层的 RHCOS 被设计为具备 “牲畜-Cattle” 属性,因此很容易通过重启恢复环境。

对一般 OpenShift 集群进行节点故障测试
- 先进入一个 Worker 节点内部。
$ ERROR_WORKER_NODE=$(oc get node -l node-role.kubernetes.io/worker | awk '{print $1}' |sed -n '2p')
$ oc debug node/${ERROR_WORKER_NODE}
- 查看节点的网络设备状态,其中 “ens5” 是节点对外的访问网络。
# chroot /host
# nmcli dev status
DEVICE TYPE STATE CONNECTION
ens5 ethernet connected Wired connection 1
vxlan_sys_4789 vxlan disconnected --
veth0b8ee029 ethernet unmanaged --
veth324e698d ethernet unmanaged --
veth79750015 ethernet unmanaged --
vethc469e4e3 ethernet unmanaged --
lo loopback unmanaged --
br0 ovs-bridge unmanaged --
br0 ovs-interface unmanaged --
tun0 ovs-interface unmanaged --
br0 ovs-port unmanaged --
tun0 ovs-port unmanaged --
veth0b8ee029 ovs-port unmanaged --
veth324e698d ovs-port unmanaged --
veth79750015 ovs-port unmanaged --
vethc469e4e3 ovs-port unmanaged --
vxlan0 ovs-port unmanaged --
- 关闭该网络设备。
# nmcli dev disconnect ens5
- 确认 worker 节点不能自主恢复。
对有节点健康检查和毒丸的 OpenShift 集群进行节点故障测试
- 使用默认选项安装 “Node Health Check Operator”,安装过程会自动安装 “Poison Pill”。安装后可以查看这 2 个 Operator 自动创建的配置。

- 执行以下命令,持续观察一个 Worker 节点的运行状态。
$ ERROR_WORKER_NODE=$(oc get node -l node-role.kubernetes.io/worker | awk '{print $1}' |sed -n '2p')
$ oc get node ${ERROR_WORKER_NODE} -w
- 在一个新的窗口执行以下命令再次进入 Worker 节点内部。
$ oc debug node/${ERROR_WORKER_NODE}
- 再次进入 Worker 节点内部,然后查看该节点 Linux 上一次启动的时间。
# chroot /host
# who -b
- 关闭该节点的网络设备。
# nmcli dev disconnect ens5
- 在观察窗口中查看 worker 节点的运行状态,会从 ready 变为 notready,然后再次变为 ready 状态。
- 再次进入出现网路故障的worker节点,根据最近的启动时间确认刚刚被重启过。
$ oc debug node/${ERROR_WORKER_NODE}
# chroot /host
# who -b
这说明该worker节点的“健康检查Opeartor”检查到节点出问题了,并成功使用“毒丸 Opeartor”自动重启并恢复了该节点,因此OpenShift集群又恢复了正常。
版权声明:本文为weixin_43902588原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。