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]
在本例中,moduleLoader
pod 使用 inTreeModulesToRemove
在 moduleLoader
镜像加载 mod_a
前卸载 in-tree mod_a
和 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:${KERNEL_FULL_VERSION}" inTreeModulesToRemove: [<module_name>, <module_name>]
其他资源
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}" 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: ""
- 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
- 此字段无效。在 kmod 镜像中构建 kmod 镜像或签名 kmod 时,您可能需要从提供由不可信证书颁发机构 (CA) 签名的证书的 registry 中拉取基础镜像。要让 KMM 信任该 CA,还必须通过替换集群的 CA 捆绑包来信任新的 CA。
请参阅"附加资源"以了解如何替换集群的 CA 捆绑包。
- 11
- 可选:避免使用此参数。如果设置为
true
,构建将在使用普通 HTTP 在 DockerfileFROM
指令中拉取镜像时跳过任何 TLS 服务器证书验证。 - 12
- 必需。
- 13
- 必需:包含带有密钥"证书"的公钥的 secret。
- 14
- 必需:包含带有密钥"密钥"的私有 secureboot 密钥的 secret。
- 15
- 可选:避免使用此参数。如果设置为
true
,则允许 KMM 检查容器镜像是否已使用普通 HTTP。 - 16
- 可选:避免使用此参数。如果设置为
true
,KMM 会在检查容器镜像是否已存在时跳过任何 TLS 服务器证书验证。 - 17
- 可选。
- 18
- 可选。
- 19
- 必需:如果存在设备插件部分。
- 20
- 可选。
- 21
- 可选。
- 22
- 可选。
- 23
- 可选:用于拉取模块加载程序和设备插件镜像。
其他资源