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


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

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

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

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

      inTreeModuleToRemove: mod_b
Copy to Clipboard Toggle word wrap

在本例中,moduleLoader pod 使用 inTreeModuleToRemove 在从 moduleLoader 镜像加载 mod_a 前卸载 in-tree mod_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:6.0.15-300.fc37.x86_64
          inTreeModuleToRemove: <module_name>
Copy to Clipboard Toggle word wrap

4.5.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}"
          build:
            buildArgs:  
8

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

            baseImageRegistryTLS: 
10

              insecure: false
              insecureSkipTLSVerify: false 
11

            dockerfileConfigMap:  
12

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

            keySecret:
              name: <key_secret>  
14

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

            insecure: false 
16

            insecureSkipTLSVerify: false
    serviceAccountName: <sa_module_loader>  
17

  devicePlugin:  
18

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

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

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

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

  imageRepoSecret:  
23

    name: <secret_name>
  selector:
    node-role.kubernetes.io/worker: ""
Copy to Clipboard Toggle word wrap
1 1 1
必需。
2
可选。
3
可选:在节点上将 /firmware/* 复制到 /var/lib/firmware/
4
可选。
5
至少需要一个内核项。
6
对于运行与正则表达式匹配的内核的每个节点,KMM 创建一个 DaemonSet 资源,运行 containerImage 中指定的镜像,使用 ${KERNEL_FULL_VERSION} 替换为内核版本。
7
对于任何其他内核,使用 my-kmod ConfigMap 中的 Dockerfile 构建镜像。
8
可选。
9
可选: some-kubernetes-secret 的值可以从位于 /run/secrets/some-kubernetes-secret 的构建环境中获取。
10
可选:避免使用此参数。如果设置为 true,则允许构建使用普通 HTTP 在 Dockerfile FROM 指令中拉取镜像。
11
可选:避免使用此参数。如果设置为 true,构建将在使用普通 HTTP 在 Dockerfile FROM 指令中拉取镜像时跳过任何 TLS 服务器证书验证。
12
必需。
13
必需:包含带有密钥"证书"的公钥的 secret。
14
必需:包含带有密钥"密钥"的私有 secureboot 密钥的 secret。
15
可选:避免使用此参数。如果设置为 true,则允许 KMM 检查容器镜像是否已使用普通 HTTP。
16
可选:避免使用此参数。如果设置为 true,KMM 会在检查容器镜像是否已存在时跳过任何 TLS 服务器证书验证。
17
可选。
18
可选。
19
必需:如果存在设备插件部分。
20
可选。
21
可选。
22
可选。
23
可选:用于拉取模块加载程序和设备插件镜像。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat