3. 交付前环境冻结

环境冻结是验收交付前最关键的一道“闸门”。它的目标不是把集群锁死不动,而是把当前可交付状态固化成一份可复现、可审计、可回退的基线:集群版本、节点配置、网络插件、存储类与 Operator 版本必须彼此匹配,且所有变更在冻结窗口内停止。冻结之后,任何改动都要走变更审批,否则验收结论将失去意义。

一、冻结对象与一致性维度

冻结不是单一动作,而是对五类对象的联合约束。它们之间存在明确的依赖关系:集群版本决定可用的 API 与 Operator 兼容矩阵;节点配置决定 kubelet、容器运行时与内核参数;网络插件版本必须与集群版本匹配;存储类依赖 CSI 驱动与后端存储版本;Operator 则依赖前四者提供的运行时与存储能力。任何一项单独升级都可能打破一致性。

因此,冻结前必须完成一次“横向对齐”:以集群版本为基准,逐项核对节点、网络、存储与 Operator 的版本区间。例如,OpenShift 4.14 对应 OVN-Kubernetes 的特定版本、CSI 驱动的最低版本,以及各 Operator 的订阅通道。若某 Operator 仍停留在旧通道,即使集群版本已达标,也不能视为一致。

环境冻结一致性检查与冻结流程 基准:集群版本(如 OCP 4.14.x) 决定 API、兼容矩阵与升级路径 节点配置 kubelet / CRI-O / 内核参数 MachineConfig 一致性 网络插件 OVN-Kubernetes / SDN CNI 版本与 MTU 存储类 CSI 驱动 / StorageClass 后端存储版本 Operator 版本 订阅通道 / CSV 依赖 API 与权限 一致性检查:版本区间比对 + 依赖关系验证 不通过 → 记录偏差并回退到对齐版本;通过 → 进入冻结 冻结动作 停止自动升级 · 锁定 MachineConfig · 固定 Operator 订阅通道 · 记录基线快照 生成冻结清单并归档,作为验收比对依据 冻结后变更控制 任何改动需审批 + 重新一致性检查 冻结窗口 建议 3–5 天 覆盖验收全周期 基线快照 版本 + 配置 + 镜像 可回退依据

二、一致性检查的实际操作

检查应从集群版本开始。使用 oc get clusterversion 确认当前版本与目标版本一致,并记录 status.desired.version 与 status.history 中的最近一次升级时间。若集群仍处于升级中或存在 Updating 状态,必须等待其完成后再冻结。

# 查看集群版本与升级状态
oc get clusterversion version -o jsonpath='{.status.desired.version}{"\n"}'
oc get clusterversion version -o jsonpath='{.status.conditions[?(@.type=="Progressing")].status}{"\n"}'

# 查看节点配置一致性
oc get machineconfigpool
oc describe machineconfigpool worker | grep -A5 "Updated"

# 查看网络插件类型与版本
oc get network.operator cluster -o jsonpath='{.spec.defaultNetwork.type}{"\n"}'
oc get csv -n openshift-ovn-kubernetes

# 查看存储类与 CSI 驱动
oc get storageclass
oc get csv -n openshift-cluster-csi-drivers

# 查看 Operator 订阅与版本
oc get subscriptions -A -o custom-columns=NS:.metadata.namespace,NAME:.metadata.name,CHANNEL:.spec.channel,CURRENT:.status.currentCSV

节点配置检查的重点是 MachineConfigPool 是否全部处于 Updated=True 且 Degraded=False。若某个节点池仍在滚动更新,说明配置尚未收敛,此时冻结会导致节点间配置漂移。网络插件方面,需确认 defaultNetwork.type 与集群版本匹配,并检查 OVN-Kubernetes 的 CSV 版本是否在支持区间内。存储类则要核对每个 StorageClass 的 provisioner 是否对应已安装的 CSI 驱动,且驱动 CSV 版本与集群版本兼容。

Operator 检查最容易遗漏。除了查看订阅通道,还要确认 status.currentCSV 与 status.installedCSV 一致,避免出现“已安装但未生效”的中间态。对于依赖特定 API 的 Operator,还需检查其 CRD 是否已随集群版本更新。

三、冻结流程与基线固化

一致性检查通过后,进入冻结执行阶段。冻结的核心动作包括四项:停止自动升级、锁定 MachineConfig、固定 Operator 订阅通道、生成基线快照。

停止自动升级可通过将 ClusterVersion 的 spec.channel 固定为当前通道,并设置 spec.desiredUpdate 为空来实现。更稳妥的做法是使用 oc adm upgrade --clear 清除待升级目标,并确认 Progressing 为 False。锁定 MachineConfig 则是确保没有新的 MachineConfigPool 变更被触发,可通过暂停 MachineConfigOperator 的滚动更新来实现,但需注意这会影响后续节点维护,因此冻结窗口应尽量短。

Operator 订阅通道固定后,应记录每个订阅的 channel、currentCSV 与 installedCSV。若使用 Operator Lifecycle Manager 的自动升级策略,需将其改为手动批准,防止冻结期间意外升级。

基线快照建议包含以下内容:集群版本与节点版本、所有 MachineConfigPool 状态、网络插件 CSV、StorageClass 列表与 CSI 驱动版本、所有 Operator 订阅与 CSV 版本、关键命名空间的资源配额与 LimitRange。快照以 YAML 或 JSON 形式归档,并计算校验和,作为验收比对依据。

冻结窗口建议覆盖验收测试全周期,通常为 3–5 天。窗口内如需紧急修复,必须走变更审批,并在修复后重新执行一致性检查,更新基线快照。

四、冻结后的变更控制与回退

冻结不是终点,而是变更控制的起点。冻结后任何改动——包括节点扩容、Operator 升级、存储类参数调整——都必须经过审批,并重新执行一致性检查。若检查不通过,应回退到冻结基线。回退的依据正是基线快照:通过比对当前状态与快照,可以快速定位偏差项,并决定是修复还是回滚。

实际交付中,建议将冻结清单作为验收报告附件,逐项签字确认。清单应包含检查项、期望值、实际值、偏差说明与处理结论。这样,验收方可以清晰看到环境在冻结时刻的真实状态,而不是依赖口头承诺。

冻结期间禁止执行 oc adm upgrade、修改 MachineConfig、变更 Operator 订阅通道。若必须操作,应先解除冻结、执行变更、重新检查、再重新冻结,并记录变更原因与影响范围。

最后,冻结流程应与交付文档同步。将基线快照、冻结清单、变更审批记录一并归档,形成可追溯的交付证据链。这样,即使交付后出现版本不一致问题,也能快速回溯到冻结时刻的状态,判断是冻结前遗留还是冻结后引入。