専用のハードウェアおよびドライバーの有効化
OpenShift Container Platform でのハードウェアの有効化に関する説明
概要
第1章 専用のハードウェアおよびドライバーの有効化
Driver Toolkit (DTK) は、OpenShift Container Platform ペイロードのコンテナーイメージであり、ドライバーコンテナーを構築するベースイメージとして使用することが目的です。Driver Toolkit イメージには、カーネルモジュールをビルドまたはインストールするための依存関係として一般的に必要なカーネルパッケージと、ドライバーコンテナーに必要ないくつかのツールが含まれています。これらのパッケージのバージョンは、対応する OpenShift Container Platform リリースの RHCOS ノードで実行されているカーネルのバージョンと一致します。
ドライバーコンテナーは、コンテナーオペレーティングシステム (Red Hat Enterprise Linux CoreOS (RHCOS)) でツリー外のカーネルモジュールとドライバーをビルドおよびデプロイメントするために使用されるコンテナーイメージです。カーネルモジュールおよびドライバーは、レベルの高い権限で、オペレーティングシステムカーネル内で実行されるソフトウェアライブラリーです。また、カーネル機能の拡張や、新しいデバイスの制御に必要なハードウェア固有のコードを提供します。例としては、field-programmable gate arrays (FPGA) や graphics processing units (GPU) などのハードウェアデバイスや、ソフトウェア定義のストレージソリューションなどがあります。これらはすべて、クライアントマシンでカーネルモジュールを必要とします。ドライバーコンテナーは、OpenShift Container Platform デプロイメントでこれらのテクノロジーを有効にするために使用されるソフトウェアスタックの最初の階層です。
第2章 Driver Toolkit
Driver Toolkit について、およびドライバーコンテナーのベースイメージとしてそれを使用して、OpenShift Container Platform デプロイメントで特別なソフトウェアおよびハードウェアデバイスを有効にする方法を説明します。
2.1. Driver Toolkit について
背景情報
Driver Toolkit は、ドライバーコンテナーをビルドできるベースイメージとして使用する OpenShift Container Platform ペイロードのコンテナーイメージです。Driver Toolkit イメージには、カーネルモジュールをビルドまたはインストールするための依存関係として一般的に必要なカーネルパッケージと、ドライバーコンテナーに必要ないくつかのツールが含まれています。これらのパッケージのバージョンは、対応する OpenShift Container Platform リリースの Red Hat Enterprise Linux CoreOS (RHCOS) ノードで実行されているカーネルバージョンと同じです。
ドライバーコンテナーは、RHCOS などのコンテナーオペレーティングシステムで out-of-tree カーネルモジュールをビルドしてデプロイするのに使用するコンテナーイメージです。カーネルモジュールおよびドライバーは、レベルの高い権限で、オペレーティングシステムカーネル内で実行されるソフトウェアライブラリーです。また、カーネル機能の拡張や、新しいデバイスの制御に必要なハードウェア固有のコードを提供します。例として、Field Programmable Gate Arrays (FPGA) または GPU などのハードウェアデバイスや、クライアントマシンでカーネルモジュールを必要とする Lustre parallel ファイルシステムなどのソフトウェア定義のストレージ (SDS) ソリューションなどがあります。ドライバーコンテナーは、Kubernetes でこれらの技術を有効にするために使用されるソフトウェアスタックの最初の層です。
Driver Toolkit のカーネルパッケージのリストには、以下とその依存関係が含まれます。
-
kernel-core
-
kernel-devel
-
kernel-headers
-
kernel-modules
-
kernel-modules-extra
また、Driver Toolkit には、対応するリアルタイムカーネルパッケージも含まれています。
-
kernel-rt-core
-
kernel-rt-devel
-
kernel-rt-modules
-
kernel-rt-modules-extra
Driver Toolkit には、カーネルモジュールのビルドおよびインストールに一般的に必要となるツールが複数あります。たとえば、以下が含まれます。
-
elfutils-libelf-devel
-
kmod
-
binutilskabi-dw
-
kernel-abi-whitelists
- 上記の依存関係
目的
Driver Toolkit がリリースされる前は、エンタイトルメントのあるビルド を使用するか、ホストの machine-os-content
のカーネル RPM からインストールして、Pod またはビルド設定のカーネルパッケージを OpenShift Container Platform にインストールできていました。Driver Toolkit を使用すると、エンタイトルメントステップがなくなりプロセスが単純化され、Pod で machine-os-content にアクセスする特権操作を回避できます。Driver Toolkit は、プレリリース済みの OpenShift Container Platform バージョンにアクセスできるパートナーも使用でき、今後の OpenShift Container Platform リリース用にハードウェアデバイスのドライバーコンテナーを事前にビルドできます。
Driver Toolkit は Kernel Module Management (KMM) でも使用されます。Kernel Module Management (KMM) は、現在 OperatorHub でコミュニティー Operator として利用できます。KMM は、out-of-tree およびサードパーティーのカーネルドライバー、および基礎となるオペレーティングシステムのサポートソフトウェアをサポートします。ユーザーは、KMM のレシピを作成してドライバーコンテナーを構築してデプロイしたり、デバイスプラグインやメトリックなどのソフトウェアをサポートしたりできます。モジュールには、ビルド設定を追加して、Driver Toolkit をベースにドライバーコンテナーをビルドできます。または KMM で事前ビルドされたドライバーコンテナーをデプロイできます。
2.2. Driver Toolkit コンテナーイメージのプル
driver-toolkit
イメージは、Red Hat Ecosystem Catalog および OpenShift Container Platform リリースペイロードのコンテナーイメージ セクションから入手できます。OpenShift Container Platform の最新のマイナーリリースに対応するイメージは、カタログのバージョン番号でタグ付けされます。特定のリリースのイメージ URL は、oc adm
CLI コマンドを使用して確認できます。
2.2.1. registry.redhat.io からの Driver Toolkit コンテナーイメージのプル
podman
または OpenShift Container Platform を使用して registry.redhat.io
から driver-toolkit
イメージをプルする手順は、Red Hat Ecosystem Catalog を参照してください。最新のマイナーリリースのドライバーツールキットイメージは、registry.redhat.io
のマイナーリリースバージョンでタグ付けされます (例: registry.redhat.io/openshift4/driver-toolkit-rhel8:v4.15
)。
2.2.2. ペイロードでの Driver Toolkit イメージ URL の検索
前提条件
- Red Hat OpenShift Cluster Manager からイメージプルシークレット を取得している。
-
OpenShift CLI (
oc
) がインストールされている。
手順
oc adm
コマンドを使用して、特定のリリースに対応するdriver-toolkit
のイメージ URL を抽出します。x86 イメージの場合、コマンドは次のとおりです。
$ oc adm release info quay.io/openshift-release-dev/ocp-release:4.15.z-x86_64 --image-for=driver-toolkit
ARM イメージの場合、コマンドは次のとおりです。
$ oc adm release info quay.io/openshift-release-dev/ocp-release:4.15.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>
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
2.4. 関連情報
- クラスターのレジストリーストレージの設定に関する詳細は、OpenShift Container Platform の Image Registry Operator を参照してください。
第3章 Node Feature Discovery Operator
Node Feature Discovery (NFD) Operator および、これを使用して Node Feature Discovery (ハードウェア機能やシステム設定を検出するための Kubernetes アドオン) をオーケストレーションしてノードレベルの情報を公開する方法を説明します。
Node Feature Discovery Operator (NFD) は、ハードウェア固有の情報でノードにラベルを付け、OpenShift Container Platform クラスターのハードウェア機能と設定の検出を管理します。NFD は、PCI カード、カーネル、オペレーティングシステムのバージョンなど、ノード固有の属性でホストにラベルを付けます。
NFD Operator は、“Node Feature Discovery” と検索して Operator Hub で確認できます。
3.1. Node Feature Discovery Operator のインストール
Node Feature Discovery (NFD) Operator は、NFD デーモンセットの実行に必要なすべてのリソースをオーケストレーションします。クラスター管理者は、OpenShift Container Platform CLI または Web コンソールを使用して NFD Operator をインストールできます。
3.1.1. CLI を使用した NFD Operator のインストール
クラスター管理者は、CLI を使用して NFD Operator をインストールできます。
前提条件
- OpenShift Container Platform クラスター。
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてログインしている。
手順
NFD Operator の namespace を作成します。
openshift-nfd
namespace を定義する以下のNamespace
カスタムリソース (CR) を作成し、YAML をnfd-namespace.yaml
ファイルに保存します。cluster-monitoring
を"true"
に設定します。apiVersion: v1 kind: Namespace metadata: name: openshift-nfd labels: name: openshift-nfd openshift.io/cluster-monitoring: "true"
以下のコマンドを実行して namespace を作成します。
$ oc create -f nfd-namespace.yaml
以下のオブジェクトを作成して、直前の手順で作成した namespace に NFD Operator をインストールします。
以下の
OperatorGroup
CR を作成し、YAML をnfd-operatorgroup.yaml
ファイルに保存します。apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: generateName: openshift-nfd- name: openshift-nfd namespace: openshift-nfd spec: targetNamespaces: - openshift-nfd
以下のコマンドを実行して
OperatorGroup
CR を作成します。$ oc create -f nfd-operatorgroup.yaml
以下の
Subscription
CR を作成し、YAML をnfd-sub.yaml
ファイルに保存します。Subscription の例
apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: nfd namespace: openshift-nfd spec: channel: "stable" installPlanApproval: Automatic name: nfd source: redhat-operators sourceNamespace: openshift-marketplace
以下のコマンドを実行して Subscription オブジェクトを作成します。
$ oc create -f nfd-sub.yaml
openshift-nfd
プロジェクトに切り替えます。$ oc project openshift-nfd
検証
Operator のデプロイメントが正常に行われたことを確認するには、以下を実行します。
$ oc get pods
出力例
NAME READY STATUS RESTARTS AGE nfd-controller-manager-7f86ccfb58-vgr4x 2/2 Running 0 10m
正常にデプロイされると、
Running
ステータスが表示されます。
3.1.2. Web コンソールでの NFD Operator のインストール
クラスター管理者は、Web コンソールを使用して NFD Operator をインストールできます。
手順
- OpenShift Container Platform Web コンソールで、Operators → OperatorHub をクリックします。
- 利用可能な Operator の一覧から Node Feature Discovery を選択してから Install をクリックします。
- Install Operator ページで A specific namespace on the cluster を選択し、Install をクリックします。namespace が作成されるため、これを作成する必要はありません。
検証
以下のように、NFD Operator が正常にインストールされていることを確認します。
- Operators → Installed Operators ページに移動します。
Status が InstallSucceeded の Node Feature Discovery が openshift-nfd プロジェクトにリスト表示されていることを確認します。
注記インストール時に、Operator は Failed ステータスを表示する可能性があります。インストールが後に InstallSucceeded メッセージを出して正常に実行される場合は、Failed メッセージを無視できます。
トラブルシューティング
Operator がインストール済みとして表示されない場合に、さらにトラブルシューティングを実行します。
- Operators → Installed Operators ページに移動し、Operator Subscriptions および Install Plans タブで Status にエラーがあるかどうかを検査します。
-
Workloads → Pods ページに移動し、
openshift-nfd
プロジェクトで Pod のログを確認します。
3.2. Node Feature Discovery Operator の使用
Node Feature Discovery (NFD) Operator は、NodeFeatureDiscovery
カスタムリソース (CR) を監視して Node-Feature-Discovery デーモンセットの実行に必要な全リソースをオーケストレーションします。NodeFeatureDiscovery
CR に基づいて、Operator は選択された namespace にオペランド (NFD) コンポーネントを作成します。CR を編集して、別の namespace、イメージ、イメージプルポリシー、nfd-worker-conf
config map などのオプションを使用できます。
クラスター管理者は、OpenShift CLI (oc
) または Web コンソールを使用して NodeFeatureDiscovery
CR を作成できます。
バージョン 4.12 以降、NodeFeatureDiscovery
CR の operand.image
フィールドは必須です。{olm-first} を使用して NFD Operator をデプロイすると、OLM は operand.image
フィールドを自動的に設定します。OpenShift Container Platform CLI または OpenShift Container Platform Web コンソールを使用して NodeFeatureDiscovery
CR を作成する場合、operand.image
フィールドを明示的に設定する必要があります。
3.2.1. CLI を使用した NodeFeatureDiscovery CR の作成
クラスター管理者は、OpenShift CLI (oc
) を使用して NodeFeatureDiscovery
CR インスタンスを作成できます。
spec.operand.image
設定では、OpenShift Container Platform リリース 4.13 以降で使用するために -rhel9
イメージを定義する必要があります。
次の例は、正しいイメージを取得するために -rhel9
を使用する方法を示しています。
前提条件
- OpenShift Container Platform クラスターにアクセスできる。
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてログインしている。 - NFD Operator をインストールしました。
手順
NodeFeatureDiscovery
CR を作成します。NodeFeatureDiscovery
CR の例apiVersion: nfd.openshift.io/v1 kind: NodeFeatureDiscovery metadata: name: nfd-instance namespace: openshift-nfd spec: instance: "" # instance is empty by default topologyupdater: false # False by default operand: image: registry.redhat.io/openshift4/ose-node-feature-discovery-rhel9:v4.15 1 imagePullPolicy: Always workerConfig: configData: | core: # labelWhiteList: # noPublish: false sleepInterval: 60s # sources: [all] # klog: # addDirHeader: false # alsologtostderr: false # logBacktraceAt: # logtostderr: true # skipHeaders: false # stderrthreshold: 2 # v: 0 # vmodule: ## NOTE: the following options are not dynamically run-time configurable ## and require a nfd-worker restart to take effect after being changed # logDir: # logFile: # logFileMaxSize: 1800 # skipLogHeaders: false sources: cpu: cpuid: # NOTE: whitelist has priority over blacklist attributeBlacklist: - "BMI1" - "BMI2" - "CLMUL" - "CMOV" - "CX16" - "ERMS" - "F16C" - "HTT" - "LZCNT" - "MMX" - "MMXEXT" - "NX" - "POPCNT" - "RDRAND" - "RDSEED" - "RDTSCP" - "SGX" - "SSE" - "SSE2" - "SSE3" - "SSE4.1" - "SSE4.2" - "SSSE3" attributeWhitelist: kernel: kconfigFile: "/path/to/kconfig" configOpts: - "NO_HZ" - "X86" - "DMI" pci: deviceClassWhitelist: - "0200" - "03" - "12" deviceLabelFields: - "class" customConfig: configData: | - name: "more.kernel.features" matchOn: - loadedKMod: ["example_kmod3"]
- 1
operand.image
フィールドは必須です。
次のコマンドを実行して、
NodeFeatureDiscovery
CR を作成します。$ oc apply -f <filename>
検証
次のコマンドを実行して、
NodeFeatureDiscovery
CR が作成されたことを確認します。$ oc get pods
出力例
NAME READY STATUS RESTARTS AGE nfd-controller-manager-7f86ccfb58-vgr4x 2/2 Running 0 11m nfd-master-hcn64 1/1 Running 0 60s nfd-master-lnnxx 1/1 Running 0 60s nfd-master-mp6hr 1/1 Running 0 60s nfd-worker-vgcz9 1/1 Running 0 60s nfd-worker-xqbws 1/1 Running 0 60s
正常にデプロイされると、
Running
ステータスが表示されます。
3.2.2. 非接続環境で CLI を使用した NodeFeatureDiscovery CR の作成
クラスター管理者は、OpenShift CLI (oc
) を使用して NodeFeatureDiscovery
CR インスタンスを作成できます。
前提条件
- OpenShift Container Platform クラスターにアクセスできる。
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限を持つユーザーとしてログインしている。 - NFD Operator をインストールしました。
- 必要なイメージを含むミラーレジストリーにアクセスできる。
-
skopeo
CLI ツールをインストールしている。
手順
レジストリーイメージのダイジェストを決定します。
以下のコマンドを実行します。
$ skopeo inspect docker://registry.redhat.io/openshift4/ose-node-feature-discovery:<openshift_version>
コマンドの例
$ skopeo inspect docker://registry.redhat.io/openshift4/ose-node-feature-discovery:v4.12
出力を調べてイメージダイジェストを識別します。
出力例
{ ... "Digest": "sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", ... }
次のコマンドを実行して、
skopeo
CLI ツールを使用して、registry.redhat.io
からミラーレジストリーにイメージをコピーします。skopeo copy docker://registry.redhat.io/openshift4/ose-node-feature-discovery@<image_digest> docker://<mirror_registry>/openshift4/ose-node-feature-discovery@<image_digest>
コマンドの例
skopeo copy docker://registry.redhat.io/openshift4/ose-node-feature-discovery@sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef docker://<your-mirror-registry>/openshift4/ose-node-feature-discovery@sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
NodeFeatureDiscovery
CR を作成します。NodeFeatureDiscovery
CR の例apiVersion: nfd.openshift.io/v1 kind: NodeFeatureDiscovery metadata: name: nfd-instance spec: operand: image: <mirror_registry>/openshift4/ose-node-feature-discovery@<image_digest> 1 imagePullPolicy: Always workerConfig: configData: | core: # labelWhiteList: # noPublish: false sleepInterval: 60s # sources: [all] # klog: # addDirHeader: false # alsologtostderr: false # logBacktraceAt: # logtostderr: true # skipHeaders: false # stderrthreshold: 2 # v: 0 # vmodule: ## NOTE: the following options are not dynamically run-time configurable ## and require a nfd-worker restart to take effect after being changed # logDir: # logFile: # logFileMaxSize: 1800 # skipLogHeaders: false sources: cpu: cpuid: # NOTE: whitelist has priority over blacklist attributeBlacklist: - "BMI1" - "BMI2" - "CLMUL" - "CMOV" - "CX16" - "ERMS" - "F16C" - "HTT" - "LZCNT" - "MMX" - "MMXEXT" - "NX" - "POPCNT" - "RDRAND" - "RDSEED" - "RDTSCP" - "SGX" - "SSE" - "SSE2" - "SSE3" - "SSE4.1" - "SSE4.2" - "SSSE3" attributeWhitelist: kernel: kconfigFile: "/path/to/kconfig" configOpts: - "NO_HZ" - "X86" - "DMI" pci: deviceClassWhitelist: - "0200" - "03" - "12" deviceLabelFields: - "class" customConfig: configData: | - name: "more.kernel.features" matchOn: - loadedKMod: ["example_kmod3"]
- 1
operand.image
フィールドは必須です。
次のコマンドを実行して、
NodeFeatureDiscovery
CR を作成します。$ oc apply -f <filename>
検証
次のコマンドを実行して、
NodeFeatureDiscovery
CR のステータスを確認します。$ oc get nodefeaturediscovery nfd-instance -o yaml
次のコマンドを実行して、Pod が
ImagePullBackOff
エラーなしで実行していることを確認します。$ oc get pods -n <nfd_namespace>
3.2.3. Web コンソールを使用した NodeFeatureDiscovery CR の作成
クラスター管理者は、OpenShift Container Platform Web コンソールを使用して NodeFeatureDiscovery
CR を作成できます。
前提条件
- OpenShift Container Platform クラスターにアクセスできる。
-
cluster-admin
権限を持つユーザーとしてログインしている。 - NFD Operator をインストールしました。
手順
- Operators → Installed Operators ページに移動します。
- Node Feature Discovery セクションの Provided APIs で、Create instance をクリックします。
-
NodeFeatureDiscovery
CR の値を編集します。 - Create をクリックします。
バージョン 4.12 以降、NodeFeatureDiscovery
CR の operand.image
フィールドは必須です。{olm-first} を使用して NFD Operator をデプロイすると、OLM は operand.image
フィールドを自動的に設定します。OpenShift Container Platform CLI または OpenShift Container Platform Web コンソールを使用して NodeFeatureDiscovery
CR を作成する場合、operand.image
フィールドを明示的に設定する必要があります。
3.3. Node Feature Discovery Operator の設定
3.3.1. コア
core
セクションには、共通の設定が含まれており、これは特定の機能ソースに固有のものではありません。
core.sleepInterval
core.sleepInterval
は、次に機能検出または再検出するまでの間隔を指定するので、ノードの再ラベル付けの間隔も指定します。正の値以外は、無限のスリープ状態を意味するので、再検出や再ラベル付けは行われません。
この値は、指定されている場合は、非推奨の --sleep-interval
コマンドラインフラグで上書きされます。
使用例
core:
sleepInterval: 60s 1
デフォルト値は 60s
です。
core.sources
core.sources
は、有効な機能ソースのリストを指定します。特殊な値 all
はすべての機能ソースを有効にします。
この値は、指定されている場合は非推奨の --sources
コマンドラインフラグにより上書きされます。
デフォルト: [all]
使用例
core: sources: - system - custom
core.labelWhiteList
core.labelWhiteList
は、正規表現を指定してラベル名に基づいて機能ラベルをフィルターします。一致しないラベルは公開されません。
正規表現は、ラベルのベース名 ('/' の後に名前の一部) だけを照合します。ラベルの接頭辞または namespace は省略されます。
この値は、指定されている場合は、非推奨の --label-whitelist
コマンドラインフラグで上書きされます。
デフォルト: null
使用例
core: labelWhiteList: '^cpu-cpuid'
core.noPublish
core.noPublish
を true
に設定すると、nfd-master
による全通信が無効になります。これは実質的にはドライランフラグです。nfd-worker
は通常通り機能検出を実行しますが、ラベル付け要求は nfd-master
に送信されます。
この値は、指定されている場合には、--no-publish
コマンドラインフラグにより上書きされます。
例:
使用例
core:
noPublish: true 1
デフォルト値は false
です。
core.klog
以下のオプションは、実行時にほとんどを動的に調整できるロガー設定を指定します。
ロガーオプションはコマンドラインフラグを使用して指定することもできますが、対応する設定ファイルオプションよりもこちらが優先されます。
core.klog.addDirHeader
true
に設定すると、core.klog.addDirHeader
がファイルディレクトリーをログメッセージのヘッダーに追加します。
デフォルト: false
ランタイム設定可能: yes
core.klog.alsologtostderr
標準エラーおよびファイルにロギングします。
デフォルト: false
ランタイム設定可能: yes
core.klog.logBacktraceAt
file:N の行にロギングが到達すると、スタックストレースを出力します。
デフォルト: empty
ランタイム設定可能: yes
core.klog.logDir
空でない場合は、このディレクトリーにログファイルを書き込みます。
デフォルト: empty
ランタイム設定可能: no
core.klog.logFile
空でない場合は、このログファイルを使用します。
デフォルト: empty
ランタイム設定可能: no
core.klog.logFileMaxSize
core.klog.logFileMaxSize
は、ログファイルの最大サイズを定義します。単位はメガバイトです。値が 0
の場合には、最大ファイルサイズは無制限になります。
デフォルト: 1800
ランタイム設定可能: no
core.klog.logtostderr
ファイルの代わりに標準エラーにログを記録します。
デフォルト: true
ランタイム設定可能: yes
core.klog.skipHeaders
core.klog.skipHeaders
が true
に設定されている場合には、ログメッセージでヘッダー接頭辞を使用しません。
デフォルト: false
ランタイム設定可能: yes
core.klog.skipLogHeaders
core.klog.skipLogHeaders
が true
に設定されている場合は、ログファイルを表示する時にヘッダーは使用されません。
デフォルト: false
ランタイム設定可能: no
core.klog.stderrthreshold
このしきい値以上のログは stderr になります。
デフォルト: 2
ランタイム設定可能: yes
core.klog.v
core.klog.v
はログレベルの詳細度の数値です。
デフォルト: 0
ランタイム設定可能: yes
core.klog.vmodule
core.klog.vmodule
は、ファイルでフィルターされたロギングの pattern=N
設定 (コンマ区切りのリスト) です。
デフォルト: empty
ランタイム設定可能: yes
3.3.2. ソース
sources
セクションには、機能ソース固有の設定パラメーターが含まれます。
sources.cpu.cpuid.attributeBlacklist
このオプションに記述されている cpuid
機能は公開されません。
この値は、指定されている場合は source.cpu.cpuid.attributeWhitelist
によって上書きされます。
デフォルト: [BMI1, BMI2, CLMUL, CMOV, CX16, ERMS, F16C, HTT, LZCNT, MMX, MMXEXT, NX, POPCNT, RDRAND, RDSEED, RDTSCP, SGX, SGXLC, SSE, SSE2, SSE3, SSE4.1, SSE4.2, SSSE3]
使用例
sources: cpu: cpuid: attributeBlacklist: [MMX, MMXEXT]
sources.cpu.cpuid.attributeWhitelist
このオプションに記述されている cpuid
機能のみを公開します。
sources.cpu.cpuid.attributeWhitelist
は sources.cpu.cpuid.attributeBlacklist
よりも優先されます。
デフォルト: empty
使用例
sources: cpu: cpuid: attributeWhitelist: [AVX512BW, AVX512CD, AVX512DQ, AVX512F, AVX512VL]
sources.kernel.kconfigFile
sources.kernel.kconfigFile
は、カーネル設定ファイルのパスです。空の場合には、NFD は一般的な標準場所で検索を実行します。
デフォルト: empty
使用例
sources: kernel: kconfigFile: "/path/to/kconfig"
sources.kernel.configOpts
sources.kernel.configOpts
は、機能ラベルとして公開するカーネル設定オプションを表します。
デフォルト: [NO_HZ、NO_HZ_IDLE、NO_HZ_FULL、PREEMPT]
使用例
sources: kernel: configOpts: [NO_HZ, X86, DMI]
sources.pci.deviceClassWhitelist
sources.pci.deviceClassWhitelist
は、ラベルを公開する PCI デバイスクラス ID の一覧です。メインクラスとしてのみ (例: 03
) か、完全なクラスサブクラスの組み合わせ (例: 0300
) として指定できます。前者は、すべてのサブクラスが許可されていることを意味します。ラベルの形式は、deviceLabelFields
でさらに設定できます。
デフォルト: ["03", "0b40", "12"]
使用例
sources: pci: deviceClassWhitelist: ["0200", "03"]
sources.pci.deviceLabelFields
sources.pci.deviceLabelFields
は、機能ラベルの名前を構築する時に使用する PCI ID フィールドのセットです。有効なフィールドは class
、vendor
、device
、subsystem_vendor
および subsystem_device
です。
デフォルト: [class, vendor]
使用例
sources: pci: deviceLabelFields: [class, vendor, device]
上記の設定例では、NFD は feature.node.kubernetes.io/pci-<class-id>_<vendor-id>_<device-id>.present=true
などのラベルを公開します。
sources.usb.deviceClassWhitelist
sources.usb.deviceClassWhitelist
は、機能ラベルを公開する USB デバイスクラス ID の一覧です。ラベルの形式は、deviceLabelFields
でさらに設定できます。
デフォルト: ["0e", "ef", "fe", "ff"]
使用例
sources: usb: deviceClassWhitelist: ["ef", "ff"]
sources.usb.deviceLabelFields
sources.usb.deviceLabelFields
は、機能ラベルの名前を作成する USB ID フィールドのセットです。有効なフィールドは class
、vendor
、および device
です。
デフォルト: [class, vendor, device]
使用例
sources: pci: deviceLabelFields: [class, vendor]
上記の設定例では、NFD は feature.node.kubernetes.io/usb-<class-id>_<vendor-id>.present=true
などのラベルを公開します。
sources.custom
sources.custom
は、ユーザー固有のラベルを作成するためにカスタム機能ソースで処理するルールの一覧です。
デフォルト: empty
使用例
source: custom: - name: "my.custom.feature" matchOn: - loadedKMod: ["e1000e"] - pciId: class: ["0200"] vendor: ["8086"]
3.4. NodeFeatureRule カスタムリソースについて
NodeFeatureRule
オブジェクトは、ノードに対するルールベースのカスタムラベル付け用に設計された NodeFeatureDiscovery
カスタムリソースです。一部のユースケースには、デバイス固有ラベルを作成するための、ハードウェアベンダーによるアプリケーション固有のラベル付けまたは配布が含まれます。
NodeFeatureRule
オブジェクトを使用すると、ベンダー固有またはアプリケーション固有のラベルおよびテイントを作成できます。柔軟なルールベースのメカニズムを使用して、ラベルを作成し、オプションでノードの機能に基づきテイントを作成します。
3.5. NodeFeatureRule カスタムリソースの使用
一連のルールが条件に一致する場合にノードにラベルを付ける NodeFeatureRule
オブジェクトを作成します。
手順
次のテキストを含むカスタムリソースを、
nodefeaturerule.yaml
という名前で作成します。apiVersion: nfd.openshift.io/v1 kind: NodeFeatureRule metadata: name: example-rule spec: rules: - name: "example rule" labels: "example-custom-feature": "true" # Label is created if all of the rules below match matchFeatures: # Match if "veth" kernel module is loaded - feature: kernel.loadedmodule matchExpressions: veth: {op: Exists} # Match if any PCI device with vendor 8086 exists in the system - feature: pci.device matchExpressions: vendor: {op: In, value: ["8086"]}
このカスタムリソースは、
veth
モジュールがロードされ、ベンダーコードが8086
の PCI デバイスがクラスター内に存在する場合にラベル付けするように指定します。次のコマンドを実行して、
nodefeaturerule.yaml
ファイルをクラスターに適用します。$ oc apply -f https://raw.githubusercontent.com/kubernetes-sigs/node-feature-discovery/v0.13.6/examples/nodefeaturerule.yaml
この例では、
veth
モジュールがロードされており、ベンダーコードが8086
の PCI デバイスが存在するノードに機能ラベルを適用します。注記ラベルの再設定では、最大 1 分の遅延が発生する可能性があります。
3.6. NFD トポロジーアップデータの使用
Node Feature Discovery (NFD) Topology Updater は、ワーカーノードに割り当てられたリソースを調べるデーモンです。これは、ゾーンごとに新規 Pod に割り当てることができるリソースに対応し、ゾーンを Non-Uniform Memory Access (NUMA) ノードにすることができます。NFD Topology Updater は、情報を nfd-master に伝達します。これにより、クラスター内のすべてのワーカーノードに対応するNodeResourceTopology
カスタムリソース (CR) が作成されます。NFD Topology Updater のインスタンスが 1 台、クラスターの各ノードで実行されます。
NFD で Topology Updater ワーカーを有効にするには Node Feature Discovery Operator の使用 のセクションで説明されているように、NodeFeatureDiscovery
CR で topologyupdater
変数を true
に設定します。
3.6.1. NodeResourceTopology CR
NFD Topology Updater を使用して実行すると、NFD は、次のようなノードリソースハードウェアトポロジーに対応するカスタムリソースインスタンスを作成します。
apiVersion: topology.node.k8s.io/v1alpha1 kind: NodeResourceTopology metadata: name: node1 topologyPolicies: ["SingleNUMANodeContainerLevel"] zones: - name: node-0 type: Node resources: - name: cpu capacity: 20 allocatable: 16 available: 10 - name: vendor/nic1 capacity: 3 allocatable: 3 available: 3 - name: node-1 type: Node resources: - name: cpu capacity: 30 allocatable: 30 available: 15 - name: vendor/nic2 capacity: 6 allocatable: 6 available: 6 - name: node-2 type: Node resources: - name: cpu capacity: 30 allocatable: 30 available: 15 - name: vendor/nic1 capacity: 3 allocatable: 3 available: 3
3.6.2. NFD Topology Updater コマンドラインフラグ
使用可能なコマンドラインフラグを表示するには、nfd-topology-updater-help
コマンドを実行します。たとえば、podman コンテナーで、次のコマンドを実行します。
$ podman run gcr.io/k8s-staging-nfd/node-feature-discovery:master nfd-topology-updater -help
-ca-file
-ca-file
フラグは、-cert-file
フラグおよび `-key-file` フラグとともに、NFD トポロジーアップデータで相互 TLS 認証を制御する 3 つのフラグの 1 つです。このフラグは、nfd-master の信頼性検証に使用する TLS ルート証明書を指定します。
デフォルト: empty
-ca-file
フラグは、-cert-file
と -key-file
フラグと一緒に指定する必要があります。
例
$ nfd-topology-updater -ca-file=/opt/nfd/ca.crt -cert-file=/opt/nfd/updater.crt -key-file=/opt/nfd/updater.key
-cert-file
-cert-file
フラグは、-ca-file
と -key-file flags
とともに、NFD トポロジーアップデータで相互 TLS 認証を制御する 3 つのフラグの 1 つです。このフラグは、送信要求の認証時に提示する TLS 証明書を指定します。
デフォルト: empty
-cert-file
フラグは、-ca-file
と -key-file
フラグと一緒に指定する必要があります。
例
$ nfd-topology-updater -cert-file=/opt/nfd/updater.crt -key-file=/opt/nfd/updater.key -ca-file=/opt/nfd/ca.crt
-h, -help
使用法を出力して終了します。
-key-file
-key-file
フラグは、-ca-file
と -cert-file
フラグとともに、NFD Topology Updater で相互 TLS 認証を制御する 3 つのフラグの 1 つです。このフラグは、指定の証明書ファイルまたは -cert-file
に対応する秘密鍵 (送信要求の認証に使用) を指定します。
デフォルト: empty
-key-file
フラグは、-ca-file
と -cert-file
フラグと一緒に指定する必要があります。
例
$ nfd-topology-updater -key-file=/opt/nfd/updater.key -cert-file=/opt/nfd/updater.crt -ca-file=/opt/nfd/ca.crt
-kubelet-config-file
-kubelet-config-file
は、Kubelet の設定ファイルへのパスを指定します。
デフォルト: /host-var/lib/kubelet/config.yaml
例
$ nfd-topology-updater -kubelet-config-file=/var/lib/kubelet/config.yaml
-no-publish
-no-publish
フラグは、nfd-master とのすべての通信を無効にし、nfd-topology-updater のドライランフラグにします。NFD Topology Updater は、リソースハードウェアトポロジー検出を正常に実行しますが、CR 要求は nfd-master に送信されません。
デフォルト: false
例
$ nfd-topology-updater -no-publish
3.6.2.1. -oneshot
-oneshot
フラグを使用すると、リソースハードウェアトポロジーの検出が 1 回行われた後も、NFD Topology Updater が終了します。
デフォルト: false
例
$ nfd-topology-updater -oneshot -no-publish
-podresources-socket
-podresources-socket
フラグは、kubelet が gRPC サービスをエクスポートして使用中の CPU とデバイスを検出できるようにし、それらのメタデータを提供する Unix ソケットへのパスを指定します。
デフォルト: /host-var/liblib/kubelet/pod-resources/kubelet.sock
例
$ nfd-topology-updater -podresources-socket=/var/lib/kubelet/pod-resources/kubelet.sock
-server
-server
フラグは、接続する nfd-master エンドポイントのアドレスを指定します。
デフォルト: localhost:8080
例
$ nfd-topology-updater -server=nfd-master.nfd.svc.cluster.local:443
-server-name-override
-server-name-override
フラグは、nfd-master TLS 証明書から必要とされるコモンネーム (CN) を指定します。このフラグは、主に開発とデバッグを目的としています。
デフォルト: empty
例
$ nfd-topology-updater -server-name-override=localhost
-sleep-interval
-sleep-interval
フラグは、リソースハードウェアトポロジーの再検査とカスタムリソースの更新の間隔を指定します。正でない値は、スリープ間隔が無限であることを意味し、再検出は行われません。
デフォルト: 60s
。
例
$ nfd-topology-updater -sleep-interval=1h
-version
バージョンを出力して終了します。
-watch-namespace
-watch-namespace
フラグは namespace を指定して、指定された namespace で実行されている Pod に対してのみリソースハードウェアトポロジーの検査が行われるようにします。指定された namespace で実行されていない Pod は、リソースアカウンティングでは考慮されません。これは、テストとデバッグの目的で特に役立ちます。*
値は、全 namespace に含まれるすべての Pod がアカウンティングプロセス中に考慮されることを意味します。
デフォルト: *
例
$ nfd-topology-updater -watch-namespace=rte
第4章 Kernel Module Management Operator
Kernel Module Management (KMM) Operator と、それを使用して out-of-tree のカーネルモジュールとデバイスプラグインを OpenShift Container Platform クラスターにデプロイする方法を説明します。
4.1. Kernel Module Management Operator について
Kernel Module Management (KMM) Operator は、OpenShift Container Platform クラスター上の out-of-tree のカーネルモジュールとデバイスプラグインを管理、ビルド、署名、およびデプロイします。
KMM は、ツリー外のカーネルモジュールとそれに関連するデバイスプラグインを記述する新しい Module
CRD を追加します。モジュール
リソースを使用して、モジュールをロードする方法を設定し、カーネルバージョンの ModuleLoader
イメージを定義し、特定のカーネルバージョンのモジュールをビルドして署名するための指示を含めることができます。
KMM は、任意のカーネルモジュールに対して一度に複数のカーネルバージョンに対応できるように設計されているため、ノードのシームレスなアップグレードとアプリケーションのダウンタイムの削減が可能になります。
4.2. Kernel Module Management Operator のインストール
クラスター管理者は、OpenShift CLI または Web コンソールを使用して Kernel Module Management (KMM) Operator をインストールできます。
KMM Operator は、OpenShift Container Platform 4.12 以降でサポートされています。バージョン 4.11 に KMM をインストールする場合、特に追加手順は必要ありません。KMM をバージョン 4.10 以前にインストールする方法の詳細は、「以前のバージョンの OpenShift Container Platform への Kernel Module Management Operator のインストール」セクションを参照してください。
4.2.1. Web コンソールを使用した Kernel Module Management Operator のインストール
クラスター管理者は、OpenShift Container Platform Web コンソールを使用して Kernel Module Management (KMM) Operator をインストールできます。
手順
- OpenShift Container Platform Web コンソールにログインします。
Kernel Module Management Operator をインストールします。
- OpenShift Container Platform Web コンソールで、Operators → OperatorHub をクリックします。
- 使用可能な Operator のリストから Kernel Module Management Operator を選択し、Install をクリックします。
-
Installed Namespace リストから、
openshift-kmm
namespace を選択します。 - Install をクリックします。
検証
KMM Operator が正常にインストールされたことを確認するには、以下を実行します。
- Operators → Installed Operators ページに移動します。
Kernel Module Management Operator が openshift-kmm プロジェクトにリストされ、Status が InstallSucceeded であることを確認します。
注記インストール時に、Operator は Failed ステータスを表示する可能性があります。インストールが後に InstallSucceeded メッセージを出して正常に実行される場合は、Failed メッセージを無視できます。
トラブルシューティング
Operator のインストールに関する問題をトラブルシューティングするには、以下を実行します。
- Operators → Installed Operators ページに移動し、Operator Subscriptions および Install Plans タブで Status にエラーがあるかどうかを検査します。
-
Workloads → Pods ページに移動し、
openshift-kmm
プロジェクトで Pod のログを確認します。
4.2.2. CLI を使用した Kernel Module Management Operator のインストール
クラスター管理者は、OpenShift CLI を使用して Kernel Module Management (KMM) Operator をインストールできます。
前提条件
- OpenShift Container Platform クラスターが実行中である。
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限があるユーザーとして OpenShift CLI にログインしている。
手順
KMM を
openshift-kmm
namespace にインストールします。次の
Namespace
CR を作成し、YAML ファイル (kmm-namespace.yaml
など) を保存します。apiVersion: v1 kind: Namespace metadata: name: openshift-kmm
次の
OperatorGroup
CR を作成し、YAML ファイル(kmm-op-group.yaml
など) を保存します。apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: kernel-module-management namespace: openshift-kmm
次の
Subscription
CR を作成し、YAML ファイル (kmm-sub.yaml
など) を保存します。apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: kernel-module-management namespace: openshift-kmm spec: channel: release-1.0 installPlanApproval: Automatic name: kernel-module-management source: redhat-operators sourceNamespace: openshift-marketplace startingCSV: kernel-module-management.v1.0.0
以下のコマンドを実行して Subscription オブジェクトを作成します。
$ oc create -f kmm-sub.yaml
検証
Operator のデプロイメントが正常に行われたことを確認するには、次のコマンドを実行します。
$ oc get -n openshift-kmm deployments.apps kmm-operator-controller
出力例
NAME READY UP-TO-DATE AVAILABLE AGE kmm-operator-controller 1/1 1 1 97s
Operator は利用可能です。
4.2.3. 以前のバージョンの OpenShift Container Platform への Kernel Module Management Operator のインストール
KMM Operator は、OpenShift Container Platform 4.12 以降でサポートされています。バージョン 4.10 以前では、新しい SecurityContextConstraint
オブジェクトを作成し、それを Operator の ServiceAccount
にバインドする必要があります。クラスター管理者は、OpenShift CLI を使用して Kernel Module Management (KMM) Operator をインストールできます。
前提条件
- OpenShift Container Platform クラスターが実行中である。
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
権限があるユーザーとして OpenShift CLI にログインしている。
手順
KMM を
openshift-kmm
namespace にインストールします。次の
Namespace
CR を作成し、YAML ファイル (kmm-namespace.yaml
ファイルなど) を保存します。apiVersion: v1 kind: Namespace metadata: name: openshift-kmm
次の
SecurityContextConstraint
オブジェクトを作成し、YAML ファイル(kmm-security-constraint.yaml
など) を保存します。allowHostDirVolumePlugin: false allowHostIPC: false allowHostNetwork: false allowHostPID: false allowHostPorts: false allowPrivilegeEscalation: false allowPrivilegedContainer: false allowedCapabilities: - NET_BIND_SERVICE apiVersion: security.openshift.io/v1 defaultAddCapabilities: null fsGroup: type: MustRunAs groups: [] kind: SecurityContextConstraints metadata: name: restricted-v2 priority: null readOnlyRootFilesystem: false requiredDropCapabilities: - ALL runAsUser: type: MustRunAsRange seLinuxContext: type: MustRunAs seccompProfiles: - runtime/default supplementalGroups: type: RunAsAny users: [] volumes: - configMap - downwardAPI - emptyDir - persistentVolumeClaim - projected - secret
次のコマンドを実行して、
SecurityContextConstraint
オブジェクトを Operator のServiceAccount
にバインドします。$ oc apply -f kmm-security-constraint.yaml
$ oc adm policy add-scc-to-user kmm-security-constraint -z kmm-operator-controller -n openshift-kmm
次の
OperatorGroup
CR を作成し、YAML ファイル(kmm-op-group.yaml
など) を保存します。apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: kernel-module-management namespace: openshift-kmm
次の
Subscription
CR を作成し、YAML ファイル (kmm-sub.yaml
など) を保存します。apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: kernel-module-management namespace: openshift-kmm spec: channel: release-1.0 installPlanApproval: Automatic name: kernel-module-management source: redhat-operators sourceNamespace: openshift-marketplace startingCSV: kernel-module-management.v1.0.0
以下のコマンドを実行して Subscription オブジェクトを作成します。
$ oc create -f kmm-sub.yaml
検証
Operator のデプロイメントが正常に行われたことを確認するには、次のコマンドを実行します。
$ oc get -n openshift-kmm deployments.apps kmm-operator-controller
出力例
NAME READY UP-TO-DATE AVAILABLE AGE kmm-operator-controller 1/1 1 1 97s
Operator は利用可能です。
4.3. Kernel Module Management Operator の設定
ほとんどの場合、Kernel Module Management (KMM) Operator のデフォルト設定を変更する必要はありません。ただし、次の手順を使用して、環境に合わせて Operator 設定を変更できます。
Operator 設定は、Operator namespace の kmm-operator-manager-config
ConfigMap
に設定されています。
手順
設定を変更するには、次のコマンドを入力して
ConfigMap
データを編集します。$ oc edit configmap -n "$namespace" kmm-operator-manager-config
出力例
healthProbeBindAddress: :8081 job: gcDelay: 1h leaderElection: enabled: true resourceID: kmm.sigs.x-k8s.io webhook: disableHTTP2: true # CVE-2023-44487 port: 9443 metrics: enableAuthnAuthz: true disableHTTP2: true # CVE-2023-44487 bindAddress: 0.0.0.0:8443 secureServing: true worker: runAsUser: 0 seLinuxType: spc_t setFirmwareClassPath: /var/lib/firmware
表4.1 Operator 設定パラメーター パラメーター 説明 healthProbeBindAddress
Operator が kubelet ヘルスプローブを監視するアドレスを定義します。推奨値は
:8081
です。job.gcDelay
成功したビルド Pod を削除するまでの保持期間を定義します。この設定に推奨値はありません。この設定の有効な値は、ParseDuration を参照してください。
leaderElection.enabled
leader election を使用して KMM Operator のレプリカが常に 1 つだけ実行されるようにするか決定します。詳細は、リース を参照してください。推奨値は
true
です。leaderElection.resourceID
leader election がリーダーロックを保持するために使用するリソースの名前を決定します。推奨値は
kmm.sigs.x-k8s.io
です。webhook.disableHTTP2
true
の場合、cve-2023-44487 の緩和策として、webhook サーバーの HTTP/2 が無効になります。推奨値はtrue
です。webhook.port
Operator が webhook リクエストを監視するポートを定義します。推奨値は
9443
です。metrics.enableAuthnAuthz
メトリクスの認証に
TokenReviews
を使用し、認可に kube-apiserver でSubjectAccessReviews
を使用するか決定します。認証と認可のために、コントローラーには次のルールを持つ
ClusterRole
が必要です。-
apiGroups: authentication.k8s.io, resources: tokenreviews, verbs: create
-
apiGroups: authorization.k8s.io, resources: subjectaccessreviews, verbs: create
たとえば、Prometheus を使用してメトリクスをスクレイピングするには、クライアントに次のルールを持つ
ClusterRole
が必要です。-
nonResourceURLs: "/metrics", verbs: get
推奨値は
true
です。metrics.disableHTTP2
true
の場合、CVE-2023-44487 の緩和策として、メトリクススサーバーの HTTP/2 が無効になります。推奨値はtrue
です。metrics.bindAddress
メトリクスサーバーのバインドアドレスを決定します。指定しない場合、デフォルトは
:8080
です。メトリクスサーバーを無効にするには、0
に設定します。推奨値は0.0.0.0:8443
です。metrics.secureServing
メトリクスが HTTP ではなく HTTPS 経由で提供されるかどうかを決定します。推奨値は
true
です。worker.runAsUser
ワーカーコンテナーのセキュリティーコンテキストの
runAsUser
フィールド値を決定します。詳細は、SecurityContext を参照してください。推奨値は9443
です。worker.seLinuxType
ワーカーコンテナーのセキュリティーコンテキストの
seLinuxOptions.type
フィールド値を決定します。詳細は、SecurityContext を参照してください。推奨値はspc_t
です。worker.setFirmwareClassPath
カーネルのファームウェア検索パスをノード上の
/sys/module/firmware_class/parameters/path
ファイルに設定します。ワーカーアプリケーションを通じて値を設定する必要がある場合、推奨値は/var/lib/firmware
です。それ以外の場合は設定しません。-
設定を変更したら、次のコマンドでコントローラーを再起動します。
$ oc delete pod -n "<namespace>" -l app.kubernetes.io/component=kmm
注記<namespace> の値は、元のインストール方法によって異なります。
関連情報
- 詳細は、Kernel Module Management Operator のインストール を参照してください。
4.3.1. カーネルモジュールのアンロード
新しいバージョンに移行する場合、またはカーネルモジュールがノードに望ましくない作用をもたらす場合は、カーネルモジュールをアンロードする必要があります。
手順
KMM でロードされたモジュールをノードからアンロードするには、対応する
Module
リソースを削除します。次に、KMM が必要に応じてワーカー Pod を作成し、modprobe -r
を実行してノードからカーネルモジュールをアンロードします。警告ワーカー Pod をアンロードする場合、KMM はカーネルモジュールをロードするときに使用するすべてのリソースを必要とします。これには、
Module
で参照されるServiceAccount
と、特権付き KMM ワーカー Pod の実行を許可するために定義された RBAC が含まれます。また、.spec.imageRepoSecret
で参照されるプルシークレットも含まれます。KMM がノードからカーネルモジュールをアンロードできない状況を回避するには、
Module
リソースがTerminating
などの任意の状態でクラスター内に存在している間は、それらのリソースが削除されないようにしてください。KMM には、少なくとも 1 つのModule
リソースを含む namespaces の削除を拒否する検証アドミッション Webhook が含まれています。
4.3.2. カーネルファームウェア検索パスの設定
ファームウェアの検索パス で説明されているとおり、Linux カーネルは firmware_class.path
パラメーターをファームウェアの検索パスとして受け入れます。
KMM ワーカー Pod は、kmods のロードを試みる前に sysfs に書き込むことで、ノードにこの値を設定できます。
手順
-
ファームウェア検索パスを定義するには、Operator 設定で
worker.setFirmwareClassPath
を/var/lib/firmware
に設定します。
関連情報
-
worker.setFirmwareClassPath
パスの詳細は、Kernel Module Management Operator の設定 を参照してください。
4.4. Kernel Module Management Operator のアンインストール
KMM Operator のインストール方法に応じて、次のいずれかの手順を使用して、Kernel Module Management (KMM) Operator をアンインストールします。
4.4.1. Red Hat カタログインストールのアンインストール
KMM が Red Hat カタログからインストールされた場合は、この手順を使用します。
手順
KMM Operator をアンインストールするには、次の方法を使用します。
- OpenShift コンソールの Operators -→ Installed Operators を使用して、Operator を見つけてアンインストールします。
あるいは、KMM namespace の Subscription
リソースを削除することもできます。
4.4.2. CLI インストールのアンインストール
KMM Operator が OpenShift CLI を使用してインストールされた場合は、このコマンドを使用します。
手順
次のコマンドを実行して、KMM Operator をアンインストールします。
$ oc delete -k https://github.com/rh-ecosystem-edge/kernel-module-management/config/default
注記このコマンドを使用すると、
Module
CRD とクラスター内のすべてのModule
インスタンスが削除されます。
4.5. カーネルモジュールのデプロイ
Kernel Module Management (KMM) は、クラスター内の Node
および Module
リソースを監視して、カーネルモジュールをノードにロードするか、ノードからアンロードするかを決定します。
モジュールのロード対象となるには、ノードに次のものが含まれている必要があります。
-
モジュールの
.spec.selector
フィールドと一致するラベル。 -
モジュールの
.spec.moduleLoader.container.kernelMappings
フィールド内の項目の 1 つと一致するカーネルバージョン。 -
モジュールで順序付きアップグレード (
ordered_upgrade.md
) が設定されている場合、その.spec.moduleLoader.container.version
フィールドと一致するラベル。
KMM は、Module
リソースで設定されている目的の状態に合わせてノードを調整するときに、必要なアクションを実行するためにターゲットノード上にワーカー Pod を作成します。KMM Operator は Pod の結果を監視し、情報を記録します。Operator はこの情報を使用して、モジュールが正常にロードされたときに Node
オブジェクトにラベルを付け、デバイスプラグインを実行します (設定されている場合)。
ワーカー Pod は、次のタスクを実行する KMM worker
バイナリーを実行します。
-
Module
リソースで設定された kmod イメージをプルします。kmod イメージは、.ko
ファイルを含む標準の OCI イメージです。 - Pod のファイルシステム内のイメージを抽出します。
-
指定された引数を使用して
modprobe
を実行し、必要なアクションを実行します。
4.5.1. Module カスタムリソース定義
Module
カスタムリソース定義 (CRD) は、kmod イメージによってクラスター内のすべてまたは一部のノードにロードできるカーネルモジュールを表します。Module
カスタムリソース (CR) は、互換性のある 1 つ以上のカーネルバージョンとノードセレクターを指定します。
Module
リソースの互換性のあるバージョンは、.spec.moduleLoader.container.kernelMappings
の下にリストされています。カーネルマッピングは、literal
バージョンと一致するか、regexp
を使用してそれらの多くを同時に一致させることができます。
Module
リソースの調整ループでは、次の手順が実行されます。
-
.spec.selector
に一致するすべてのノードをリスト表示します。 - それらのノードで実行されているすべてのカーネルバージョンのセットを構築します。
各カーネルバージョンで以下を実行します。
-
.spec.moduleLoader.container.kernelMappings
を調べて、適切なコンテナーイメージ名を見つけます。カーネルマッピングにbuild
またはsign
が定義されていて、コンテナーイメージがまだ存在しない場合は、必要に応じてビルド、署名 Pod、またはその両方を実行します。 -
前のステップで特定したコンテナーイメージをプルし、
modprobe
を実行するワーカー Pod を作成します。 -
.spec.devicePlugin
が定義されている場合は、.spec.devicePlugin.container
で指定された設定を使用して、デバイスプラグインデーモンセットを作成します。
-
以下に対して
garbage-collect
を実行します。-
どのノードも対象としていない、廃止されたデバイスプラグインの
DaemonSets
。 - 成功したビルド Pod。
- 成功した署名 Pod。
-
どのノードも対象としていない、廃止されたデバイスプラグインの
4.5.2. カーネルモジュール間のソフト依存関係を設定する
一部の設定では、複数のカーネルモジュールがシンボルを通じて相互に直接依存していない場合でも、それらのモジュールを特定の順序でロードしなければ適切に動作しません。これはソフト依存関係と呼ばれています。depmod
は通常、これらの依存関係を認識せず、生成するファイルには表示されません。たとえば、mod_a
に mod_b
に対するソフト依存関係がある場合、modprobe mod_a
は mod_b
をロードしません。
このような状況は、modulesLoadingOrder
フィールドを使用してモジュールカスタムリソース定義 (CRD) でソフト依存関係を宣言することで解決できます。
# ... spec: moduleLoader: container: modprobe: moduleName: mod_a dirName: /opt firmwarePath: /firmware parameters: - param=1 modulesLoadingOrder: - mod_a - mod_b
上記の設定では、ワーカー Pod が、kmod イメージから mod_a
をロードする前に、まずツリー内の mod_b
をアンロードしようとします。ワーカー Pod が終了し、mod_a
がアンロードされると、mod_b
は再度ロードされません。
リストの最初の値は最後にロードされ、moduleName
と等しくなければなりません。
4.6. セキュリティーおよびパーミッション
カーネルモジュールのロードは、非常に機密性の高い操作です。それらがロードされると、カーネルモジュールには、ノード上であらゆる種類の操作を実行するためのすべての可能な権限が付与されます。
4.6.1. ServiceAccounts および SecurityContextConstraints
Kernel Module Management (KMM) は、カーネルモジュールをノードにロードするための特権ワークロードを作成します。そのワークロードには、privileged
SecurityContextConstraint
(SCC) リソースの使用を許可された ServiceAccounts
が必要です。
そのワークロードの承認モデルは、Module
リソースの namespace とその仕様によって異なります。
-
.spec.moduleLoader.serviceAccountName
または.spec.devicePlugin.serviceAccountName
フィールドが設定されている場合は常に使用されます。 これらのフィールドが設定されていない場合:
-
Module
リソースが Operator の namespace (デフォルトではopenshift-kmm
) に作成された場合、KMM はデフォルトの強力なServiceAccounts
を使用してワーカーおよびデバイスプラグイン Pod を実行します。 -
Module
リソースがその他の namespace に作成された場合、KMM は namespace のdefault
ServiceAccount
を使用して Pod を実行します。Module
リソースは、privileged
SCC の使用を手動で有効にしない限り、特権ワークロードを実行できません。
-
openshift-kmm
は信頼できる namespace です。
RBAC 権限を設定するときは、ユーザーまたは ServiceAccount
が openshift-kmm
namespace で Module
リソースを作成すると、KMM がクラスター内のすべてのノードで特権ワークロードを自動的に実行することに注意してください。
ServiceAccount
が privileged
SCC を使用してワーカーまたはデバイスプラグイン Pod を実行できるようにするには、次の例のように oc adm policy
コマンドを使用します。
$ oc adm policy add-scc-to-user privileged -z "${serviceAccountName}" [ -n "${namespace}" ]
4.6.2. Pod のセキュリティー基準
OpenShift は、使用中のセキュリティーコンテキストに基づいて namespace Pod セキュリティーレベルを自動的に設定する同期メカニズムを実行します。アクションは不要です。
4.7. ツリー内モジュールをツリー外モジュールに置き換える
Kernel Module Management (KMM) を使用して、オンデマンドでカーネルにロードまたはアンロードできるカーネルモジュールをビルドできます。これらのモジュールは、システムを再起動することなくカーネルの機能を拡張します。モジュールは、ビルトインまたは動的にロードされるように設定できます。
動的にロードされるモジュールには、ツリー内モジュールとツリー外 (OOT) モジュールが含まれます。ツリー内モジュールは、すでにカーネルの一部として Linux カーネルツリーの内部にあります。ツリー外モジュールは、Linux カーネルツリーの外側にあります。これらは通常、ツリー内で出荷されるカーネルモジュールの新しいバージョンのテストや、非互換性に対処するなど、開発およびテストの目的で作成されます。
KMM によってロードされているモジュールの一部は、ノードにすでにロードされているツリー内モジュールを置き換えることができます。モジュールをロードする前にツリー内モジュールをアンロードするには、.spec.moduleLoader.container.inTreeModulesToRemove
フィールドの値をアンロードするモジュールに設定します。以下の例は、すべてのカーネルマッピングのモジュール置換を示しています。
# ... spec: moduleLoader: container: modprobe: moduleName: mod_a inTreeModulesToRemove: [mod_a, mod_b]
この例では、moduleLoader
Pod は、moduleLoader
イメージから mod_a
をロードする前に、inTreeModuleToRemove
を使用してツリー内の mod_a
および mod_b
をアンロードします。moduleLoader`pod is terminated and `mod_a
がアンロードされても、mod_b
は再ロードされません。
以下は、特定のカーネルマッピングのモジュール置換の例です。
# ... spec: moduleLoader: container: kernelMappings: - literal: 6.0.15-300.fc37.x86_64 containerImage: "some.registry/org/my-kmod:${KERNEL_FULL_VERSION}" inTreeModulesToRemove: [<module_name>, <module_name>]
4.7.1. モジュール CR の例
以下は、アノテーション付きの Module
の例です。
apiVersion: kmm.sigs.x-k8s.io/v1beta1 kind: Module metadata: name: <my_kmod> spec: moduleLoader: container: modprobe: moduleName: <my_kmod> 1 dirName: /opt 2 firmwarePath: /firmware 3 parameters: 4 - param=1 kernelMappings: 5 - literal: 6.0.15-300.fc37.x86_64 containerImage: some.registry/org/my-kmod:6.0.15-300.fc37.x86_64 - regexp: '^.+\fc37\.x86_64$' 6 containerImage: "some.other.registry/org/<my_kmod>:${KERNEL_FULL_VERSION}" - regexp: '^.+$' 7 containerImage: "some.registry/org/<my_kmod>:${KERNEL_FULL_VERSION}" build: buildArgs: 8 - name: ARG_NAME value: <some_value> secrets: - name: <some_kubernetes_secret> 9 baseImageRegistryTLS: 10 insecure: false insecureSkipTLSVerify: false 11 dockerfileConfigMap: 12 name: <my_kmod_dockerfile> sign: certSecret: name: <cert_secret> 13 keySecret: name: <key_secret> 14 filesToSign: - /opt/lib/modules/${KERNEL_FULL_VERSION}/<my_kmod>.ko registryTLS: 15 insecure: false 16 insecureSkipTLSVerify: false serviceAccountName: <sa_module_loader> 17 devicePlugin: 18 container: image: some.registry/org/device-plugin:latest 19 env: - name: MY_DEVICE_PLUGIN_ENV_VAR value: SOME_VALUE volumeMounts: 20 - mountPath: /some/mountPath name: <device_plugin_volume> volumes: 21 - name: <device_plugin_volume> configMap: name: <some_configmap> serviceAccountName: <sa_device_plugin> 22 imageRepoSecret: 23 name: <secret_name> selector: node-role.kubernetes.io/worker: ""
- 1 1 1
- 必須。
- 2
- 任意。
- 3
- オプション:
/firmware/*
をノード上の/var/lib/firmware/
にコピーします。 - 4
- 任意。
- 5
- 少なくとも 1 つのカーネル項目が必要です。
- 6
- 正規表現に一致するカーネルを実行しているノードごとに、KMM は
${KERNEL_FULL_VERSION}
をカーネルバージョンに置き換えて、containerImage
で指定されたイメージを実行するDaemonSet
リソースを作成します。 - 7
- その他のカーネルの場合は、
my-kmod
ConfigMap の Dockerfile を使用してイメージをビルドします。 - 8
- 任意。
- 9
- オプション:
some-kubernetes-secret
の値は、/run/secrets/some-kubernetes-secret
のビルド環境から取得できます。 - 10
- このフィールドは効果がありません。kmod イメージをビルドするか、kmod イメージ内で kmod に署名する場合は、信頼できない認証局 (CA) によって署名された証明書を提供するレジストリーから、ベースイメージを時折プルすることを推奨します。KMM がその CA を信頼するには、クラスターの CA バンドルを置き換えて新しい CA も信頼する必要があります。
クラスターの CA バンドルを置き換える方法は、関連情報を参照してください。
- 11
- オプション: このパラメーターは使用しないでください。
true
に設定すると、プレーン HTTP を使用して DockerfileFROM
命令でイメージをプルするときに、ビルドは TLS サーバー証明書の検証をスキップします。 - 12
- 必須。
- 13
- 必須: 鍵 'cert' を持つ公開セキュアブート鍵を保持するシークレット。
- 14
- 必須: 'key' という鍵が含まれるセキュアブート秘密鍵を保持するシークレット。
- 15
- オプション: このパラメーターは使用しないでください。
true
に設定すると、KMM はプレーン HTTP を使用してコンテナーイメージがすでに存在するかどうかを確認できます。 - 16
- オプション: このパラメーターは使用しないでください。
true
に設定すると、コンテナーイメージがすでに存在するかどうかを確認するときに、KMM は TLS サーバー証明書の検証をスキップします。 - 17
- 任意。
- 18
- 任意。
- 19
- 必須: デバイスプラグインセクションが存在する場合。
- 20
- 任意。
- 21
- 任意。
- 22
- 任意。
- 23
- オプション: モジュールローダーとデバイスプラグインイメージをプルするために使用されます。
関連情報
4.8. インツリー依存関係のシンボリックリンク
一部のカーネルモジュールは、ノードのオペレーティングシステムに同梱されている他のカーネルモジュールに依存します。これらの依存関係が kmod イメージにコピーされるのを回避するために、Kernel Module Management (KMM) は、ビルドとワーカー Pod の両方のファイルシステムに /usr/lib/modules
をマウントします。
/opt/usr/lib/modules/<kernel_version>/<symlink_name>
から /usr/lib/modules/<kernel_version>
へのシンボリックリンクを作成することにより、depmod
はビルドノードのファイルシステム上のインツリー kmods を使用して依存関係を解決できます。
実行時に、ワーカー Pod は <symlink_name>
シンボリックリンクを含むイメージ全体を抽出します。このシンボリックリンクは、ノードのファイルシステムからマウントされるワーカー Pod 内の /usr/lib/modules/<kernel_version>
を指します。modprobe
はそのリンクをたどり、必要に応じてインツリーの依存関係をロードできます。
次の例では、host
は /opt/usr/lib/modules/<kernel_version>
の下のシンボリックリンク名です。
ARG DTK_AUTO FROM ${DTK_AUTO} as builder # # Build steps # FROM ubi9/ubi ARG KERNEL_FULL_VERSION RUN dnf update && dnf install -y kmod COPY --from=builder /usr/src/kernel-module-management/ci/kmm-kmod/kmm_ci_a.ko /opt/lib/modules/${KERNEL_FULL_VERSION}/ COPY --from=builder /usr/src/kernel-module-management/ci/kmm-kmod/kmm_ci_b.ko /opt/lib/modules/${KERNEL_FULL_VERSION}/ # Create the symbolic link RUN ln -s /lib/modules/${KERNEL_FULL_VERSION} /opt/lib/modules/${KERNEL_FULL_VERSION}/host RUN depmod -b /opt ${KERNEL_FULL_VERSION}
depmod
は、kmod イメージビルドを実行するノードに存在するカーネルモジュールに基づいて依存関係ファイルを生成します。
KMM がカーネルモジュールをロードするノードでは、modprobe
は、ファイルが /usr/lib/modules/<kernel_version>
の下に存在し、同じファイルシステムレイアウトであることを期待します。ビルドノードとターゲットノードで同じオペレーティングシステムとリリースを共有することを強く推奨します。
4.9. kmod イメージの作成
Kernel Module Management (KMM) は専用の kmod イメージを使用します。これは .ko
ファイルを含む標準 OCI イメージです。.ko
ファイルの場所は、<prefix>/lib/modules/[kernel-version]/
というパターンに従っている必要があります。
.ko
ファイルを扱うときは、次の点に注意してください。
-
ほとんどの場合、
<prefix>
は/opt
と同じになります。これはModule
CRD のデフォルト値です。 -
kernel-version
は空であってはならず、カーネルモジュールのビルドに使用されたカーネルバージョンと同じである必要があります。
4.9.1. depmod の実行
ビルドプロセスの最後に depmod
を実行して、modules.dep
ファイルと .map
ファイルを生成することを推奨します。これは、kmod イメージに複数のカーネルモジュールが含まれており、モジュールの 1 つが別のモジュールに依存している場合に特に便利です。
kernel-devel
パッケージをダウンロードするには、Red Hat Subscription が必要です。
手順
次のコマンドを実行して、特定のカーネルバージョンの
modules.dep
および.map
ファイルを生成します。$ depmod -b /opt ${KERNEL_FULL_VERSION}+`.
4.9.1.1. Dockerfile の例
OpenShift Container Platform でイメージをビルドする場合は、Driver Tool Kit (DTK) の使用を検討してください。
詳細は、資格のあるビルドの使用 を参照してください。
apiVersion: v1 kind: ConfigMap metadata: name: kmm-ci-dockerfile data: dockerfile: | ARG DTK_AUTO FROM ${DTK_AUTO} as builder ARG KERNEL_FULL_VERSION WORKDIR /usr/src RUN ["git", "clone", "https://github.com/rh-ecosystem-edge/kernel-module-management.git"] WORKDIR /usr/src/kernel-module-management/ci/kmm-kmod RUN KERNEL_SRC_DIR=/lib/modules/${KERNEL_FULL_VERSION}/build make all FROM registry.redhat.io/ubi9/ubi-minimal ARG KERNEL_FULL_VERSION RUN microdnf install kmod COPY --from=builder /usr/src/kernel-module-management/ci/kmm-kmod/kmm_ci_a.ko /opt/lib/modules/${KERNEL_FULL_VERSION}/ COPY --from=builder /usr/src/kernel-module-management/ci/kmm-kmod/kmm_ci_b.ko /opt/lib/modules/${KERNEL_FULL_VERSION}/ RUN depmod -b /opt ${KERNEL_FULL_VERSION}
関連情報
4.9.2. クラスターでのビルド
KMM はクラスター内に kmod イメージをビルドできます。次のガイドラインに従ってください。
-
カーネルマッピングの build セクションを使用して
build
命令を提供します。 -
コンテナーイメージの
Dockerfile
をConfigMap
リソースのdockerfile
キーの下にコピーします。 -
ConfigMap
がModule
と同じ namespace にあることを確認します。
KMM は、containerImage
フィールドで指定されたイメージ名が存在するかどうかを確認します。その場合、ビルドはスキップされます。
それ以外の場合、KMM は Build
リソースを作成してイメージをビルドします。イメージがビルドされると、KMM はモジュールの調整を Module
します。以下の例を参照してください。
# ... - regexp: '^.+$' containerImage: "some.registry/org/<my_kmod>:${KERNEL_FULL_VERSION}" build: buildArgs: 1 - name: ARG_NAME value: <some_value> secrets: 2 - name: <some_kubernetes_secret> 3 baseImageRegistryTLS: insecure: false 4 insecureSkipTLSVerify: false 5 dockerfileConfigMap: 6 name: <my_kmod_dockerfile> registryTLS: insecure: false 7 insecureSkipTLSVerify: false 8
- 1
- 任意。
- 2
- 任意。
- 3
/run/secrets/some-kubernetes-secret
としてビルド Pod にマウントされます。- 4
- オプション: このパラメーターは使用しないでください。
true
に設定すると、ビルドはプレーン HTTP を使用して DockerfileFROM
命令でイメージをプルできます。 - 5
- オプション: このパラメーターは使用しないでください。
true
に設定すると、プレーン HTTP を使用して DockerfileFROM
命令でイメージをプルするときに、ビルドは TLS サーバー証明書の検証をスキップします。 - 6
- 必須。
- 7
- オプション: このパラメーターは使用しないでください。
true
に設定すると、KMM はプレーン HTTP を使用してコンテナーイメージがすでに存在するかどうかを確認できます。 - 8
- オプション: このパラメーターは使用しないでください。
true
に設定すると、コンテナーイメージがすでに存在するかどうかを確認するときに、KMM は TLS サーバー証明書の検証をスキップします。
Operator 設定で job.gcDelay
パラメーターが設定されていない限り、成功したビルド Pod にはすぐにガベージコレクションが適用されます。失敗したビルド Pod は常に保存されるため、ビルドを再開するには管理者が手動で削除する必要があります。
4.9.3. Driver Toolkit の使用
Driver Toolkit (DTK) は、ビルド kmod ローダーイメージをビルドするための便利なベースイメージです。これには、クラスターで現在実行されている OpenShift バージョンのツールとライブラリーが含まれています。
手順
マルチステージの Dockerfile
の最初のステージとして DTK を使用します。
- カーネルモジュールをビルドします。
-
.ko
ファイルをubi-minimal
などの小さなエンドユーザーイメージにコピーします。 クラスター内ビルドで DTK を利用するには、
DTK_AUTO
ビルド引数を使用します。この値は、Build
リソースの作成時に KMM によって自動的に設定されます。以下の例を参照してください。ARG DTK_AUTO FROM ${DTK_AUTO} as builder ARG KERNEL_FULL_VERSION WORKDIR /usr/src RUN ["git", "clone", "https://github.com/rh-ecosystem-edge/kernel-module-management.git"] WORKDIR /usr/src/kernel-module-management/ci/kmm-kmod RUN KERNEL_SRC_DIR=/lib/modules/${KERNEL_FULL_VERSION}/build make all FROM ubi9/ubi-minimal ARG KERNEL_FULL_VERSION RUN microdnf install kmod COPY --from=builder /usr/src/kernel-module-management/ci/kmm-kmod/kmm_ci_a.ko /opt/lib/modules/${KERNEL_FULL_VERSION}/ COPY --from=builder /usr/src/kernel-module-management/ci/kmm-kmod/kmm_ci_b.ko /opt/lib/modules/${KERNEL_FULL_VERSION}/ RUN depmod -b /opt ${KERNEL_FULL_VERSION}
関連情報
4.10. Kernel Module Management (KMM) による署名の使用
セキュアブートが有効なシステムでは、すべてのカーネルモジュール (kmods) は、マシン所有者の鍵 (MOK) データベースに登録された公開/秘密鍵のペアで署名する必要があります。ディストリビューションの一部として配布されるドライバーは、ディストリビューションの秘密鍵によってすでに署名されている必要がありますが、ツリー外でビルドされたカーネルモジュールの場合、KMM はカーネルマッピングの sign
セクションを使用したカーネルモジュールへの署名をサポートします。
セキュアブートの使用の詳細は、公開鍵と秘密鍵のペアの生成 を参照してください。
前提条件
- 正しい (DER) 形式の公開秘密鍵ペア。
- 公開鍵が MOK データベースに登録されている、少なくとも 1 つのセキュアブート対応ノード。
-
ビルド済みのドライバーコンテナーイメージ、またはクラスター内でビルドするために必要なソースコードと
Dockerfile
のいずれか。
4.11. secureboot の鍵の追加
KMM Kernel Module Management (KMM) を使用してカーネルモジュールに署名するには、証明書と秘密鍵が必要です。これらの作成方法の詳細は、公開鍵と秘密鍵のペアの生成 を参照してください。
公開鍵と秘密鍵のペアを抽出する方法の詳細は、秘密鍵を使用してカーネルモジュールに署名する を参照してください。手順 1 ~ 4 を使用して、キーをファイルに抽出します。
手順
証明書を含む
sb_cert.cer
ファイルと、秘密鍵を含むsb_cert.priv
ファイルを作成します。$ openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 -batch -config configuration_file.config -outform DER -out my_signing_key_pub.der -keyout my_signing_key.priv
次のいずれかの方法を使用して、ファイルを追加します。
ファイルを シークレット として直接追加します。
$ oc create secret generic my-signing-key --from-file=key=<my_signing_key.priv>
$ oc create secret generic my-signing-key-pub --from-file=cert=<my_signing_key_pub.der>
base64 エンコーディングでファイルを追加します。
$ cat sb_cert.priv | base64 -w 0 > my_signing_key2.base64
$ cat sb_cert.cer | base64 -w 0 > my_signing_key_pub.base64
エンコードされたテキストを YAML ファイルに追加します。
apiVersion: v1 kind: Secret metadata: name: my-signing-key-pub namespace: default 1 type: Opaque data: cert: <base64_encoded_secureboot_public_key> --- apiVersion: v1 kind: Secret metadata: name: my-signing-key namespace: default 2 type: Opaque data: key: <base64_encoded_secureboot_private_key>
YAML ファイルを適用します。
$ oc apply -f <yaml_filename>
4.11.1. キーの確認
キーを追加したら、キーが正しく設定されていることを確認する必要があります。
手順
公開鍵シークレットが正しく設定されていることを確認します。
$ oc get secret -o yaml <certificate secret name> | awk '/cert/{print $2; exit}' | base64 -d | openssl x509 -inform der -text
これにより、シリアル番号、発行者、サブジェクトなどを含む証明書が表示されます。
秘密鍵シークレットが正しく設定されていることを確認します。
$ oc get secret -o yaml <private key secret name> | awk '/key/{print $2; exit}' | base64 -d
これにより、
-----BEGIN PRIVATE KEY-----
および-----END PRIVATE KEY-----
行で囲まれたキーが表示されます。
4.12. ビルド済みイメージ内の kmods への署名
ハードウェアベンダーによって配布されたイメージや別の場所でビルドされたイメージなど、ビルド済みのイメージがある場合は、この手順を使用します。
次の YAML ファイルは、公開鍵と秘密鍵のペアを必要なキー名 (秘密鍵の場合は key
、公開鍵の場合は cert)
を持つシークレットとして追加します。次に、クラスターは unsignedImage
イメージをプルダウンし、これを開いて filesToSign
に一覧表示されているカーネルモジュールに署名し、それらを再び追加し、作成されたイメージを containerImage
としてプッシュします。
次に、KMM は、セレクターに一致するすべてのノードに署名された kmod をロードします。kmods は、MOK データベースに公開鍵を持つすべてのノード、およびセキュアブートが有効になっていないすべてのノード (署名を無視するノード) に正常にロードされます。
前提条件
-
keySecret
およびcertSecret
シークレットが、残りのリソースと同じ namespace に作成されている。
手順
YAML ファイルを適用します。
--- apiVersion: kmm.sigs.x-k8s.io/v1beta1 kind: Module metadata: name: example-module spec: moduleLoader: serviceAccountName: default container: modprobe: 1 moduleName: '<module_name>' kernelMappings: # the kmods will be deployed on all nodes in the cluster with a kernel that matches the regexp - regexp: '^.*\.x86_64$' # the container to produce containing the signed kmods containerImage: <image_name> 2 sign: # the image containing the unsigned kmods (we need this because we are not building the kmods within the cluster) unsignedImage: <image_name> 3 keySecret: # a secret holding the private secureboot key with the key 'key' name: <private_key_secret_name> certSecret: # a secret holding the public secureboot key with the key 'cert' name: <certificate_secret_name> filesToSign: # full path within the unsignedImage container to the kmod(s) to sign - /opt/lib/modules/4.18.0-348.2.1.el8_5.x86_64/kmm_ci_a.ko imageRepoSecret: # the name of a secret containing credentials to pull unsignedImage and push containerImage to the registry name: repo-pull-secret selector: kubernetes.io/arch: amd64
4.13. kmod イメージのビルドと署名
ソースコードがあり、最初にイメージをビルドする必要がある場合は、この手順を使用します。
次の YAML ファイルは、リポジトリーのソースコードを使用して新しいコンテナーイメージをビルドします。生成されたイメージは一時的な名前でレジストリーに保存され、この一時的なイメージは sign
セクションのパラメーターを使用して署名されます。
一時的なイメージ名は最終的なイメージ名に基づいており、<containerImage>:<tag>-<namespace>_<module name>_kmm_unsigned
に設定されています。
たとえば、Kernel Module Management (KMM) は、次の YAML ファイルを使用して、署名のない kmod を含むビルドを含む example.org/repository/minimal-driver:final-default_example-module_kmm_unsigned
という名前のイメージをビルドし、レジストリーにプッシュします。次に、署名された kmod を含む example.org/repository/minimal-driver:final
という名前の 2 番目のイメージを作成します。この 2 番目のイメージは、ワーカー Pod によってプルされ、クラスターノードにロードされる kmod を含んでいます。
一時的なイメージは、署名後にレジストリーから安全に削除できます。必要に応じて再構築されます。
前提条件
-
keySecret
およびcertSecret
シークレットが、残りのリソースと同じ namespace に作成されている。
手順
YAML ファイルを適用します。
--- apiVersion: v1 kind: ConfigMap metadata: name: example-module-dockerfile namespace: <namespace> 1 data: Dockerfile: | ARG DTK_AUTO ARG KERNEL_VERSION FROM ${DTK_AUTO} as builder WORKDIR /build/ RUN git clone -b main --single-branch https://github.com/rh-ecosystem-edge/kernel-module-management.git WORKDIR kernel-module-management/ci/kmm-kmod/ RUN make FROM registry.access.redhat.com/ubi9/ubi:latest ARG KERNEL_VERSION RUN yum -y install kmod && yum clean all RUN mkdir -p /opt/lib/modules/${KERNEL_VERSION} COPY --from=builder /build/kernel-module-management/ci/kmm-kmod/*.ko /opt/lib/modules/${KERNEL_VERSION}/ RUN /usr/sbin/depmod -b /opt --- apiVersion: kmm.sigs.x-k8s.io/v1beta1 kind: Module metadata: name: example-module namespace: <namespace> 2 spec: moduleLoader: serviceAccountName: default 3 container: modprobe: moduleName: simple_kmod kernelMappings: - regexp: '^.*\.x86_64$' containerImage: <final_driver_container_name> build: dockerfileConfigMap: name: example-module-dockerfile sign: keySecret: name: <private_key_secret_name> certSecret: name: <certificate_secret_name> filesToSign: - /opt/lib/modules/4.18.0-348.2.1.el8_5.x86_64/kmm_ci_a.ko imageRepoSecret: 4 name: repo-pull-secret selector: # top-level selector kubernetes.io/arch: amd64
関連情報
4.14. KMM ハブおよびスポーク
ハブおよびスポークシナリオでは、多くのスポーククラスターが中央の強力なハブクラスターに接続されます。Kernel Module Management (KMM) は、ハブおよびスポーク環境で動作するために Red Hat Advanced Cluster Management (RHACM) に依存します。
KMM は、KMM 機能の分離によりハブおよびスポーク環境と互換性があります。既存の Module
CRD をラップし、特定のスポーククラスターに拡張するために、ManagedClusterModule
カスタムリソース定義 (CRD) が提供されています。また、ハブクラスター上でイメージを構築し、モジュールに署名する新しいスタンドアロンコントローラーである KMM-Hub も提供されます。
ハブおよびスポークのセットアップでは、スポークはハブクラスターによって集中管理される、リソースに制約のある集中的なクラスターです。スポークは、リソースを大量に消費する機能を無効にした状態で、KMM の単一クラスターエディションを実行します。KMM をこの環境に適応させるには、ハブが高価なタスクを処理しながら、スポークで実行されるワークロードを最小限に抑える必要があります。
カーネルモジュールイメージの構築と .ko
ファイルへの署名は、ハブ上で実行する必要があります。モジュールローダーおよびデバイスプラグイン DaemonSet
のスケジューリングは、スポーク上でのみ実行できます。
4.14.1. KMM-Hub
KMM プロジェクトは、ハブクラスター専用の KMM エディションである KMM-Hub を提供します。KMM-Hub は、スポーク上で実行しているすべてのカーネルバージョンを監視し、カーネルモジュールを受け取る必要があるクラスター上のノードを決定します。
KMM-Hub は、イメージのビルドや kmod 署名などの計算集約型タスクをすべて実行し、RHACM を介してスポークに転送されるようにトリミングされた Module
を準備します。
KMM-Hub を使用してハブクラスターにカーネルモジュールをロードすることはできません。カーネルモジュールをロードするには、KMM の通常版をインストールします。
関連情報
4.14.2. KMM-Hub のインストール
次のいずれかの方法を使用して、KMM-Hub をインストールできます。
- Operator Lifecycle Manager (OLM) の使用
- KMM リソースの作成
関連情報
4.14.2.1. Operator Lifecycle Manager を使用した KMM-Hub のインストール
OpenShift コンソールの Operators セクションを使用して、KMM-Hub をインストールします。
4.14.2.2. KMM リソースの作成による KMM-Hub のインストール
手順
-
KMM-Hub をプログラムでインストールする場合は、次のリソースを使用して、
Namespace
リソース、OperatorGroup
リソース、およびSubscription
リソースを作成できます。
--- apiVersion: v1 kind: Namespace metadata: name: openshift-kmm-hub --- apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: kernel-module-management-hub namespace: openshift-kmm-hub --- apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: kernel-module-management-hub namespace: openshift-kmm-hub spec: channel: stable installPlanApproval: Automatic name: kernel-module-management-hub source: redhat-operators sourceNamespace: openshift-marketplace
4.14.3. ManagedClusterModule
CRD の使用
ManagedClusterModule
カスタムリソース定義 (CRD) を使用して、スポーククラスターでのカーネルモジュールのデプロイメントを設定します。この CRD はクラスタースコープであり、Module
仕様をラップし、次の追加フィールドを追加します。
apiVersion: hub.kmm.sigs.x-k8s.io/v1beta1 kind: ManagedClusterModule metadata: name: <my-mcm> # No namespace, because this resource is cluster-scoped. spec: moduleSpec: 1 selector: 2 node-wants-my-mcm: 'true' spokeNamespace: <some-namespace> 3 selector: 4 wants-my-mcm: 'true'
ビルドまたは署名の命令が .spec.moduleSpec
に存在すると、その Pod はオペレーターの namespace のハブクラスター上で実行します。
.spec.selector
が 1 つ以上の ManagedCluster
リソースと一致すると、KMM-Hub は対応する namespace に ManifestWork
リソースを作成します。ManifestWork
には、カーネルマッピングは保持されていますが、すべての build
と sign
サブセクションが削除された、トリミングされた Module
リソースが含まれています。タグで終わるイメージ名を含む containerImage
フィールドは、同等のダイジェストに置き換えられます。
4.14.4. スポーク上で KMM の実行
Kernel Module Management (KMM) をスポークにインストールしたら、それ以上の操作は必要ありません。ハブから ManagedClusterModule
オブジェクトを作成して、スポーククラスターにカーネルモジュールをデプロイします。
手順
RHACM Policy
オブジェクトを通じて KMM をスポーククラスターにインストールできます。OperatorHub から KMM をインストールし、軽量スポークモードで実行することに加えて、Policy
は、RHACM エージェントが Module
リソースを管理できるようにするために必要な追加の RBAC を設定します。
次の RHACM ポリシーを使用して、スポーククラスターに KMM をインストールします。
--- apiVersion: policy.open-cluster-management.io/v1 kind: Policy metadata: name: install-kmm spec: remediationAction: enforce disabled: false policy-templates: - objectDefinition: apiVersion: policy.open-cluster-management.io/v1 kind: ConfigurationPolicy metadata: name: install-kmm spec: severity: high object-templates: - complianceType: mustonlyhave objectDefinition: apiVersion: v1 kind: Namespace metadata: name: openshift-kmm - complianceType: mustonlyhave objectDefinition: apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: kmm namespace: openshift-kmm spec: upgradeStrategy: Default - complianceType: mustonlyhave objectDefinition: apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: kernel-module-management namespace: openshift-kmm spec: channel: stable config: env: - name: KMM_MANAGED 1 value: "1" installPlanApproval: Automatic name: kernel-module-management source: redhat-operators sourceNamespace: openshift-marketplace - complianceType: mustonlyhave objectDefinition: apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: kmm-module-manager rules: - apiGroups: [kmm.sigs.x-k8s.io] resources: [modules] verbs: [create, delete, get, list, patch, update, watch] - complianceType: mustonlyhave objectDefinition: apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: klusterlet-kmm subjects: - kind: ServiceAccount name: klusterlet-work-sa namespace: open-cluster-management-agent roleRef: kind: ClusterRole name: kmm-module-manager apiGroup: rbac.authorization.k8s.io --- apiVersion: apps.open-cluster-management.io/v1 kind: PlacementRule metadata: name: all-managed-clusters spec: clusterSelector: 2 matchExpressions: [] --- apiVersion: policy.open-cluster-management.io/v1 kind: PlacementBinding metadata: name: install-kmm placementRef: apiGroup: apps.open-cluster-management.io kind: PlacementRule name: all-managed-clusters subjects: - apiGroup: policy.open-cluster-management.io kind: Policy name: install-kmm
4.15. カーネルモジュールのアップグレードのカスタマイズ
必要に応じて、ノードの再起動など、ノードでのメンテナンス操作の実行中にカーネルモジュールをアップグレードします。クラスターで実行しているワークロードへの影響を最小限に抑えるには、カーネルのアップグレードプロセスを一度に 1 つずつ実行します。
この手順では、カーネルモジュールを使用するワークロードに関する知識が必要で、クラスター管理者が管理する必要があります。
前提条件
-
アップグレードする前に、カーネルモジュールで使用されるすべてのノードで
kmm.node.kubernetes.io/version-module.<module_namespace>.<module_name>=$moduleVersion
ラベルを設定します。 - ノード上のすべてのユーザーアプリケーションワークロードを終了するか、別のノードに移動します。
- 現在読み込み済みのカーネルモジュールをアンロードします。
- カーネルモジュールをアンロードする前にユーザーワークロード (カーネルモジュールにアクセスしているクラスター内で実行されているアプリケーション) がノード上で実行していないこと、および新しいカーネルモジュールバージョンがロードされた後にワークロードがノード上で再び実行していることを確認します。
手順
- ノード上の KMM によって管理されているデバイスプラグインがアンロードされていることを確認します。
Module
カスタムリソース (CR) の次のフィールドを更新します。-
containerImage
(適切なカーネルバージョンへ) version
更新はアトミックである必要があります。つまり、
containerImage
フィールドとversion
フィールドの両方を同時に更新する必要があります。
-
- アップグレードしているノードのカーネルモジュールを使用して、すべてのワークロードを終了します。
ノードの
kmm.node.kubernetes.io/version-module.<module_namespace>.<module_name>
ラベルを削除します。次のコマンドを実行して、ノードからカーネルモジュールをアンロードします。$ oc label node/<node_name> kmm.node.kubernetes.io/version-module.<module_namespace>.<module_name>-
必要に応じて、クラスター管理者として、カーネルモジュールのアップグレードに必要な追加のメンテナンスをノード上で実行します。
追加のアップグレードが必要ない場合は、
kmm.node.kubernetes.io/version-module.<module_namespace>.<module_name>
ラベル値を、Module
の設定どおりに新しい$moduleVersion
に更新して、手順 3 から 6 を省略できます。次のコマンドを実行して、
kmm.node.kubernetes.io/version-module.<module_namespace>.<module_name>=$moduleVersion
ラベルをノードに追加します。$moduleVersion
は、Module
CR のversion
フィールドの新しい値と等しくなければなりません。$ oc label node/<node_name> kmm.node.kubernetes.io/version-module.<module_namespace>.<module_name>=<desired_version>
注記ラベル名の Kubernetes の制限により、
Module
名と namespace の組み合わせの長さが 39 文字を超えることができません。- ノード上のカーネルモジュールを活用するワークロードを復元します。
- ノード上の KMM によって管理されるデバイスプラグインをリロードします。
4.16. Day 1 カーネルモジュールのロード
Kernel Module Management (KMM) は通常、Day 2 Operator です。カーネルモジュールは、Linux (RHCOS) サーバーの初期化が完了しなければロードされません。ただし、シナリオによっては、カーネルモジュールを早い段階でロードする必要があります。Day 1 機能を使用すると、Linux systemd
の初期化段階で Machine Config Operator (MCO) を使用してカーネルモジュールをロードできます。
4.16.1. Day 1 のサポート対象ユースケース
Day 1 機能がサポートするユースケースの数は限られています。主なユースケースは、NetworkManager サービスの初期化前にツリー外 (OOT) のカーネルモジュールをロードできるようにすることです。initramfs
段階でのカーネルモジュールのロードはサポートされていません。
Day 1 機能に必要な条件は次のとおりです。
- カーネルモジュールはカーネルにロードされていない。
- ツリー内カーネルモジュールがカーネルにロードされているが、アンロードして OOT カーネルモジュールに置き換えることができる。これは、ツリー内モジュールが他のカーネルモジュールから参照されていないことを意味します。
- Day 1 機能が正常に機能するためには、ノードに機能するネットワークインターフェイス、つまりそのインターフェイス用のツリー内カーネルドライバーが必要。OOT カーネルモジュールは、正常に機能するネットワークドライバーを置き換えるネットワークドライバーにできます。
4.16.2. OOT カーネルモジュールのローディングフロー
ツリー外 (OOT) カーネルモジュールのロードには、Machine Config Operator (MCO) が利用されます。フローシーケンスは次のとおりです。
手順
-
MachineConfig
リソースを実行中の既存クラスターに適用します。更新する必要があるノードを特定するには、適切なMachineConfigPool
リソースを作成する必要があります。 -
MCO はノードごとに再起動を適用します。再起動されたノードには、
pull
サービスとload
サービスという 2 つの新しいsystemd
サービスがデプロイされます。 -
load
サービスは、NetworkConfiguration
サービスの前に実行されるように設定されています。サービスは、事前定義されたカーネルモジュールイメージをプルし、次にそのイメージを使用してツリー内モジュールをアンロードし、OOT カーネルモジュールをロードしようとします。 -
pull
サービスは、NetworkManager サービスの後に実行されるように設定されています。サービスは、事前設定されたカーネルモジュールイメージがノードのファイルシステム上に配置されているか確認します。そのようになっている場合、サービスは正常に存在し、サーバーはブートプロセスを続行します。そうでない場合は、イメージをノードにプルし、その後ノードを再起動します。
4.16.3. カーネルモジュールイメージ
Day 1 機能は、Day 2 KMM ビルドで利用されるのと同じ DTK ベースのイメージを使用します。ツリー外のカーネルモジュールは、/opt/lib/modules/${kernelVersion}
の配下にある必要があります。
関連情報
4.16.4. ツリー内モジュールの置き換え
Day 1 機能は常に、ツリー内のカーネルモジュールを OOT バージョンに置き換えようとします。ツリー内カーネルモジュールがロードされていない場合、フローは影響を受けません。サービスは続行し、OOT カーネルモジュールをロードします。
4.16.5. MCO yaml の作成
KMM は、Day 1 機能の MCO YAML マニフェストの作成に使用する API を提供します。
ProduceMachineConfig(machineConfigName, machineConfigPoolRef, kernelModuleImage, kernelModuleName string) (string, error)
返される出力は、適用される MCO YAML マニフェストの文字列表現です。この YAML を適用するかどうかはお客様が判断します。
パラメーターは以下のとおりです。
machineConfigName
-
MCO YAML マニフェストの名前。このパラメーターは、MCO YAML マニフェストのメタデータの
name
パラメーターとして設定されます。 machineConfigPoolRef
-
ターゲットノードを識別するために使用される
MachineConfigPool
名。 kernelModuleImage
- OOT カーネルモジュールを含むコンテナーイメージの名前。
kernelModuleName
- OOT カーネルモジュールの名前。このパラメーターは、ツリー内カーネルモジュール (カーネルにロードされている場合) のアンロードと OOT カーネルモジュールのロードの両方に使用されます。
API は、KMM ソースコードの pkg/mcproducer
パッケージの下にあります。Day 1 機能を使用するために KMM Operator を実行する必要はありません。必要なのは、pkg/mcproducer
パッケージを Operator/ユーティリティーコードにインポートし、API を呼び出し、生成された MCO YAML をクラスターに適用することだけです。
4.16.6. MachineConfigPool
MachineConfigPool
は、適用された MCO の影響を受けるノードのコレクションを識別します。
kind: MachineConfigPool metadata: name: sfc spec: machineConfigSelector: 1 matchExpressions: - {key: machineconfiguration.openshift.io/role, operator: In, values: [worker, sfc]} nodeSelector: 2 matchLabels: node-role.kubernetes.io/sfc: "" paused: false maxUnavailable: 1
OCP クラスターには、事前定義された MachineConfigPool
があります。
-
worker
: クラスター内のすべてのワーカーノードをターゲットにします -
master
: クラスター内のすべてのマスターノードをターゲットにします
マスター MachineConfigPool
をターゲットにするために、次の MachineConfig
を定義します。
metadata: labels: machineconfiguration.opensfhit.io/role: master
ワーカー MachineConfigPool
をターゲットにするために、次の MachineConfig
を定義します。
metadata: labels: machineconfiguration.opensfhit.io/role: worker
4.17. デバッグとトラブルシューティング
ドライバーコンテナー内の kmod が署名されていないか、間違ったキーで署名されている場合、コンテナーは PostStartHookError
または CrashLoopBackOff
ステータスに入る可能性があります。コンテナーで oc describe
コマンドを実行することで確認できます。このシナリオでは、次のメッセージが表示されます。
modprobe: ERROR: could not insert '<your_kmod_name>': Required key not available
4.18. KMM ファームウェアのサポート
カーネルモジュールは、ファイルシステムからファームウェアファイルをロードする必要がある場合があります。KMM は、kmod イメージからノードのファイルシステムへのファームウェアファイルのコピーをサポートしています。
modprobe
コマンドを実行してカーネルモジュールを挿入する前に、.spec.moduleLoader.container.modprobe.firmwarePath
の内容がノードの /var/lib/firmware
パスにコピーされます。
Pod の終了時に modprobe -r
コマンドを実行してカーネルモジュールをアンロードする前に、すべてのファイルと空のディレクトリーがその場所から削除されます。
4.18.1. ノードでのルックアップパスの設定
OpenShift Container Platform ノードでは、ファームウェアのデフォルトのルックアップパスのセットに /var/lib/firmware
パスが含まれません。
手順
Machine Config Operator を使用して、
/var/lib/firmware
パスを含むMachineConfig
カスタムリソース (CR) を作成します。apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker 1 name: 99-worker-kernel-args-firmware-path spec: kernelArguments: - 'firmware_class.path=/var/lib/firmware'
- 1
- 必要に応じてラベルを設定できます。単一ノードの OpenShift の場合は、
control-pane
またはmaster
オブジェクトのいずれかを使用します。
-
MachineConfig
CR を適用すると、ノードが自動的に再起動されます。
4.18.2. kmod イメージのビルド
手順
カーネルモジュール自体をビルドするだけでなく、バイナリーファームウェアをビルダーイメージに含めます。
FROM registry.redhat.io/ubi9/ubi-minimal as builder # Build the kmod RUN ["mkdir", "/firmware"] RUN ["curl", "-o", "/firmware/firmware.bin", "https://artifacts.example.com/firmware.bin"] FROM registry.redhat.io/ubi9/ubi-minimal # Copy the kmod, install modprobe, run depmod COPY --from=builder /firmware /firmware
4.18.3. モジュールリソースのチューニング
手順
Module
カスタムリソース (CR) で.spec.moduleLoader.container.modprobe.firmwarePath
を設定します。apiVersion: kmm.sigs.x-k8s.io/v1beta1 kind: Module metadata: name: my-kmod spec: moduleLoader: container: modprobe: moduleName: my-kmod # Required firmwarePath: /firmware 1
- 1
- オプション:
/firmware/*
をノード上の/var/lib/firmware/
にコピーします。
4.19. Day 0 から Day 2 までの kmod インストール
Kernel Module Management (KMM) を使用せずに、Day 0 から Day 2 の操作中にいくつかのカーネルモジュール (kmod) をインストールできます。これは、kmod から KMM への移行に役立ちます。
適切な kmod インストールを決定するには、次の基準を使用します。
- Day 0
クラスター内でノードが
Ready
になるために必要な最も基本的な kmods。これらのタイプの kmod の例は次のとおりです。- ブートプロセスの一部として rootFS をマウントするために必要なストレージドライバー
-
マシンがブートストラップノード上の
machine-config-server
にアクセスして ignition をプルし、クラスターに参加するために必要なネットワークドライバー
- Day 1
クラスター内でノードが
Ready
になるために必要ではありませんが、ノードがReady
のときにアンロードできない Kmods。このタイプの kmod の例としては、
NetworkManager
が依存している間に NIC の潜在能力を最大限に活用するために、古くなったツリー内ドライバーを置き換えるツリー外 (OOT) ネットワークドライバーがあります。ノードがReady
の場合、NetworkManager
の依存関係のため、ドライバーをアンロードすることはできません。- Day 2
接続性などのクラスターインフラストラクチャーに干渉することなく、カーネルに動的にロードしたり、カーネルから削除したりできる Kmod。
これらのタイプの kmod の例は次のとおりです。
- GPU Operator
- セカンダリーネットワークアダプター
- Field-Programmable Gate Array (FPGA) デバイス
4.19.1. 背景のレイヤー化
Day 0 kmod がクラスターにインストールされると、Machine Config Operator (MCO) を通じてレイヤー化が適用され、OpenShift Container Platform のアップグレードによってノードのアップグレードはトリガーされません。
ノードのオペレーティングシステムは同じままなので、ドライバーに新しい機能を追加する場合にのみ、ドライバーを再コンパイルする必要があります。
4.19.2. ライフサイクル管理
ドライバーが許可している場合は、KMM を活用して、再起動せずに kmod の Day 0 から Day 2 までのライフサイクルを管理できます。
たとえば、initramfs
ファイルの再構築が必要な場合など、アップグレードにノードの再起動が必要な場合、これは機能しません。
ライフサイクル管理には、次のいずれかのオプションを使用します。
4.19.2.1. kmod をツリー内ドライバーとして扱う
kmods をアップグレードする場合は、この方法を使用します。この場合、kmod をインツリードライバーとして扱い、inTreeRemoval
フィールドを持つクラスター内に Module
を作成して、古いバージョンのドライバーをアンロードします。
kmod をインツリードライバーとして扱う場合の次の特性に注意してください。
- KMM が選択されたすべてのノードで同時に kmod をアンロードおよびロードしようとすると、ダウンタイムが発生する可能性があります。
- これは、KMM が単一の Pod を使用してドライバーをアンロードおよびロードするため、ドライバーを削除するとノードの接続が失われる場合に機能します。
4.19.2.2. 順序付きアップグレードの使用
順序付きアップグレード (ordered_upgrade.md) を使用すると、kmod がすでにロードされているため、効果のない kmod を表すクラスター内にバージョン管理された Module
を作成できます。
順序付きアップグレードを使用する場合は、次の特性に注意してください。
- アップグレードのペースと同時にアップグレードされるノードの数を制御できるため、クラスターのダウンタイムは発生しません。したがって、ダウンタイムのないアップグレードが可能になります。
- ドライバーをアンロードするとノードへの接続が失われる場合、この方法は機能しません。これは、KMM がアンロード用とロード用に 2 つの異なるワーカー Pod を作成するためです。これらの Pod はスケジュールされません。
4.20. KMM のトラブルシューティング
KMM インストール問題のトラブルシューティングを行う場合、ログを監視して、どの段階で問題が発生したかを判断できます。次に、その段階に関連する診断データを取得します。
4.20.1. Operator のログの確認
次の例のように oc logs
コマンドを使用すると、Operator のログを確認できます。
KMM コントローラーのコマンド例
$ oc logs -fn openshift-kmm deployments/kmm-operator-controller
KMM Webhook サーバーのコマンド例
$ oc logs -fn openshift-kmm deployments/kmm-operator-webhook-server
KMM-Hub コントローラーのコマンド例
$ oc logs -fn openshift-kmm-hub deployments/kmm-operator-hub-controller
KMM-Hub Webhook サーバーのコマンド例
$ oc logs -fn openshift-kmm deployments/kmm-operator-hub-webhook-server
4.20.2. イベントの観察
KMM イベントを表示するには、次の方法を使用します。
ビルドとサイン
KMM は、kmod イメージのビルドを開始するたびに、またはその結果を確認するたびにイベントをパブリッシュします。このイベントは、Module
オブジェクトにアタッチされ、次の例のように、oc describe module
コマンドの出力の最後に表示されます。
$ oc describe modules.kmm.sigs.x-k8s.io kmm-ci-a [...] Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal BuildCreated 2m29s kmm Build created for kernel 6.6.2-201.fc39.x86_64 Normal BuildSucceeded 63s kmm Build job succeeded for kernel 6.6.2-201.fc39.x86_64 Normal SignCreated 64s (x2 over 64s) kmm Sign created for kernel 6.6.2-201.fc39.x86_64 Normal SignSucceeded 57s kmm Sign job succeeded for kernel 6.6.2-201.fc39.x86_64
モジュールのロードまたはアンロード
KMM は、ノード上でカーネルモジュールを正常にロードまたはアンロードするたびにイベントをパブリッシュします。このイベントは、Node
オブジェクトにアタッチされ、次の例のように、oc describe node
コマンドの出力の最後に表示されます。
$ oc describe node my-node [...] Events: Type Reason Age From Message ---- ------ ---- ---- ------- [...] Normal ModuleLoaded 4m17s kmm Module default/kmm-ci-a loaded into the kernel Normal ModuleUnloaded 2s kmm Module default/kmm-ci-a unloaded from the kernel
4.20.3. must-gather ツールの使用
oc adm must-gather
コマンドは、サポートバンドルを収集してデバッグ情報を Red Hat サポートに提供するための推奨される方法です。次のセクションで説明するように、適切な引数を指定してコマンドを実行し、特定の情報を収集します。
関連情報
4.20.3.1. KMM のデータの収集
手順
KMM Operator コントローラーマネージャーのデータを収集します。
MUST_GATHER_IMAGE
変数を設定します。$ export MUST_GATHER_IMAGE=$(oc get deployment -n openshift-kmm kmm-operator-controller -ojsonpath='{.spec.template.spec.containers[?(@.name=="manager")].env[?(@.name=="RELATED_IMAGE_MUST_GATHER")].value}') $ oc adm must-gather --image="${MUST_GATHER_IMAGE}" -- /usr/bin/gather
注記KMM をカスタム namespace にインストールしている場合は、
-n <namespace>
スイッチを使用して namespace を指定します。must-gather
ツールを実行します。$ oc adm must-gather --image="${MUST_GATHER_IMAGE}" -- /usr/bin/gather
Operator ログを表示します。
$ oc logs -fn openshift-kmm deployments/kmm-operator-controller
例4.1 出力例
I0228 09:36:37.352405 1 request.go:682] Waited for 1.001998746s due to client-side throttling, not priority and fairness, request: GET:https://172.30.0.1:443/apis/machine.openshift.io/v1beta1?timeout=32s I0228 09:36:40.767060 1 listener.go:44] kmm/controller-runtime/metrics "msg"="Metrics server is starting to listen" "addr"="127.0.0.1:8080" I0228 09:36:40.769483 1 main.go:234] kmm/setup "msg"="starting manager" I0228 09:36:40.769907 1 internal.go:366] kmm "msg"="Starting server" "addr"={"IP":"127.0.0.1","Port":8080,"Zone":""} "kind"="metrics" "path"="/metrics" I0228 09:36:40.770025 1 internal.go:366] kmm "msg"="Starting server" "addr"={"IP":"::","Port":8081,"Zone":""} "kind"="health probe" I0228 09:36:40.770128 1 leaderelection.go:248] attempting to acquire leader lease openshift-kmm/kmm.sigs.x-k8s.io... I0228 09:36:40.784396 1 leaderelection.go:258] successfully acquired lease openshift-kmm/kmm.sigs.x-k8s.io I0228 09:36:40.784876 1 controller.go:185] kmm "msg"="Starting EventSource" "controller"="Module" "controllerGroup"="kmm.sigs.x-k8s.io" "controllerKind"="Module" "source"="kind source: *v1beta1.Module" I0228 09:36:40.784925 1 controller.go:185] kmm "msg"="Starting EventSource" "controller"="Module" "controllerGroup"="kmm.sigs.x-k8s.io" "controllerKind"="Module" "source"="kind source: *v1.DaemonSet" I0228 09:36:40.784968 1 controller.go:185] kmm "msg"="Starting EventSource" "controller"="Module" "controllerGroup"="kmm.sigs.x-k8s.io" "controllerKind"="Module" "source"="kind source: *v1.Build" I0228 09:36:40.785001 1 controller.go:185] kmm "msg"="Starting EventSource" "controller"="Module" "controllerGroup"="kmm.sigs.x-k8s.io" "controllerKind"="Module" "source"="kind source: *v1.Job" I0228 09:36:40.785025 1 controller.go:185] kmm "msg"="Starting EventSource" "controller"="Module" "controllerGroup"="kmm.sigs.x-k8s.io" "controllerKind"="Module" "source"="kind source: *v1.Node" I0228 09:36:40.785039 1 controller.go:193] kmm "msg"="Starting Controller" "controller"="Module" "controllerGroup"="kmm.sigs.x-k8s.io" "controllerKind"="Module" I0228 09:36:40.785458 1 controller.go:185] kmm "msg"="Starting EventSource" "controller"="PodNodeModule" "controllerGroup"="" "controllerKind"="Pod" "source"="kind source: *v1.Pod" I0228 09:36:40.786947 1 controller.go:185] kmm "msg"="Starting EventSource" "controller"="PreflightValidation" "controllerGroup"="kmm.sigs.x-k8s.io" "controllerKind"="PreflightValidation" "source"="kind source: *v1beta1.PreflightValidation" I0228 09:36:40.787406 1 controller.go:185] kmm "msg"="Starting EventSource" "controller"="PreflightValidation" "controllerGroup"="kmm.sigs.x-k8s.io" "controllerKind"="PreflightValidation" "source"="kind source: *v1.Build" I0228 09:36:40.787474 1 controller.go:185] kmm "msg"="Starting EventSource" "controller"="PreflightValidation" "controllerGroup"="kmm.sigs.x-k8s.io" "controllerKind"="PreflightValidation" "source"="kind source: *v1.Job" I0228 09:36:40.787488 1 controller.go:185] kmm "msg"="Starting EventSource" "controller"="PreflightValidation" "controllerGroup"="kmm.sigs.x-k8s.io" "controllerKind"="PreflightValidation" "source"="kind source: *v1beta1.Module" I0228 09:36:40.787603 1 controller.go:185] kmm "msg"="Starting EventSource" "controller"="NodeKernel" "controllerGroup"="" "controllerKind"="Node" "source"="kind source: *v1.Node" I0228 09:36:40.787634 1 controller.go:193] kmm "msg"="Starting Controller" "controller"="NodeKernel" "controllerGroup"="" "controllerKind"="Node" I0228 09:36:40.787680 1 controller.go:193] kmm "msg"="Starting Controller" "controller"="PreflightValidation" "controllerGroup"="kmm.sigs.x-k8s.io" "controllerKind"="PreflightValidation" I0228 09:36:40.785607 1 controller.go:185] kmm "msg"="Starting EventSource" "controller"="imagestream" "controllerGroup"="image.openshift.io" "controllerKind"="ImageStream" "source"="kind source: *v1.ImageStream" I0228 09:36:40.787822 1 controller.go:185] kmm "msg"="Starting EventSource" "controller"="preflightvalidationocp" "controllerGroup"="kmm.sigs.x-k8s.io" "controllerKind"="PreflightValidationOCP" "source"="kind source: *v1beta1.PreflightValidationOCP" I0228 09:36:40.787853 1 controller.go:193] kmm "msg"="Starting Controller" "controller"="imagestream" "controllerGroup"="image.openshift.io" "controllerKind"="ImageStream" I0228 09:36:40.787879 1 controller.go:185] kmm "msg"="Starting EventSource" "controller"="preflightvalidationocp" "controllerGroup"="kmm.sigs.x-k8s.io" "controllerKind"="PreflightValidationOCP" "source"="kind source: *v1beta1.PreflightValidation" I0228 09:36:40.787905 1 controller.go:193] kmm "msg"="Starting Controller" "controller"="preflightvalidationocp" "controllerGroup"="kmm.sigs.x-k8s.io" "controllerKind"="PreflightValidationOCP" I0228 09:36:40.786489 1 controller.go:193] kmm "msg"="Starting Controller" "controller"="PodNodeModule" "controllerGroup"="" "controllerKind"="Pod"
4.20.3.2. KMM-Hub のデータ収集
手順
KMM Operator ハブコントローラーマネージャーのデータを収集します。
MUST_GATHER_IMAGE
変数を設定します。$ export MUST_GATHER_IMAGE=$(oc get deployment -n openshift-kmm-hub kmm-operator-hub-controller -ojsonpath='{.spec.template.spec.containers[?(@.name=="manager")].env[?(@.name=="RELATED_IMAGE_MUST_GATHER")].value}') $ oc adm must-gather --image="${MUST_GATHER_IMAGE}" -- /usr/bin/gather -u
注記KMM をカスタム namespace にインストールしている場合は、
-n <namespace>
スイッチを使用して namespace を指定します。must-gather
ツールを実行します。$ oc adm must-gather --image="${MUST_GATHER_IMAGE}" -- /usr/bin/gather -u
Operator ログを表示します。
$ oc logs -fn openshift-kmm-hub deployments/kmm-operator-hub-controller
例4.2 出力例
I0417 11:34:08.807472 1 request.go:682] Waited for 1.023403273s due to client-side throttling, not priority and fairness, request: GET:https://172.30.0.1:443/apis/tuned.openshift.io/v1?timeout=32s I0417 11:34:12.373413 1 listener.go:44] kmm-hub/controller-runtime/metrics "msg"="Metrics server is starting to listen" "addr"="127.0.0.1:8080" I0417 11:34:12.376253 1 main.go:150] kmm-hub/setup "msg"="Adding controller" "name"="ManagedClusterModule" I0417 11:34:12.376621 1 main.go:186] kmm-hub/setup "msg"="starting manager" I0417 11:34:12.377690 1 leaderelection.go:248] attempting to acquire leader lease openshift-kmm-hub/kmm-hub.sigs.x-k8s.io... I0417 11:34:12.378078 1 internal.go:366] kmm-hub "msg"="Starting server" "addr"={"IP":"127.0.0.1","Port":8080,"Zone":""} "kind"="metrics" "path"="/metrics" I0417 11:34:12.378222 1 internal.go:366] kmm-hub "msg"="Starting server" "addr"={"IP":"::","Port":8081,"Zone":""} "kind"="health probe" I0417 11:34:12.395703 1 leaderelection.go:258] successfully acquired lease openshift-kmm-hub/kmm-hub.sigs.x-k8s.io I0417 11:34:12.396334 1 controller.go:185] kmm-hub "msg"="Starting EventSource" "controller"="ManagedClusterModule" "controllerGroup"="hub.kmm.sigs.x-k8s.io" "controllerKind"="ManagedClusterModule" "source"="kind source: *v1beta1.ManagedClusterModule" I0417 11:34:12.396403 1 controller.go:185] kmm-hub "msg"="Starting EventSource" "controller"="ManagedClusterModule" "controllerGroup"="hub.kmm.sigs.x-k8s.io" "controllerKind"="ManagedClusterModule" "source"="kind source: *v1.ManifestWork" I0417 11:34:12.396430 1 controller.go:185] kmm-hub "msg"="Starting EventSource" "controller"="ManagedClusterModule" "controllerGroup"="hub.kmm.sigs.x-k8s.io" "controllerKind"="ManagedClusterModule" "source"="kind source: *v1.Build" I0417 11:34:12.396469 1 controller.go:185] kmm-hub "msg"="Starting EventSource" "controller"="ManagedClusterModule" "controllerGroup"="hub.kmm.sigs.x-k8s.io" "controllerKind"="ManagedClusterModule" "source"="kind source: *v1.Job" I0417 11:34:12.396522 1 controller.go:185] kmm-hub "msg"="Starting EventSource" "controller"="ManagedClusterModule" "controllerGroup"="hub.kmm.sigs.x-k8s.io" "controllerKind"="ManagedClusterModule" "source"="kind source: *v1.ManagedCluster" I0417 11:34:12.396543 1 controller.go:193] kmm-hub "msg"="Starting Controller" "controller"="ManagedClusterModule" "controllerGroup"="hub.kmm.sigs.x-k8s.io" "controllerKind"="ManagedClusterModule" I0417 11:34:12.397175 1 controller.go:185] kmm-hub "msg"="Starting EventSource" "controller"="imagestream" "controllerGroup"="image.openshift.io" "controllerKind"="ImageStream" "source"="kind source: *v1.ImageStream" I0417 11:34:12.397221 1 controller.go:193] kmm-hub "msg"="Starting Controller" "controller"="imagestream" "controllerGroup"="image.openshift.io" "controllerKind"="ImageStream" I0417 11:34:12.498335 1 filter.go:196] kmm-hub "msg"="Listing all ManagedClusterModules" "managedcluster"="local-cluster" I0417 11:34:12.498570 1 filter.go:205] kmm-hub "msg"="Listed ManagedClusterModules" "count"=0 "managedcluster"="local-cluster" I0417 11:34:12.498629 1 filter.go:238] kmm-hub "msg"="Adding reconciliation requests" "count"=0 "managedcluster"="local-cluster" I0417 11:34:12.498687 1 filter.go:196] kmm-hub "msg"="Listing all ManagedClusterModules" "managedcluster"="sno1-0" I0417 11:34:12.498750 1 filter.go:205] kmm-hub "msg"="Listed ManagedClusterModules" "count"=0 "managedcluster"="sno1-0" I0417 11:34:12.498801 1 filter.go:238] kmm-hub "msg"="Adding reconciliation requests" "count"=0 "managedcluster"="sno1-0" I0417 11:34:12.501947 1 controller.go:227] kmm-hub "msg"="Starting workers" "controller"="imagestream" "controllerGroup"="image.openshift.io" "controllerKind"="ImageStream" "worker count"=1 I0417 11:34:12.501948 1 controller.go:227] kmm-hub "msg"="Starting workers" "controller"="ManagedClusterModule" "controllerGroup"="hub.kmm.sigs.x-k8s.io" "controllerKind"="ManagedClusterModule" "worker count"=1 I0417 11:34:12.502285 1 imagestream_reconciler.go:50] kmm-hub "msg"="registered imagestream info mapping" "ImageStream"={"name":"driver-toolkit","namespace":"openshift"} "controller"="imagestream" "controllerGroup"="image.openshift.io" "controllerKind"="ImageStream" "dtkImage"="quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:df42b4785a7a662b30da53bdb0d206120cf4d24b45674227b16051ba4b7c3934" "name"="driver-toolkit" "namespace"="openshift" "osImageVersion"="412.86.202302211547-0" "reconcileID"="e709ff0a-5664-4007-8270-49b5dff8bae9"
Legal Notice
Copyright © 2024 Red Hat, Inc.
OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).
Modified versions must remove all Red Hat trademarks.
Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.
Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.