2.3. preflight 验证内核模块管理 (KMM) 模块
在应用 KMM 模块的集群中执行升级前,您需要在集群升级和可能的内核升级后验证使用 KMM 安装的内核模块是否可以在节点上安装。preflight 会尝试并行验证集群中载入的每个模块
。在启动一个模块
的验证前,preflight 并不会等待一个模块
的验证过程完成。
2.3.1. 启动验证
preflight 验证通过在集群中创建 PreflightValidationOCP
资源来触发。此 spec 包含两个字段:
releaseImage
- 必需的字段,为集群升级到的 OpenShift Container Platform 版本提供发行镜像名称。
pushBuiltImage
-
如果为
true
,则构建期间创建的镜像和签名验证将被推送到其存储库。此字段默认为false
。
2.3.2. 验证生命周期
preflight 验证会尝试验证集群中载入的每个模块。在验证成功后,preflight 会停止在 Module
资源上运行验证。如果模块验证失败,您可以更改模块定义,并在下一个循环中再次验证模块。
如果要为附加内核运行 Preflight 验证,则应该为该内核创建另一个 PreflightValidationOCP
资源。验证所有模块后,建议删除 PreflightValidationOCP
资源。
2.3.3. 验证状态
PreflightValidationOCP
资源报告集群中尝试或试图在 .status.modules
列表中验证的每个模块的状态和进度。该列表的元素包含以下字段:
lastTransitionTime
-
Module
资源状态从一个状态转换到另一个状态最后一次的时间。这应该是底层状态改变的时间。如果为未知,则使用 API 字段更改的时间是可以接受的。 名称
-
Module
资源的名称。 namespace
-
Module
资源的命名空间。 statusReason
- 有关状态的动词说明。
verificationStage
描述正在执行的验证阶段:
-
image
: 镜像存在验证 -
build
: 构建进程验证 -
sign
: 签发进程验证
-
verificationStatus
模块验证的状态:
-
true
:已验证 -
false
:验证失败 -
error
: 验证过程错误 -
unknown
: 验证尚未启动
-
2.3.4. 每个模块的 preflight 验证阶段
preflight 在集群中的每个 KMM 模块上运行以下验证:
- 镜像验证阶段
- 构建验证阶段
- 签名验证阶段
2.3.4.1. 镜像验证阶段
镜像验证始终是要执行的 preflight 验证的第一个阶段。如果镜像验证成功,则不会在该特定模块上运行其他验证。
镜像验证由两个阶段组成:
- 镜像存在和可访问性。代码会尝试访问为模块中升级的内核定义的镜像,并获取其清单。
-
验证在正确的路径中存在
模块
中定义的内核模块,以备将来modprobe
执行。如果这个验证成功,这可能意味着内核模块是使用正确的 Linux 标头编译的。正确的路径为<dirname>/lib/modules/<upgraded_kernel>/
。
2.3.4.2. 构建验证阶段
只有在镜像验证失败,且在与升级的内核相关的模块
中有一个 build
部分时,才会执行构建验证。构建验证尝试运行构建作业,并验证它是否已成功完成。
在运行 depmod
时必须指定内核版本,如下所示:
$ RUN depmod -b /opt ${KERNEL_VERSION}
如果在 PreflightValidationOCP
自定义资源(CR) 中定义 PushBuiltImage
标志,它将尝试将生成的镜像推送到其存储库中。生成的镜像名称取自 Module
CR 的 containerImage
字段的定义。
如果为升级的内核定义了 sign
部分,则生成的镜像不是 Module
CR 的 containerImage
字段,而是临时镜像名称,因为生成的镜像应该是 Sign 流的产品。
2.3.4.3. 签名验证阶段
只有在镜像验证失败时,才会执行签名验证。Module
资源中有一个与升级内核相关的 sign
部分,并在与升级的内核相关的 Module
中存在 build
部分时成功完成构建部分。签名验证将尝试运行签名作业,并验证它是否已成功完成。
如果在 PreflightValidationOCP
CR 中定义 PushBuiltImage
标志,则签名验证也将尝试将生成的镜像推送到其 registry。生成的镜像始终是 Module
的 ContainerImage
字段中定义的镜像。输入镜像是 Build 阶段的输出,也可以是 UnsignedImage
字段中定义的镜像。
如果存在 build
部分,则 sign
部分输入镜像是 build
部分的输出镜像。因此,为了使输入镜像可用于 sign
部分,必须在 PreflightValidationOCP
CR 中定义 PushBuiltImage
标志。
2.3.5. PreflightValidationOCP 资源示例
本节演示了 YAML 格式的 PreflightValidationOCP
资源示例。
这个示例根据 OpenShift Container Platform 版本 4.11.18 中包含的即将推出的内核版本验证当前存在的模块,以下发行镜像指向:
quay.io/openshift-release-dev/ocp-release@sha256:22e149142517dfccb47be828f012659b1ccf71d26620e6f62468c264a7ce7863
由于 .spec.pushBuiltImage
设置为 true
,KMM 会将生成的 Build/Sign 镜像推送到定义的存储库中。
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