2.3. Utilisation du Driver Toolkit
Par exemple, le Driver Toolkit peut être utilisé comme image de base pour construire un module de noyau très simple appelé simple-kmod.
Le Driver Toolkit inclut les dépendances nécessaires, openssl, mokutil, et keyutils, pour signer un module de noyau. Cependant, dans cet exemple, le module du noyau simple-kmod n'est pas signé et ne peut donc pas être chargé sur des systèmes où Secure Boot est activé.
2.3.1. Construire et exécuter le conteneur de pilote simple-kmod sur un cluster
Conditions préalables
- Vous disposez d'un cluster OpenShift Container Platform en cours d'exécution.
-
Vous avez défini l'état de l'opérateur du registre d'images sur
Managedpour votre cluster. -
You installed the OpenShift CLI (
oc). -
Vous êtes connecté à OpenShift CLI en tant qu'utilisateur avec des privilèges
cluster-admin.
Procédure
Créez un espace de noms. Par exemple :
$ oc new-project simple-kmod-demo
Le YAML définit un
ImageStreampour stocker l'image du conteneur du pilotesimple-kmodet unBuildConfigpour construire le conteneur. Enregistrez ce YAML sous0000-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:demoRemplacez "DRIVER_TOOLKIT_IMAGE" par l'image du driver toolkit correspondant à la version d'OpenShift Container Platform que vous utilisez, à l'aide des commandes suivantes.
$ 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.yamlCréer le flux d'images et la configuration de construction avec
$ oc create -f 0000-buildconfig.yaml
Une fois le pod de construction terminé avec succès, déployez l'image du conteneur de pilote sous la forme d'un fichier
DaemonSet.Le conteneur de pilote doit être exécuté avec le contexte de sécurité privilégié afin de charger les modules du noyau sur l'hôte. Le fichier YAML suivant contient les règles RBAC et le site
DaemonSetpour l'exécution du conteneur de pilote. Enregistrez ce fichier YAML sous1000-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: ""Créer les règles RBAC et le jeu de démons :
$ oc create -f 1000-drivercontainer.yaml
Une fois que les pods fonctionnent sur les nœuds de travail, vérifiez que le module du noyau
simple_kmodest chargé avec succès sur les machines hôtes aveclsmod.Vérifiez que les modules sont en cours d'exécution :
$ oc get pod -n simple-kmod-demo
Exemple de sortie
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
Exécutez la commande
lsmoddans le conteneur de pilotes :$ oc exec -it pod/simple-kmod-driver-container-p45cc -- lsmod | grep simple
Exemple de sortie
simple_procfs_kmod 16384 0 simple_kmod 16384 0