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 会运行护进程集作为命名空间的default
ServiceAccount
运行。Module
资源无法运行特权工作负载,除非您手动启用它以使用privileged
SCC。
-
如果在 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}" ]
$ oc adm policy add-scc-to-user privileged -z "${serviceAccountName}" [ -n "${namespace}" ]
4.3.2.2. Pod 安全标准 复制链接链接已复制到粘贴板!
OpenShift 运行一个同步机制,它根据使用的安全上下文自动设置命名空间 Pod 安全级别。不需要操作。
4.3.3. 模块 CR 示例 复制链接链接已复制到粘贴板!
以下是一个注解的 Module
示例:
- 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 在 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
- 可选:用于拉取模块加载程序和设备插件镜像。