如何强制触发 OpenShift 节点的 MachineConfig 更新
文章目录
- 1. 为什么需要强制更新 MachineConfig?
- 2. 操作步骤
- 2.1 查找当前最新的 MachineConfig 配置
- 2.2 获取目标节点当前与期望的配置
- 2.3 在节点上标记强制更新
- 2.4 手动 patch 节点 currentConfig 注解
- 2.5 观察更新状态
- 2.5.1 查看 MCP 状态:
- 2.5.2 查看控制器日志:
- 2.5.3 检查所有节点当前与期望配置对比:
- 3. 总结
在 OpenShift 的日常运维中,我们常常依赖 Machine Config Operator (MCO) 来管理节点配置。当某些配置变更未能生效,或节点配置陷入不一致状态时,有时需要 手动强制触发节点应用最新的 MachineConfig。
本文将介绍一种通过在节点上创建标志文件并手动 patch 节点注解的方式,强制节点进行 MachineConfig 的重新部署和重启,确保节点最终状态符合预期。
1. 为什么需要强制更新 MachineConfig?
通常情况下,当我们更改 MachineConfig(MC)或 MachineConfigPool(MCP)中的配置后,MCO 会自动生成一份新的 rendered-xxxx
配置,并将其下发到节点,触发重启。然而,如果:
- 某个节点未正确应用最新配置;
- 节点长时间卡在
Updating
状态; - 配置修改未引发自动重启;
- 我们在测试 MachineConfig 生效性;
此时,强制将节点从旧版本切换到最新版本配置是一种有效手段。
2. 操作步骤
以下操作在 OpenShift 4.x 集群环境中验证通过,假设我们需要强制更新 worker 节点 worker1
。
2.1 查找当前最新的 MachineConfig 配置
使用如下命令列出所有 rendered-worker
配置,并从中选择最新创建时间的版本(最短时间的通常是最新的):
oc get mc | grep rendered-worker
例如输出如下:
rendered-worker-e64cd562a020c07aaca26a9fca6ac610 ... 3h2m <------ 最新
你也可以通过 ClusterOperator 查看当前所有 Worker 节点所处的配置版本:
oc describe co/machine-config | grep -A 2 Extension
输出示例:
Extension:Master: all 3 nodes are at latest configuration rendered-master-xxxxxxWorker: all 6 nodes are at latest configuration rendered-worker-e64cd562a020c07aaca26a9fca6ac610
2.2 获取目标节点当前与期望的配置
执行如下命令查看节点当前的配置(currentConfig
)与集群期望的配置(desiredConfig
):
oc get node worker1 -o jsonpath='{.metadata.annotations.machineconfiguration\.openshift\.io/currentConfig}{"\n"}'
oc get node worker1 -o jsonpath='{.metadata.annotations.machineconfiguration\.openshift\.io/desiredConfig}{"\n"}'
假设:
- currentConfig:
rendered-worker-884b7aff53dede5392127506e4f461ad
(旧) - desiredConfig:
rendered-worker-e64cd562a020c07aaca26a9fca6ac610
(新)
2.3 在节点上标记强制更新
执行 debug 命令进入节点,并创建 MCD 强制标志文件:
oc debug node/worker1 -- touch /host/run/machine-config-daemon-force
这会通知 machine-config-daemon
(MCD)强制重新应用配置。
2.4 手动 patch 节点 currentConfig 注解
然后我们 patch 节点的 currentConfig,让其匹配最新的 desiredConfig,以引发强制重启:
oc patch node worker1 --patch '{ "metadata": { "annotations": { "machineconfiguration.openshift.io/currentConfig": "rendered-worker-e64cd562a020c07aaca26a9fca6ac610" } } }'
这一步是关键操作,通过将当前配置标记为“已应用”最新版本,结合强制标志,MCD 将识别为需要实际执行更新并重启节点。
2.5 观察更新状态
更新完成通常需要几分钟,可以用以下命令实时监控:
2.5.1 查看 MCP 状态:
oc get mcp
观察 worker MCP 是否进入 Updating=True
状态,更新完成后为 Updated=True
。
2.5.2 查看控制器日志:
oc logs -l k8s-app=machine-config-controller -n openshift-machine-config-operator
2.5.3 检查所有节点当前与期望配置对比:
for i in $(oc get nodes | awk '{print $1}' | grep -v NAME); doecho $ioc get node/$i -o yaml | grep -Ei "currentConfig|desiredConfig"
done
3. 总结
这种方式提供了一个优雅的手段,在不直接修改 MachineConfig 内容的情况下,让节点重新应用配置,常用于:
- 修复更新卡顿;
- 测试配置生效;
- 恢复部分节点的一致性。
不过建议仅在确认配置内容没有问题时使用,避免对生产环境带来潜在风险。操作前可先在非关键节点或测试环境中验证。
如你有更多 MachineConfig 或 OpenShift 自动化需求,欢迎留言交流!