14.2.2.2. 为 OpenShift Container Platform 置备内核模块
根据 OpenShift Container Platform 集群首次引导时是否必须存在内核模块,您可以通过以下两种方式之一设置内核模块部署:
-
在集群安装时(day-1)置备内核模块:您可以通过一个
MachineConfig
创建内容,并通过包括一组清单文件来将其提供给openshift-install
。 - 通过 Machine Config Operator 置备内核模块(day-2):如果可以等到集群启动并运行后再添加内核模块,则可以通过 Machine Config Operator (MCO) 部署内核模块软件。
在这两种情况下,每个节点都需要在检测到新内核时可以获得内核软件包及相关软件包。您可以通过以下几种方法设置每个节点来获取该内容。
- 为每个节点提供 RHEL 权利。
-
从现有的 RHEL 主机获取 RHEL 权利。把
/etc/pki/entitlement
目录中的 RHEL 授权复制到与您在构建 Ignition 配置时提供的其他文件相同的位置。 -
在 Dockerfile 中,添加包括了内核和其他软件包的
yum
存储库。这必须包括新内核软件包,因为它们需要与新安装的内核相匹配。
14.2.2.2.1. 通过 MachineConfig
对象置备内核模块
通过将内核模块软件与 MachineConfig
对象一起打包,您可以在安装时或通过 Machine Config Operator 向 worker 或 master 节点发送该软件。
首先创建您要使用的基本 Ignition 配置。在安装时,Ignition 配置需要包含添加到集群中的 core
用户的 authorized_keys
文件中的 ssh 公钥 。如果在以后通过 MCO 添加 MachineConfig
,则不需要 SSH 公钥。对于这两种方式,simple-kmod 服务示例都会创建一个 systemd 单元文件,它需要一个 kmods-via-containers@simple-kmod.service
systemd 单元是 上游程序错误的一个临时解决方案。确保 kmods-via-containers@simple-kmod.service
在引导时启动:
注册 RHEL 8 系统:
# subscription-manager register
为 RHEL 8 系统添加订阅:
# subscription-manager attach --auto
安装构建软件所需的软件:
# yum install podman make git -y
创建 Ignition 配置文件以创建 systemd 单元文件:
创建用于托管 Ignition 配置文件的目录:
$ mkdir kmods; cd kmods
创建 Ignition 配置文件以创建 systemd 单元文件:
$ cat <<EOF > ./baseconfig.ign { "ignition": { "version": "3.1.0" }, "passwd": { "users": [ { "name": "core", "groups": ["sudo"], "sshAuthorizedKeys": [ "ssh-rsa AAAA" ] } ] }, "systemd": { "units": [{ "name": "require-kvc-simple-kmod.service", "enabled": true, "contents": "[Unit]\nRequires=kmods-via-containers@simple-kmod.service\n[Service]\nType=oneshot\nExecStart=/usr/bin/true\n\n[Install]\nWantedBy=multi-user.target" }] } } EOF
注意您必须将公共 SSH 密钥添加到
baseconfig.ign
文件中 ,以便openshift-install
使用该文件。如果使用 MCO 创建MachineConfig
对象,则不需要公共 SSH 密钥。
创建使用以下配置的基本 MCO YAML 片断:
$ cat <<EOF > mc-base.yaml apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 10-kvc-simple-kmod spec: config: EOF
注意Mc-base.yaml
设置为在worker
节点上部署内核模块 。要部署到 master 节点上,请将角色从worker
更改为master
。要进行这两个操作,您可以通过为不同类型的部署使用不同的文件名来重复整个过程。获得
kmods-via-containers
软件:克隆
kmod-via-containers
存储库:$ git clone https://github.com/kmods-via-containers/kmods-via-containers
克隆
kvc-simple-kmod
存储库:$ git clone https://github.com/kmods-via-containers/kvc-simple-kmod
-
获取您的模块软件。在这个示例中使用
kvc-simple-kmod
: 使用之前克隆的存储库,创建一个 fakeroot 目录,并将您要通过 Ignition 传递的文件放置到这个目录:
创建目录:
$ FAKEROOT=$(mktemp -d)
进入
kmod-via-containers
目录:$ cd kmods-via-containers
安装 KVC 框架实例:
$ make install DESTDIR=${FAKEROOT}/usr/local CONFDIR=${FAKEROOT}/etc/
进入
kvc-simple-kmod
目录:$ cd ../kvc-simple-kmod
创建实例:
$ make install DESTDIR=${FAKEROOT}/usr/local CONFDIR=${FAKEROOT}/etc/
获取名为
filetranspiler
的工具程序及相关的依赖软件:$ cd .. ; sudo yum install -y python3 git clone https://github.com/ashcrow/filetranspiler.git
生成最终机器配置 YAML(
mc.yaml
),其中包括基本 Ignition 配置、基础机器配置以及包括您要提供的文件的 fakeroot 目录:$ ./filetranspiler/filetranspile -i ./baseconfig.ign \ -f ${FAKEROOT} --format=yaml --dereference-symlinks \ | sed 's/^/ /' | (cat mc-base.yaml -) > 99-simple-kmod.yaml
如果集群还没有启用,生成清单文件并将该文件添加到
openshift
目录中。如果集群已在运行,按照以下方法应用该文件:$ oc create -f 99-simple-kmod.yaml
您的节点将启动
kmods-via-containers@simple-kmod.service
服务,并将载入内核模块。为了确认内核模块已加载,您可以登录到节点(使用
oc debug node/<openshift-node>
,然后运行chroot /host
)。要列出模块,请使用lsmod
命令:$ lsmod | grep simple_
输出示例
simple_procfs_kmod 16384 0 simple_kmod 16384 0