2.3. Driver Toolkit の使用
たとえば、Driver Toolkit は simple-kmod
と呼ばれる単純なカーネルモジュールを構築するベースイメージとして使用できます。
Driver Toolkit には、カーネルモジュールに署名するために必要な依存関係である openssl
、mokutil
、および keyutils
が含まれています。ただし、この例では、simple-kmod
カーネルモジュールは署名されていないため、Secure Boot
が有効になっているシステムにはロードできません。
2.3.1. クラスターでの simple-kmod ドライバーコンテナーをビルドし、実行します。
前提条件
- OpenShift Container Platform クラスターが実行中である。
-
クラスターのイメージレジストリー Operator の状態を
Managed
に設定している。 -
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限があるユーザーとして OpenShift CLI にログインしている。
手順
namespace を作成します。以下に例を示します。
$ 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
以下のコマンドで、“DRIVER_TOOLKIT_IMAGE” の代わりに、実行中の OpenShift Container Platform バージョンのドライバーツールキットイメージを置き換えます。
$ 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 ルールおよびデーモンセットを作成します。
$ oc create -f 1000-drivercontainer.yaml
Pod がワーカーノードで実行された後に、
simple_kmod
カーネルモジュールがlsmod
のホストマシンで正常に読み込まれることを確認します。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