4.7. 使用树外模块替换树内模块


您可以使用内核模块管理(KMM)构建可按需载入或卸载到内核的内核模块。这些模块可以在不需要重启系统的情况下扩展内核的功能。模块可以配置为内置或动态加载。

动态加载的模块包括树内模块和树外(OOT)模块。in-tree 模块是 Linux 内核树的内部,即它们已经是内核的一部分。树外模块是 Linux 内核树的外部。它们通常是为开发和测试目的编写的,例如测试树级或处理不兼容的内核模块的新版本。

由 KMM 加载的一些模块可能会替换节点上已经载入的树内模块。要在载入模块前卸载树内模块,请将 .spec.moduleLoader.container.inTreeModulesToRemove 字段设置为您要卸载的模块。以下示例演示了所有内核映射的模块替换:

# ...
spec:
  moduleLoader:
    container:
      modprobe:
        moduleName: mod_a

      inTreeModulesToRemove: [mod_a, mod_b]
Copy to Clipboard Toggle word wrap

在本例中,moduleLoader pod 使用 inTreeModulesToRemovemoduleLoader 镜像加载 mod_a 前卸载 in-tree mod_amod_b。当 moduleLoader`pod 被终止,`mod_a 被卸载,则 mod_b 不会被再次加载。

以下是针对特定内核映射的模块替换示例:

# ...
spec:
  moduleLoader:
    container:
      kernelMappings:
        - literal: 6.0.15-300.fc37.x86_64
          containerImage: "some.registry/org/my-kmod:${KERNEL_FULL_VERSION}"
          inTreeModulesToRemove: [<module_name>, <module_name>]
Copy to Clipboard Toggle word wrap

4.7.1. 模块 CR 示例

以下是一个注解的 Module 示例:

apiVersion: kmm.sigs.x-k8s.io/v1beta1
kind: Module
metadata:
  name: <my_kmod>
spec:
  moduleLoader:
    container:
      modprobe:
        moduleName: <my_kmod> 
1

        dirName: /opt 
2

        firmwarePath: /firmware 
3

        parameters:  
4

          - param=1
      kernelMappings:  
5

        - literal: 6.0.15-300.fc37.x86_64
          containerImage: some.registry/org/my-kmod:6.0.15-300.fc37.x86_64
        - regexp: '^.+\fc37\.x86_64$' 
6

          containerImage: "some.other.registry/org/<my_kmod>:${KERNEL_FULL_VERSION}"
        - regexp: '^.+$' 
7

          containerImage: "some.registry/org/<my_kmod>:${KERNEL_FULL_VERSION}"  
8

          build:
            buildArgs:  
9

              - name: ARG_NAME
                value: <some_value>
            secrets:
              - name: <some_kubernetes_secret>  
10

            baseImageRegistryTLS: 
11

              insecure: false
              insecureSkipTLSVerify: false  
12

            dockerfileConfigMap:  
13

              name: <my_kmod_dockerfile>
          sign:
            certSecret:
              name: <cert_secret>  
14

            keySecret:
              name: <key_secret>  
15

            filesToSign:
              - /opt/lib/modules/${KERNEL_FULL_VERSION}/<my_kmod>.ko
          registryTLS: 
16

            insecure: false 
17

            insecureSkipTLSVerify: false
    serviceAccountName: <sa_module_loader>  
18

  devicePlugin:  
19

    container:
      image: some.registry/org/device-plugin:latest  
20

      env:
        - name: MY_DEVICE_PLUGIN_ENV_VAR
          value: SOME_VALUE
      volumeMounts:  
21

        - mountPath: /some/mountPath
          name: <device_plugin_volume>
    volumes:  
22

      - name: <device_plugin_volume>
        configMap:
          name: <some_configmap>
    serviceAccountName: <sa_device_plugin> 
23

  imageRepoSecret:  
24

    name: <secret_name>
  selector:
    node-role.kubernetes.io/worker: ""
Copy to Clipboard Toggle word wrap
1 1 1
必需。
2
可选。
3
可选:将此路径的内容复制到 kmm-operator-manager-config 配置映射的 worker.setFirmwareClassPath (预设置为 /var/lib/firmware)中指定的路径中。此操作在调用 modprobe 前进行,以插入内核模块。
4
可选。
5
至少需要一个内核项。
6
对于运行与正则表达式匹配的内核的每个节点,KMM 会检查是否包含标签或摘要。如果您在容器镜像中没有指定标签或摘要,则验证 Webhook 会返回错误,且不会应用模块。
7
对于任何其他内核,使用 my-kmod ConfigMap 中的 Dockerfile 构建镜像。
8
包含客户的 kmod 的容器镜像。此容器应包含 cp 二进制文件。
9
可选。
10
可选: some-kubernetes-secret 的值可以从位于 /run/secrets/some-kubernetes-secret 的构建环境中获取。
11
此字段无效。在 kmod 镜像中构建 kmod 镜像或签名 kmod 时,您可能需要从提供由不可信证书颁发机构 (CA) 签名的证书的 registry 中拉取基础镜像。要让 KMM 信任该 CA,还必须通过替换集群的 CA 捆绑包来信任新的 CA。

请参阅"附加资源"以了解如何替换集群的 CA 捆绑包。

12
可选:避免使用此参数。如果设置为 true,构建将在使用普通 HTTP 在 Dockerfile FROM 指令中拉取镜像时跳过任何 TLS 服务器证书验证。
13
必需。
14
必需:包含带有密钥"证书"的公钥的 secret。
15
必需:包含带有密钥"密钥"的私有 secureboot 密钥的 secret。
16
可选:避免使用此参数。如果设置为 true,则允许 KMM 检查容器镜像是否已使用普通 HTTP。
17
可选:避免使用此参数。如果设置为 true,KMM 会在检查容器镜像是否已存在时跳过任何 TLS 服务器证书验证。
18
可选。
19
可选。
20
必需:如果存在设备插件部分。
21
可选。
22
可选。
23
可选。
24
可选:用于拉取模块加载程序和设备插件镜像。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat