在这里插入图片描述

你不能简单地“停止”MCO,但你可以利用 MachineConfigPool (MCP) 的 paused 功能,精确地控制哪个节点池进行更新,哪个节点池保持不变。

核心思路是:

  1. 暂停(Pause) 所有你不想变更的节点池(master, infra 和默认的 worker 池)。
  2. 创建(Create) 一个临时的、自定义的 MachineConfigPool,这个池只包含你想要更新的那部分 worker 节点。
  3. 应用(Apply) 你的镜像映射配置 (ImageContentSourcePolicy 或其他会触发 MachineConfig 变更的配置)。
  4. 触发(Trigger) 仅针对这个新的自定义池的更新。
  5. 验证(Verify) 变更在目标节点上生效。
  6. 恢复(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:推广变更到所有节点

  1. 解除所有池的暂停状态: 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 会开始将其余所有节点更新到包含镜像映射的新配置。
  2. (可选)清理自定义池: 待所有节点更新完毕后,你可以将节点移回默认池并删除自定义池。 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:回滚变更

  1. 删除镜像映射配置: code Bashdownloadcontent_copyexpand_less oc delete -f mirror.yaml MCO 会再次为 worker-canary 池生成一个新的 rendered-config,这个配置将不包含镜像映射。worker-9 和 worker-10 会再次被更新(重启),恢复到变更前的状态。
  2. 清理自定义池: 待回滚完成后,执行与场景A中相同的清理步骤,将节点移回默认池。
  3. 解除所有池的暂停状态: 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,实现了对集群变更的“金丝雀发布”,极大地提高了生产环境变更的安全性和可控性。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐