4.3. 内核模块部署
对于每个 Module 资源,内核模块管理 (KMM) 可以创建多个 DaemonSet 资源:
-
集群中运行的每个兼容内核版本有一个 ModuleLoader
DaemonSet。 -
一个设备插件
DaemonSet(如果已配置)。
模块加载守护进程设置资源运行 ModuleLoader 镜像来加载内核模块。模块加载程序镜像是一个 OCI 镜像,其中包含 .ko 文件和 modprobe 和 sleep 二进制文件。
创建模块加载程序 pod 时,pod 会运行 modprobe 将指定的模块插入到内核中。然后,它会进入睡眠状态,直到终止为止。发生这种情况时,ExecPreStop hook 将运行 modprobe -r 来卸载内核模块。
如果在 Module 资源中配置了 .spec.devicePlugin 属性,KMM 会在集群中创建 设备插件 守护进程。该守护进程集目标:
-
与
Module资源的.spec.selector匹配的节点。 -
加载内核模块的节点(模块加载程序 pod 处于
Ready条件)。
4.3.1. 模块自定义资源定义
Module 自定义资源定义 (CRD) 代表可通过模块加载程序镜像在所有或选择集群中载入的内核模块。Module 自定义资源 (CR) 指定一个或多个兼容它的内核版本,以及一个节点选择器。
Module 资源的兼容版本列在 .spec.moduleLoader.container.kernelMappings 下。内核映射可以与 literal 版本匹配,也可以使用 regexp 同时匹配其中的许多版本。
Module 资源的协调循环运行以下命令:
-
列出与
.spec.selector匹配的所有节点。 - 构建在这些节点上运行的所有内核版本。
对于每个内核版本:
-
进入
.spec.moduleLoader.container.kernelMappings,并找到适当的容器镜像名称。如果内核映射定义了build或sign,且容器镜像尚不存在,请根据需要运行构建、签名作业或两者。 - 使用上一步中确定的容器镜像创建模块加载程序守护进程集。
-
如果定义了
.spec.devicePlugin,请使用.spec.devicePlugin.container中指定的配置创建一个设备插件守护进程集。
-
进入
在以下运行
garbage-collect:- 针对于集群中的任何节点都没有运行的内核版本的现有守护进程集。
- 成功的构建作业。
- 成功签名作业。
4.3.2. 安全和权限
加载内核模块是一个高度敏感的操作。加载后,内核模块具有在节点上执行任何类型的操作的所有可能权限。
4.3.2.1. ServiceAccounts 和 SecurityContextConstraints
内核模块管理 (KMM) 创建一个特权工作负载,以在节点上加载内核模块。该工作负载需要 ServiceAccounts 被允许来使用 privileged SecurityContextConstraint (SCC) 资源。
该工作负载的授权模型取决于 Module 资源的命名空间及其 spec。
-
如果设置了
.spec.moduleLoader.serviceAccountName或.spec.devicePlugin.serviceAccountName字段,则始终使用它们。 如果没有设置这些字段,则:
-
如果在 Operator 命名空间中创建了
Module资源(默认为openshift-kmm),则 KMM 使用它的默认的、功能强大的ServiceAccount来运行守护进程集。 -
如果在任何其他命名空间中创建了
Module资源,则 KMM 会运行护进程集作为命名空间的defaultServiceAccount运行。Module资源无法运行特权工作负载,除非您手动启用它以使用privilegedSCC。
-
如果在 Operator 命名空间中创建了
openshift-kmm 是一个可信命名空间。
在设置 RBAC 权限时,请记住在 openshift-kmm 命名空间中创建 Module 资源的任何用户或 ServiceAccount 都会导致 KMM 在集群中的任何节点上运行特权工作负载。
要允许任何 ServiceAccount 使用 privileged SCC,因此要运行模块加载程序或设备插件 pod,请使用以下命令:
$ oc adm policy add-scc-to-user privileged -z "${serviceAccountName}" [ -n "${namespace}" ]4.3.2.2. Pod 安全标准
OpenShift 运行一个同步机制,它根据使用的安全上下文自动设置命名空间 Pod 安全级别。不需要操作。
其他资源
4.3.3. 模块 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-kmodConfigMap 中的 Dockerfile 构建镜像。 - 8
- 可选。
- 9
- 可选:
some-kubernetes-secret的值可以从位于/run/secrets/some-kubernetes-secret的构建环境中获取。 - 10
- 可选:避免使用此参数。如果设置为
true,则允许构建使用普通 HTTP 在 DockerfileFROM指令中拉取镜像。 - 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
- 可选:用于拉取模块加载程序和设备插件镜像。