-
对于 x86 镜像,命令如下:
$ oc adm release info quay.io/openshift-release-dev/ocp-release:4.17.z-x86_64 --image-for=driver-toolkit
-
对于 ARM 镜像,命令如下:
$ oc adm release info quay.io/openshift-release-dev/ocp-release:4.17.z-aarch64 --image-for=driver-toolkit
了解驱动程序工具包以及如何将其用作驱动程序容器的基础镜像,以在 OpenShift Container Platform 部署中启用特殊的软件和硬件设备。
驱动程序工具包是 OpenShift Container Platform 有效负载中的一个容器镜像,用作基础镜像,您可以在其上构建驱动程序容器。驱动程序工具包镜像包含通常作为依赖项所需的内核包,以构建或安装内核模块,以及驱动程序容器中需要的一些工具。这些包的版本将与在相应的 OpenShift Container Platform 版本中运行的 Red Hat Enterprise Linux CoreOS (RHCOS) 节点上的内核版本匹配。
驱动程序容器是用于在 RHCOS 等容器操作系统上构建和部署树外内核模块和驱动程序的容器镜像。内核模块和驱动程序是在操作系统内核中以高级别权限运行的软件库。它们扩展内核功能或提供控制新设备所需的特定于硬件的代码。例如,硬件设备(如现场可编程门阵列 (FPGA) 或 GPU)和软件定义存储 (SDS) 解决方案(如 Lustre 并行文件系统)都需要客户端机器上的内核模块。驱动程序容器是用于在 Kubernetes 上启用这些技术的软件堆栈的第一层。
驱动程序工具包中的内核包列表包括以下内容及其依赖项:
kernel-core
kernel-devel
kernel-headers
kernel-modules
kernel-modules-extra
此外,驱动程序工具包还包含相应的实时内核包:
kernel-rt-core
kernel-rt-devel
kernel-rt-modules
kernel-rt-modules-extra
驱动程序工具包还有一些通常需要构建和安装内核模块的工具,包括:
elfutils-libelf-devel
kmod
binutilskabi-dw
kernel-abi-whitelists
以上内容的依赖项
在驱动程序工具包出现之前,用户会在 OpenShift Container Platform 上的 Pod 或构建配置中使用授权构建或通过安装主机machine-os-content
中的内核 RPM 来安装内核包。驱动程序工具包通过删除授权步骤简化了此过程,并避免了在 Pod 中访问 machine-os-content 的特权操作。合作伙伴还可以使用驱动程序工具包访问预发布的 OpenShift Container Platform 版本,为其硬件设备预构建驱动程序容器,以用于未来的 OpenShift Container Platform 版本。
驱动工具包也被内核模块管理 (KMM) 使用,目前 KMM 作为社区运营商在 OperatorHub 上可用。KMM 支持树外和第三方内核驱动程序以及底层操作系统的支持软件。用户可以为 KMM 创建模块来构建和部署驱动程序容器,以及像设备插件或指标这样的支持软件。模块可以包含一个构建配置来基于驱动程序工具包构建驱动程序容器,或者 KMM 可以部署预构建的驱动程序容器。
driver-toolkit
镜像可从Red Hat 生态系统目录的容器镜像部分和 OpenShift Container Platform 发行版有效负载中获取。与 OpenShift Container Platform 最新的次要版本对应的镜像将在目录中标记版本号。可以使用 oc adm
CLI 命令查找特定版本的镜像 URL。
从 registry.redhat.io
使用 podman
或在 OpenShift Container Platform 中拉取 driver-toolkit
镜像的说明,请参见Red Hat 生态系统目录。最新次要版本的 driver-toolkit 镜像在 registry.redhat.io
上标记为次要版本号,例如:registry.redhat.io/openshift4/driver-toolkit-rhel8:v4.17
。
您已安装 OpenShift CLI (oc
)。
使用 oc adm
命令提取与特定版本对应的 driver-toolkit
的镜像 URL。
对于 x86 镜像,命令如下:
$ oc adm release info quay.io/openshift-release-dev/ocp-release:4.17.z-x86_64 --image-for=driver-toolkit
对于 ARM 镜像,命令如下:
$ oc adm release info quay.io/openshift-release-dev/ocp-release:4.17.z-aarch64 --image-for=driver-toolkit
quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:b53883ca2bac5925857148c4a1abc300ced96c222498e3bc134fe7ce3a1dd404
使用有效的拉取密钥获取此镜像,例如安装 OpenShift Container Platform 所需的拉取密钥。
$ podman pull --authfile=path/to/pullsecret.json quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:<SHA>
例如,驱动工具包可以用作构建名为 simple-kmod
的非常简单的内核模块的基础镜像。
驱动工具包包含必要的依赖项, |
您有一个正在运行的 OpenShift Container Platform 集群。
您已将集群的镜像注册表运营商状态设置为 Managed
。
您已安装 OpenShift CLI (oc
)。
您已作为具有 cluster-admin
权限的用户登录到 OpenShift CLI。
创建一个命名空间。例如:
$ oc new-project simple-kmod-demo
YAML 定义了一个用于存储 simple-kmod
驱动程序容器镜像的 ImageStream
和一个用于构建容器的 BuildConfig
。将此 YAML 保存为 0000-buildconfig.yaml.template
。
apiVersion: image.openshift.io/v1
kind: ImageStream
metadata:
labels:
app: simple-kmod-driver-container
name: simple-kmod-driver-container
namespace: simple-kmod-demo
spec: {}
---
apiVersion: build.openshift.io/v1
kind: BuildConfig
metadata:
labels:
app: simple-kmod-driver-build
name: simple-kmod-driver-build
namespace: simple-kmod-demo
spec:
nodeSelector:
node-role.kubernetes.io/worker: ""
runPolicy: "Serial"
triggers:
- type: "ConfigChange"
- type: "ImageChange"
source:
dockerfile: |
ARG DTK
FROM ${DTK} as builder
ARG KVER
WORKDIR /build/
RUN git clone https://github.com/openshift-psap/simple-kmod.git
WORKDIR /build/simple-kmod
RUN make all install KVER=${KVER}
FROM registry.redhat.io/ubi8/ubi-minimal
ARG KVER
# Required for installing `modprobe`
RUN microdnf install kmod
COPY --from=builder /lib/modules/${KVER}/simple-kmod.ko /lib/modules/${KVER}/
COPY --from=builder /lib/modules/${KVER}/simple-procfs-kmod.ko /lib/modules/${KVER}/
RUN depmod ${KVER}
strategy:
dockerStrategy:
buildArgs:
- name: KMODVER
value: DEMO
# $ oc adm release info quay.io/openshift-release-dev/ocp-release:<cluster version>-x86_64 --image-for=driver-toolkit
- name: DTK
value: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:34864ccd2f4b6e385705a730864c04a40908e57acede44457a783d739e377cae
- name: KVER
value: 4.18.0-372.26.1.el8_6.x86_64
output:
to:
kind: ImageStreamTag
name: simple-kmod-driver-container:demo
使用以下命令将正确的驱动工具包镜像替换为您正在运行的 OpenShift Container Platform 版本中的“DRIVER_TOOLKIT_IMAGE”。
$ OCP_VERSION=$(oc get clusterversion/version -ojsonpath={.status.desired.version})
$ DRIVER_TOOLKIT_IMAGE=$(oc adm release info $OCP_VERSION --image-for=driver-toolkit)
$ sed "s#DRIVER_TOOLKIT_IMAGE#${DRIVER_TOOLKIT_IMAGE}#" 0000-buildconfig.yaml.template > 0000-buildconfig.yaml
使用以下命令创建镜像流和构建配置:
$ oc create -f 0000-buildconfig.yaml
构建器 pod 成功完成之后,将驱动程序容器镜像部署为 DaemonSet
。
驱动程序容器必须以特权安全上下文运行,才能在主机上加载内核模块。以下 YAML 文件包含用于运行驱动程序容器的 RBAC 规则和 DaemonSet
。将此 YAML 保存为 1000-drivercontainer.yaml
。
apiVersion: v1
kind: ServiceAccount
metadata:
name: simple-kmod-driver-container
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: simple-kmod-driver-container
rules:
- apiGroups:
- security.openshift.io
resources:
- securitycontextconstraints
verbs:
- use
resourceNames:
- privileged
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: simple-kmod-driver-container
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: simple-kmod-driver-container
subjects:
- kind: ServiceAccount
name: simple-kmod-driver-container
userNames:
- system:serviceaccount:simple-kmod-demo:simple-kmod-driver-container
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: simple-kmod-driver-container
spec:
selector:
matchLabels:
app: simple-kmod-driver-container
template:
metadata:
labels:
app: simple-kmod-driver-container
spec:
serviceAccount: simple-kmod-driver-container
serviceAccountName: simple-kmod-driver-container
containers:
- image: image-registry.openshift-image-registry.svc:5000/simple-kmod-demo/simple-kmod-driver-container:demo
name: simple-kmod-driver-container
imagePullPolicy: Always
command: [sleep, infinity]
lifecycle:
postStart:
exec:
command: ["modprobe", "-v", "-a" , "simple-kmod", "simple-procfs-kmod"]
preStop:
exec:
command: ["modprobe", "-r", "-a" , "simple-kmod", "simple-procfs-kmod"]
securityContext:
privileged: true
nodeSelector:
node-role.kubernetes.io/worker: ""
创建 RBAC 规则和 daemonset:
$ oc create -f 1000-drivercontainer.yaml
在 pod 在工作节点上运行之后,使用 lsmod
验证 simple-kmod
内核模块是否已在主机上成功加载。
验证 pod 是否正在运行:
$ oc get pod -n simple-kmod-demo
NAME READY STATUS RESTARTS AGE
simple-kmod-driver-build-1-build 0/1 Completed 0 6m
simple-kmod-driver-container-b22fd 1/1 Running 0 40s
simple-kmod-driver-container-jz9vn 1/1 Running 0 40s
simple-kmod-driver-container-p45cc 1/1 Running 0 40s
在驱动程序容器 pod 中执行 lsmod
命令:
$ oc exec -it pod/simple-kmod-driver-container-p45cc -- lsmod | grep simple
simple_procfs_kmod 16384 0
simple_kmod 16384 0
有关为集群配置注册表存储的更多信息,请参阅OpenShift Container Platform 中的镜像注册表运营商。