《OpenShift / RHEL / DevSecOps 汇总目录》
文本已在OpenShift 4.15 环境中进行验证。
注意:本文中提到的 Poison Pill Operator 目前已经改名为 Self Node Remediation Operator。
文章目录
当 OpenShift 集群中的节点出现无法访问的故障,集群会发生什么?
当 OpenShift 集群中的节点(例如下图中 worker-1 节点)出现“无法访问”类型的故障,集群不知道故障节点是宕机还是断网了。因为集群 Master 已经无法访问到 Worker-1 节点,因此无法向故障节点发送任何指令(比如停止 Pod 运行)。因此故障节点不会自动恢复,其上的 Pod 更不会自动停止,故障节点的资源也不会自动释放。在此时,那些运行在 Worker-1 节点上并通过 Deployment 运行的 Pod 可以在集群其他节点中得到重新调度并恢复运行。但通过 Statefulset 运行的 Pod 将不会在其它节点上被自动恢复。
为了恢复集群,通常管理员只能手动恢复故障节点。为了提高集群节点的可用性,同时简化运维,OpenShift 提供了 Node Health Check Operator 和 Self Node Remediation Operator 来实现自动化恢复故障节点。
以下对一个标准 OpenShift 集群(建议 worker 节点至少为 3 个)进行测试,验证 Node Health Check Operator 和 Self Node Remediation Operator 是如何在 OpenShift 集群在发生节点故障自动恢复。
OpenShift 节点健康检查 Operator 和毒丸 Opeartor 的作用
在 OpenShift 中提供了 Node Health Check Operator 和 Self Node Remediation Opeartor 来自动恢复出故障的节点,以提高整个集群的可用性。
- Node Health Check Operator 负责持续判断运行节点是否运行正常。节点健康检查运行在每个节点上,它们检查自己是否能直接或间接(通过其他节点的监控检查)访问到 Master 的 API Server。如果任何方法都访问不到 Master 的 API Server,则认为自己所在节点已经不健康,此时会触发“Self Node Remediation Operator” 恢复环境。
- Self Node Remediation Operator 负责对故障节点进行恢复,默认通过重启操作系统恢复环境。这是由于 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 集群进行节点故障测试
- 使用默认选项安装由 Red Hat 提供的 Node Health Check Operator。安装过程还会自动安装 Self Node Remediation Operator,安装后可以查看这 2 个 Operator 自动创建的配置。
- 在 Self Node Remediation Operator 中已有 self-node-remediation-automatic-strategy-template 模板。
- 安装完后会在 “计算” 菜单中增加 NodeHealthChecks。通过它创建以下 NodeHealthCheck 对象。
apiVersion: remediation.medik8s.io/v1alpha1
kind: NodeHealthCheck
metadata:
name: nodehealthcheck-automatic
spec:
minHealthy: 51%
remediationTemplate:
apiVersion: self-node-remediation.medik8s.io/v1alpha1
name: self-node-remediation-automatic-strategy-template
namespace: openshift-workload-availability
kind: SelfNodeRemediationTemplate
selector:
matchExpressions:
- key: node-role.kubernetes.io/worker
operator: Exists
unhealthyConditions:
- duration: 300s
type: Ready
status: 'False'
- duration: 300s
type: Ready
status: Unknown
- 执行以下命令,持续观察排在第一个的 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 节点的系统内部。
$ ERROR_WORKER_NODE=$(oc get node -l node-role.kubernetes.io/worker | awk '{print $1}' | sed -n '2p')
$ oc debug node/${ERROR_WORKER_NODE}
- 然后查看该节点 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 节点的 Node Health Check Operator 检查到节点出问题了,并成功使用 Self Node Remediation Operator 自动重启并恢复了该节点,因此 OpenShift 集群又恢复了正常。