Openshift 指定节点配置镜像映射更新
摘要:本文介绍了一种通过MachineConfigPool(MCP)的paused功能精确控制OpenShift节点更新的方法。核心步骤包括:1)暂停无需变更的节点池;2)创建自定义MCP仅包含目标节点;3)应用镜像配置变更;4)触发目标池更新;5)验证变更效果;6)恢复集群正常状态。详细方案演示了如何通过标签隔离节点、创建专属MCP、应用镜像映射配置,并提供了更新监控和回滚方案。该方法实现了Op

你不能简单地“停止”MCO,但你可以利用 MachineConfigPool (MCP) 的 paused 功能,精确地控制哪个节点池进行更新,哪个节点池保持不变。
核心思路是:
- 暂停(Pause) 所有你不想变更的节点池(master, infra 和默认的 worker 池)。
- 创建(Create) 一个临时的、自定义的 MachineConfigPool,这个池只包含你想要更新的那部分 worker 节点。
- 应用(Apply) 你的镜像映射配置 (ImageContentSourcePolicy 或其他会触发 MachineConfig 变更的配置)。
- 触发(Trigger) 仅针对这个新的自定义池的更新。
- 验证(Verify) 变更在目标节点上生效。
- 恢复(Revert) 集群到正常状态,将节点移回原来的 worker 池,并解除所有池的暂停状态。
详细方案步骤
假设你有10个 worker 节点(worker-1 到 worker-10),你只想先在 worker-9 和 worker-10 上应用镜像映射更新。
第 1 步:准备工作 - 暂停现有池
为了防止任何意外的变更应用到 master, infra 或其他 worker 节点,我们首先暂停这些关键的池。
# 暂停 master 池
oc patch mcp master --type=merge -p '{"spec":{"paused":true}}'
# 暂停 infra 池 (如果存在)
oc patch mcp infra --type=merge -p '{"spec":{"paused":true}}'
# 暂停默认的 worker 池
oc patch mcp worker --type=merge -p '{"spec":{"paused":true}}'
验证:
oc get mcp
# 确保 master, infra, worker 池的 UPDATING 列为 False,并且它们不会响应新的变更。
第 2 步:隔离目标节点
我们需要一种方式来识别 worker-9 和 worker-10。最佳实践是使用一个自定义标签。
# 给目标节点打上特殊标签
oc label node worker-9 canary-update-group=true
oc label node worker-10 canary-update-group=true
第 3 步:创建自定义 MachineConfigPool
现在,创建一个新的 MCP,它通过我们刚刚添加的标签来选择节点。
创建一个名为 canary-worker-pool.yaml 的文件:
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfigPool
metadata:
name: worker-canary
spec:
machineConfigSelector:
matchLabels:
machineconfiguration.openshift.io/role: worker # 继承所有 worker 的基础配置
nodeSelector:
matchLabels:
canary-update-group: "true" # 只选择我们打了特殊标签的节点
解释:
- machineConfigSelector: 这很重要。它告诉这个新池应该关注哪些 MachineConfig 对象。通过继承 worker 的角色标签,它可以获取所有应用于普通 worker 的基础配置。
- nodeSelector: 这是关键。它告诉 MCO 这个池只管理带有 canary-update-group: “true” 标签的节点。一旦应用,worker-9 和 worker-10 将会自动从默认的 worker 池中脱离,并由 worker-canary 池管理。
应用这个文件:
oc apply -f canary-worker-pool.yaml
验证:
oc get mcp
# 你会看到一个新的名为 worker-canary 的池,它的 MACHINECOUNT 应该是 2。
# 同时,默认 worker 池的 MACHINECOUNT 会减少 2。
第 4 步:应用你的镜像映射变更
现在,你可以安全地应用你的 ImageContentSourcePolicy 或 ImageDigestMirrorSet 变更了。由于 master, infra, worker 池都已暂停,MCO 只会为活跃的 worker-canary 池生成新的 rendered-machineconfig。
例如,创建一个 mirror.yaml:
apiVersion: config.openshift.io/v1
kind: ImageContentSourcePolicy
metadata:
name: my-mirror-config
spec:
repositoryDigestMirrors:
- mirrors:
- my-registry.example.com/redhat/ubi8
source: registry.access.redhat.com/ubi8
# ... 其他配置
应用它:
oc apply -f mirror.yaml
MCO 将会检测到这个变更,并创建一个新的 rendered-worker-canary-xxxxx 配置。由于只有 worker-canary 池是活跃的,它会自动开始更新。
第 5 步:监控和验证
监控 worker-canary 池的更新过程:
watch oc get mcp worker-canary
你会看到 UPDATING 变为 True,然后 UPDATEDMACHINECOUNT 逐渐增加到 2。节点会逐一被 drain、重启和 uncordon。
更新完成后,你可以登录到其中一个节点进行验证:
# 进入节点的调试模式
oc debug node/worker-9
# 在调试 Pod 内部,查看配置文件是否已更新
sh-4.4# chroot /host
sh-4.4# cat /etc/containers/registries.conf
# 确认你的镜像映射配置已经写入
第 6 步:清理和恢复
当你验证成功并准备将此变更推广到所有节点,或者决定回滚时,需要执行清理步骤。
场景A:推广变更到所有节点
- 解除所有池的暂停状态: code Bashdownloadcontent_copyexpand_less
oc patch mcp worker --type=merge -p '{"spec":{"paused":false}}' oc patch mcp infra --type=merge -p '{"spec":{"paused":false}}' oc patch mcp master --type=merge -p '{"spec":{"paused":false}}'现在,MCO 会开始将其余所有节点更新到包含镜像映射的新配置。 - (可选)清理自定义池: 待所有节点更新完毕后,你可以将节点移回默认池并删除自定义池。 code Bashdownloadcontent_copyexpand_less
# 移除自定义标签 oc label node worker-9 canary-update-group- oc label node worker-10 canary-update-group- # 删除自定义池 oc delete mcp worker-canary节点会自动回归到 worker 池的管理之下。
场景B:回滚变更
- 删除镜像映射配置: code Bashdownloadcontent_copyexpand_less
oc delete -f mirror.yamlMCO 会再次为 worker-canary 池生成一个新的 rendered-config,这个配置将不包含镜像映射。worker-9 和 worker-10 会再次被更新(重启),恢复到变更前的状态。 - 清理自定义池: 待回滚完成后,执行与场景A中相同的清理步骤,将节点移回默认池。
- 解除所有池的暂停状态: code Bashdownloadcontent_copyexpand_less
oc patch mcp worker --type=merge -p '{"spec":{"paused":false}}' oc patch mcp infra --type=merge -p '{"spec":{"paused":false}}' oc patch mcp master --type=merge -p '{"spec":{"paused":false}}'
这个方案通过精细化控制 MachineConfigPool,实现了对集群变更的“金丝雀发布”,极大地提高了生产环境变更的安全性和可控性。
更多推荐



所有评论(0)