×

关于驱动程序工具包

背景

驱动程序工具包是 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 拉取驱动工具包容器镜像

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

在有效负载中查找驱动工具包镜像 URL

先决条件
步骤
  1. 使用 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
  2. 使用有效的拉取密钥获取此镜像,例如安装 OpenShift Container Platform 所需的拉取密钥。

    $ podman pull --authfile=path/to/pullsecret.json quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:<SHA>

使用驱动工具包

例如,驱动工具包可以用作构建名为 simple-kmod 的非常简单的内核模块的基础镜像。

驱动工具包包含必要的依赖项,opensslmokutilkeyutils,这些依赖项是签名内核模块所必需的。但是,在此示例中,simple-kmod 内核模块未签名,因此无法在启用了 Secure Boot 的系统上加载。

在集群上构建和运行 simple-kmod 驱动程序容器

先决条件
  • 您有一个正在运行的 OpenShift Container Platform 集群。

  • 您已将集群的镜像注册表运营商状态设置为 Managed

  • 您已安装 OpenShift CLI (oc)。

  • 您已作为具有 cluster-admin 权限的用户登录到 OpenShift CLI。

步骤

创建一个命名空间。例如:

$ oc new-project simple-kmod-demo
  1. 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
  2. 使用以下命令将正确的驱动工具包镜像替换为您正在运行的 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
  3. 使用以下命令创建镜像流和构建配置:

    $ oc create -f 0000-buildconfig.yaml
  4. 构建器 pod 成功完成之后,将驱动程序容器镜像部署为 DaemonSet

    1. 驱动程序容器必须以特权安全上下文运行,才能在主机上加载内核模块。以下 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: ""
    2. 创建 RBAC 规则和 daemonset:

      $ oc create -f 1000-drivercontainer.yaml
  5. 在 pod 在工作节点上运行之后,使用 lsmod 验证 simple-kmod 内核模块是否已在主机上成功加载。

    1. 验证 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
    2. 在驱动程序容器 pod 中执行 lsmod 命令:

      $ oc exec -it pod/simple-kmod-driver-container-p45cc -- lsmod | grep simple
      示例输出
      simple_procfs_kmod     16384  0
      simple_kmod            16384  0

其他资源