×

在对应用了 KMM 模块的集群执行升级之前,必须验证使用 KMM 安装的内核模块是否能够在集群升级和可能的内核升级后安装到节点上。预检尝试并行验证集群中加载的每个Module。预检不会等待一个Module的验证完成,然后再开始另一个Module的验证。

验证启动

预检验证是通过在集群中创建PreflightValidationOCP资源触发的。此规范包含两个字段

releaseImage

必填字段,提供集群升级到的 OpenShift Container Platform 版本的发布镜像名称。

pushBuiltImage

如果为true,则在构建和签名验证期间创建的镜像将推送到其存储库。此字段默认为false

验证生命周期

预检验证尝试验证集群中加载的每个模块。预检在验证成功后停止对Module资源运行验证。如果模块验证失败,您可以更改模块定义,预检将在下一个循环中再次尝试验证模块。

如果要为其他内核运行预检验证,则应为该内核创建另一个PreflightValidationOCP资源。所有模块都经过验证后,建议删除PreflightValidationOCP资源。

验证状态

PreflightValidationOCP资源在其.status.modules列表中报告它尝试或已尝试验证的集群中每个模块的状态和进度。该列表的元素包含以下字段

lastTransitionTime

Module资源状态从一种状态转换到另一种状态的最后时间。这应该是底层状态发生变化的时候。如果不知道这一点,则可以使用 API 字段更改的时间。

name

Module 资源的名称。

命名空间

Module 资源的命名空间。

statusReason

关于状态的文字说明。

verificationStage

描述正在执行的验证阶段

  • image:镜像存在性验证

  • build:构建过程验证

  • sign:签名过程验证

verificationStatus

Module 验证的状态

  • true:已验证

  • false:验证失败

  • error:验证过程中出错

  • unknown:验证尚未开始

每个Module的预检验证阶段

预检对集群中存在的每个KMM Module运行以下验证

  1. 镜像验证阶段

  2. 构建验证阶段

  3. 签名验证阶段

镜像验证阶段

镜像验证始终是预检验证的第一个执行阶段。如果镜像验证成功,则不会对该特定模块运行其他验证。

镜像验证包括两个阶段

  1. 镜像存在性和可访问性。代码尝试访问模块中为升级内核定义的镜像并获取其清单。

  2. 验证Module中定义的内核模块是否存在于正确的路径中,以便将来执行modprobe。如果此验证成功,则可能意味着内核模块是用正确的Linux头文件编译的。正确的路径是<dirname>/lib/modules/<upgraded_kernel>/

构建验证阶段

仅当镜像验证失败且Module中存在与升级内核相关的build部分时,才会执行构建验证。构建验证尝试运行构建作业并验证其是否成功完成。

运行depmod时必须指定内核版本,如下所示

$ RUN depmod -b /opt ${KERNEL_VERSION}

如果在PreflightValidationOCP自定义资源 (CR) 中定义了PushBuiltImage标志,它还会尝试将生成的镜像推送到其存储库。生成的镜像名称取自Module CR 的containerImage字段的定义。

如果为升级的内核定义了sign部分,则生成的镜像将不是Module CR 的containerImage字段,而是一个临时镜像名称,因为生成的镜像应该是签名流程的产物。

签名验证阶段

仅当镜像验证失败时才执行签名验证。Module资源中存在与升级内核相关的sign部分,并且如果Module中存在与升级内核相关的build部分,则构建验证成功完成。签名验证尝试运行签名作业并验证其是否成功完成。

如果在PreflightValidationOCP CR 中定义了PushBuiltImage标志,签名验证还会尝试将生成的镜像推送到其注册表。生成的镜像始终是ModuleContainerImage字段中定义的镜像。输入镜像要么是构建阶段的输出,要么是UnsignedImage字段中定义的镜像。

如果存在build部分,则sign部分的输入镜像是build部分的输出镜像。因此,为了使输入镜像可用于sign部分,必须在PreflightValidationOCP CR 中定义PushBuiltImage标志。

PreflightValidationOCP 资源示例

本节显示了YAML格式的PreflightValidationOCP资源示例。

此示例针对包含在OpenShift Container Platform 4.11.18版本中的即将发布的内核版本验证所有当前存在的模块,以下发行版镜像指向该版本

quay.io/openshift-release-dev/ocp-release@sha256:22e149142517dfccb47be828f012659b1ccf71d26620e6f62468c264a7ce7863

因为.spec.pushBuiltImage设置为true,所以KMM会将构建/签名的结果镜像推送到定义的存储库。

apiVersion: kmm.sigs.x-k8s.io/v1beta2
kind: PreflightValidationOCP
metadata:
  name: preflight
spec:
  releaseImage: quay.io/openshift-release-dev/ocp-release@sha256:22e149142517dfccb47be828f012659b1ccf71d26620e6f62468c264a7ce7863
  pushBuiltImage: true