専用のハードウェアおよびドライバーの有効化
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.16
)。
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.16.z-x86_64 --image-for=driver-toolkit
$ oc adm release info quay.io/openshift-release-dev/ocp-release:4.16.z-x86_64 --image-for=driver-toolkit
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ARM イメージの場合、コマンドは次のとおりです。
oc adm release info quay.io/openshift-release-dev/ocp-release:4.16.z-aarch64 --image-for=driver-toolkit
$ oc adm release info quay.io/openshift-release-dev/ocp-release:4.16.z-aarch64 --image-for=driver-toolkit
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
出力例
quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:b53883ca2bac5925857148c4a1abc300ced96c222498e3bc134fe7ce3a1dd404
quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:b53883ca2bac5925857148c4a1abc300ced96c222498e3bc134fe7ce3a1dd404
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OpenShift Container Platform のインストールに必要なプルシークレットなど、有効なプルシークレットを使用してこのイメージを取得します。
podman pull --authfile=path/to/pullsecret.json quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:<SHA>
$ podman pull --authfile=path/to/pullsecret.json quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:<SHA>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
$ oc new-project simple-kmod-demo
YAML は、
simple-kmod
ドライバーコンテナーイメージを保存するImageStream
と、コンテナーをビルドするBuildConfig
を定義します。この YAML を0000-buildconfig.yaml.template
として保存します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドで、“DRIVER_TOOLKIT_IMAGE” の代わりに、実行中の OpenShift Container Platform バージョンのドライバーツールキットイメージを置き換えます。
OCP_VERSION=$(oc get clusterversion/version -ojsonpath={.status.desired.version})
$ OCP_VERSION=$(oc get clusterversion/version -ojsonpath={.status.desired.version})
Copy to Clipboard Copied! Toggle word wrap Toggle overflow DRIVER_TOOLKIT_IMAGE=$(oc adm release info $OCP_VERSION --image-for=driver-toolkit)
$ DRIVER_TOOLKIT_IMAGE=$(oc adm release info $OCP_VERSION --image-for=driver-toolkit)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow sed "s#DRIVER_TOOLKIT_IMAGE#${DRIVER_TOOLKIT_IMAGE}#" 0000-buildconfig.yaml.template > 0000-buildconfig.yaml
$ sed "s#DRIVER_TOOLKIT_IMAGE#${DRIVER_TOOLKIT_IMAGE}#" 0000-buildconfig.yaml.template > 0000-buildconfig.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下でイメージストリームおよびビルド設定を作成します。
oc create -f 0000-buildconfig.yaml
$ oc create -f 0000-buildconfig.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ビルダー Pod が正常に完了したら、ドライバーコンテナーイメージを
DaemonSet
としてデプロイします。ホスト上でカーネルモジュールを読み込むには、特権付きセキュリティーコンテキストでドライバーコンテナーを実行する必要があります。以下の YAML ファイルには、ドライバーコンテナーを実行するための RBAC ルールおよび
DaemonSet
が含まれます。この YAML を1000-drivercontainer.yaml
として保存します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow RBAC ルールおよびデーモンセットを作成します。
oc create -f 1000-drivercontainer.yaml
$ oc create -f 1000-drivercontainer.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Pod がワーカーノードで実行された後に、
simple_kmod
カーネルモジュールがlsmod
のホストマシンで正常に読み込まれることを確認します。Pod が実行されていることを確認します。
oc get pod -n simple-kmod-demo
$ oc get pod -n simple-kmod-demo
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
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
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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ドライバーコンテナー Pod で
lsmod
コマンドを実行します。oc exec -it pod/simple-kmod-driver-container-p45cc -- lsmod | grep simple
$ oc exec -it pod/simple-kmod-driver-container-p45cc -- lsmod | grep simple
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
simple_procfs_kmod 16384 0 simple_kmod 16384 0
simple_procfs_kmod 16384 0 simple_kmod 16384 0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第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"
に設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して namespace を作成します。
oc create -f nfd-namespace.yaml
$ oc create -f nfd-namespace.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
以下のオブジェクトを作成して、直前の手順で作成した namespace に NFD Operator をインストールします。
以下の
OperatorGroup
CR を作成し、YAML をnfd-operatorgroup.yaml
ファイルに保存します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して
OperatorGroup
CR を作成します。oc create -f nfd-operatorgroup.yaml
$ oc create -f nfd-operatorgroup.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下の
Subscription
CR を作成し、YAML をnfd-sub.yaml
ファイルに保存します。Subscription の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して Subscription オブジェクトを作成します。
oc create -f nfd-sub.yaml
$ oc create -f nfd-sub.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow openshift-nfd
プロジェクトに切り替えます。oc project openshift-nfd
$ oc project openshift-nfd
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
Operator のデプロイメントが正常に行われたことを確認するには、以下を実行します。
oc get pods
$ oc get pods
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME READY STATUS RESTARTS AGE nfd-controller-manager-7f86ccfb58-vgr4x 2/2 Running 0 10m
NAME READY STATUS RESTARTS AGE nfd-controller-manager-7f86ccfb58-vgr4x 2/2 Running 0 10m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 正常にデプロイされると、
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
フィールドが必須になりました。NFD Operator が Operator Lifecycle Manager (OLM) を使用してデプロイされる場合、operand.image
フィールドは OLM によって自動的に設定されます。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 の例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
operand.image
フィールドは必須です。
次のコマンドを実行して、
NodeFeatureDiscovery
CR を作成します。oc apply -f <filename>
$ oc apply -f <filename>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
次のコマンドを実行して、
NodeFeatureDiscovery
CR が作成されたことを確認します。oc get pods
$ oc get pods
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 正常にデプロイされると、
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:<openshift_version>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow コマンドの例
skopeo inspect docker://registry.redhat.io/openshift4/ose-node-feature-discovery:v4.12
$ skopeo inspect docker://registry.redhat.io/openshift4/ose-node-feature-discovery:v4.12
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力を調べてイメージダイジェストを識別します。
出力例
{ ... "Digest": "sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", ... }
{ ... "Digest": "sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", ... }
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
次のコマンドを実行して、
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@<image_digest> docker://<mirror_registry>/openshift4/ose-node-feature-discovery@<image_digest>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow コマンドの例
skopeo copy docker://registry.redhat.io/openshift4/ose-node-feature-discovery@sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef docker://<your-mirror-registry>/openshift4/ose-node-feature-discovery@sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
skopeo copy docker://registry.redhat.io/openshift4/ose-node-feature-discovery@sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef docker://<your-mirror-registry>/openshift4/ose-node-feature-discovery@sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
Copy to Clipboard Copied! Toggle word wrap Toggle overflow NodeFeatureDiscovery
CR を作成します。NodeFeatureDiscovery
CR の例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
operand.image
フィールドは必須です。
次のコマンドを実行して、
NodeFeatureDiscovery
CR を作成します。oc apply -f <filename>
$ oc apply -f <filename>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
次のコマンドを実行して、
NodeFeatureDiscovery
CR のステータスを確認します。oc get nodefeaturediscovery nfd-instance -o yaml
$ oc get nodefeaturediscovery nfd-instance -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Pod が
ImagePullBackOff
エラーなしで実行していることを確認します。oc get pods -n <nfd_namespace>
$ oc get pods -n <nfd_namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
フィールドが必須になりました。NFD Operator が Operator Lifecycle Manager (OLM) を使用してデプロイされる場合、operand.image
フィールドは OLM によって自動的に設定されます。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
core:
sleepInterval: 60s
デフォルト値は 60s
です。
core.sources
core.sources
は、有効な機能ソースのリストを指定します。特殊な値 all
はすべての機能ソースを有効にします。
この値は、指定されている場合は非推奨の --sources
コマンドラインフラグによりオーバーライドされます。
デフォルト: [all]
使用例
core: sources: - system - custom
core:
sources:
- system
- custom
core.labelWhiteList
core.labelWhiteList
は、正規表現を指定してラベル名に基づいて機能ラベルをフィルターします。一致しないラベルは公開されません。
正規表現は、ラベルのベース名 ('/' の後に名前の一部) だけを照合します。ラベルの接頭辞または namespace は省略されます。
この値は、指定されている場合は、非推奨の --label-whitelist
コマンドラインフラグでオーバーライドされます。
デフォルト: null
使用例
core: labelWhiteList: '^cpu-cpuid'
core:
labelWhiteList: '^cpu-cpuid'
core.noPublish
core.noPublish
を true
に設定すると、nfd-master
による全通信が無効になります。これは実質的にはドライランフラグです。nfd-worker
は通常通り機能検出を実行しますが、ラベル付け要求は nfd-master
に送信されます。
この値は、指定されている場合には、--no-publish
コマンドラインフラグによりオーバーライドされます。
以下に例を示します。
使用例
core: noPublish: true
core:
noPublish: true
デフォルト値は 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
機能は公開されません。
この値は、指定されている場合は sources.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:
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:
cpu:
cpuid:
attributeWhitelist: [AVX512BW, AVX512CD, AVX512DQ, AVX512F, AVX512VL]
sources.kernel.kconfigFile
sources.kernel.kconfigFile
は、カーネル設定ファイルのパスです。空の場合には、NFD は一般的な標準場所で検索を実行します。
デフォルト: empty
使用例
sources: kernel: kconfigFile: "/path/to/kconfig"
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:
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:
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]
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:
deviceClassWhitelist: ["ef", "ff"]
sources.usb.deviceLabelFields
sources.usb.deviceLabelFields
は、機能ラベルの名前を作成する USB ID フィールドのセットです。有効なフィールドは class
、vendor
、および device
です。
デフォルト: [class, vendor, device]
使用例
sources: pci: deviceLabelFields: [class, vendor]
sources:
pci:
deviceLabelFields: [class, vendor]
上記の設定例では、NFD は feature.node.kubernetes.io/usb-<class-id>_<vendor-id>.present=true
などのラベルを公開します。
sources.custom
sources.custom
は、ユーザー固有のラベルを作成するためにカスタム機能ソースで処理するルールの一覧です。
デフォルト: empty
使用例
3.4. NodeFeatureRule カスタムリソースについて リンクのコピーリンクがクリップボードにコピーされました!
NodeFeatureRule
オブジェクトは、ノードに対するルールベースのカスタムラベル付け用に設計された NodeFeatureDiscovery
カスタムリソースです。一部のユースケースには、デバイス固有ラベルを作成するための、ハードウェアベンダーによるアプリケーション固有のラベル付けまたは配布が含まれます。
NodeFeatureRule
オブジェクトを使用すると、ベンダー固有またはアプリケーション固有のラベルおよびテイントを作成できます。柔軟なルールベースのメカニズムを使用して、ラベルを作成し、オプションでノードの機能に基づきテイントを作成します。
3.5. NodeFeatureRule カスタムリソースの使用 リンクのコピーリンクがクリップボードにコピーされました!
一連のルールが条件に一致する場合にノードにラベルを付ける NodeFeatureRule
オブジェクトを作成します。
手順
次のテキストを含むカスタムリソースを、
nodefeaturerule.yaml
という名前で作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow このカスタムリソースは、
veth
モジュールがロードされ、ベンダーコードが8086
の PCI デバイスがクラスター内に存在する場合にラベル付けするように指定します。次のコマンドを実行して、
nodefeaturerule.yaml
ファイルをクラスターに適用します。oc apply -f https://raw.githubusercontent.com/kubernetes-sigs/node-feature-discovery/v0.13.6/examples/nodefeaturerule.yaml
$ oc apply -f https://raw.githubusercontent.com/kubernetes-sigs/node-feature-discovery/v0.13.6/examples/nodefeaturerule.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、
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 は、次のようなノードリソースハードウェアトポロジーに対応するカスタムリソースインスタンスを作成します。
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
$ 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
$ 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
$ 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
$ 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
$ 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
$ nfd-topology-updater -no-publish
3.6.2.1. -oneshot リンクのコピーリンクがクリップボードにコピーされました!
-oneshot
フラグを使用すると、リソースハードウェアトポロジーの検出が 1 回行われた後も、NFD Topology Updater が終了します。
デフォルト: false
例
nfd-topology-updater -oneshot -no-publish
$ 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
$ 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
$ 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
$ nfd-topology-updater -server-name-override=localhost
-sleep-interval
-sleep-interval
フラグは、リソースハードウェアトポロジーの再検査とカスタムリソースの更新の間隔を指定します。正でない値は、スリープ間隔が無限であることを意味し、再検出は行われません。
デフォルト: 60s
。
例
nfd-topology-updater -sleep-interval=1h
$ nfd-topology-updater -sleep-interval=1h
-version
バージョンを出力して終了します。
-watch-namespace
-watch-namespace
フラグは namespace を指定して、指定された namespace で実行されている Pod に対してのみリソースハードウェアトポロジーの検査が行われるようにします。指定された namespace で実行されていない Pod は、リソースアカウンティングでは考慮されません。これは、テストとデバッグの目的で特に役立ちます。*
値は、全 namespace に含まれるすべての Pod がアカウンティングプロセス中に考慮されることを意味します。
デフォルト: *
例
nfd-topology-updater -watch-namespace=rte
$ 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
apiVersion: v1 kind: Namespace metadata: name: openshift-kmm
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の
OperatorGroup
CR を作成し、YAML ファイル(kmm-op-group.yaml
など) を保存します。apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: kernel-module-management namespace: openshift-kmm
apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: kernel-module-management namespace: openshift-kmm
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の
Subscription
CR を作成し、YAML ファイル (kmm-sub.yaml
など) を保存します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して Subscription オブジェクトを作成します。
oc create -f kmm-sub.yaml
$ oc create -f kmm-sub.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
Operator のデプロイメントが正常に行われたことを確認するには、次のコマンドを実行します。
oc get -n openshift-kmm deployments.apps kmm-operator-controller
$ oc get -n openshift-kmm deployments.apps kmm-operator-controller
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME READY UP-TO-DATE AVAILABLE AGE kmm-operator-controller 1/1 1 1 97s
NAME READY UP-TO-DATE AVAILABLE AGE kmm-operator-controller 1/1 1 1 97s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
apiVersion: v1 kind: Namespace metadata: name: openshift-kmm
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の
SecurityContextConstraint
オブジェクトを作成し、YAML ファイル(kmm-security-constraint.yaml
など) を保存します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
SecurityContextConstraint
オブジェクトを Operator のServiceAccount
にバインドします。oc apply -f kmm-security-constraint.yaml
$ oc apply -f kmm-security-constraint.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc adm policy add-scc-to-user kmm-security-constraint -z kmm-operator-controller -n openshift-kmm
$ oc adm policy add-scc-to-user kmm-security-constraint -z kmm-operator-controller -n openshift-kmm
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の
OperatorGroup
CR を作成し、YAML ファイル(kmm-op-group.yaml
など) を保存します。apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: kernel-module-management namespace: openshift-kmm
apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: kernel-module-management namespace: openshift-kmm
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の
Subscription
CR を作成し、YAML ファイル (kmm-sub.yaml
など) を保存します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して Subscription オブジェクトを作成します。
oc create -f kmm-sub.yaml
$ oc create -f kmm-sub.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
Operator のデプロイメントが正常に行われたことを確認するには、次のコマンドを実行します。
oc get -n openshift-kmm deployments.apps kmm-operator-controller
$ oc get -n openshift-kmm deployments.apps kmm-operator-controller
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME READY UP-TO-DATE AVAILABLE AGE kmm-operator-controller 1/1 1 1 97s
NAME READY UP-TO-DATE AVAILABLE AGE kmm-operator-controller 1/1 1 1 97s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
$ oc edit configmap -n "$namespace" kmm-operator-manager-config
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand 表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
$ oc delete pod -n "<namespace>" -l app.kubernetes.io/component=kmm
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記<namespace> の値は、元のインストール方法によって異なります。
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
に設定します。
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
$ oc delete -k https://github.com/rh-ecosystem-edge/kernel-module-management/config/default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記このコマンドを使用すると、
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) でソフト依存関係を宣言することで解決できます。
上記の設定では、ワーカー 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}" ]
$ 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
フィールドの値をアンロードするモジュールに設定します。以下の例は、すべてのカーネルマッピングのモジュール置換を示しています。
この例では、moduleLoader
Pod は、moduleLoader
イメージから mod_a
をロードする前に、inTreeModulesToRemove
を使用してツリー内の mod_a
および mod_b
をアンロードします。moduleLoader`pod is terminated and `mod_a
がアンロードされても、mod_b
は再ロードされません。
以下は、特定のカーネルマッピングのモジュール置換の例です。
4.7.1. Module CR の例 リンクのコピーリンクがクリップボードにコピーされました!
以下は、アノテーション付きの Module
の例です。
- 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>
の下のシンボリックリンク名です。
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}+`.
$ depmod -b /opt ${KERNEL_FULL_VERSION}+`.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.9.1.1. Dockerfile の例 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform でイメージをビルドする場合は、Driver Tool Kit (DTK) の使用を検討してください。
詳細は、資格のあるビルドの使用 を参照してください。
4.9.2. クラスターでのビルド リンクのコピーリンクがクリップボードにコピーされました!
KMM はクラスター内に kmod イメージをビルドできます。次のガイドラインに従ってください。
-
カーネルマッピングの build セクションを使用して
build
命令を提供します。 -
コンテナーイメージの Dockerfile を、
dockerfile
キーの下のConfigMap
リソースにコピーします。 -
ConfigMap
がModule
と同じ namespace にあることを確認します。
KMM は、containerImage
フィールドで指定されたイメージ名が存在するかどうかを確認します。その場合、ビルドはスキップされます。
それ以外の場合、KMM は Build
リソースを作成してイメージをビルドします。イメージがビルドされると、KMM はモジュールの調整を Module
します。以下の例を参照してください。
- 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 によって自動的に設定されます。以下の例を参照してください。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
$ 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のいずれかの方法を使用して、ファイルを追加します。
ファイルを シークレット として直接追加します。
oc create secret generic my-signing-key --from-file=key=<my_signing_key.priv>
$ oc create secret generic my-signing-key --from-file=key=<my_signing_key.priv>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create secret generic my-signing-key-pub --from-file=cert=<my_signing_key_pub.der>
$ oc create secret generic my-signing-key-pub --from-file=cert=<my_signing_key_pub.der>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow base64 エンコーディングでファイルを追加します。
cat sb_cert.priv | base64 -w 0 > my_signing_key2.base64
$ cat sb_cert.priv | base64 -w 0 > my_signing_key2.base64
Copy to Clipboard Copied! Toggle word wrap Toggle overflow cat sb_cert.cer | base64 -w 0 > my_signing_key_pub.base64
$ cat sb_cert.cer | base64 -w 0 > my_signing_key_pub.base64
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
エンコードされたテキストを YAML ファイルに追加します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow YAML ファイルを適用します。
oc apply -f <yaml_filename>
$ oc apply -f <yaml_filename>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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 <certificate secret name> | awk '/cert/{print $2; exit}' | base64 -d | openssl x509 -inform der -text
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、シリアル番号、発行者、サブジェクトなどを含む証明書が表示されます。
秘密鍵シークレットが正しく設定されていることを確認します。
oc get secret -o yaml <private key secret name> | awk '/key/{print $2; exit}' | base64 -d
$ oc get secret -o yaml <private key secret name> | awk '/key/{print $2; exit}' | base64 -d
Copy to Clipboard Copied! Toggle word wrap Toggle overflow これにより、
-----BEGIN PRIVATE KEY-----
および-----END PRIVATE KEY-----
行で囲まれたキーが表示されます。
4.12. ビルド済みイメージ内の kmods への署名 リンクのコピーリンクがクリップボードにコピーされました!
ハードウェアベンダーによって配布されたイメージや別の場所でビルドされたイメージなど、ビルド済みのイメージがある場合は、この手順を使用します。
次の YAML ファイルは、公開鍵と秘密鍵のペアを必要なキー名 (秘密鍵の場合は key
、公開鍵の場合は cert)
を持つシークレットとして追加します。次に、クラスターは unsignedImage
イメージをプルダウンし、これを開いて filesToSign
に一覧表示されているカーネルモジュールに署名し、それらを再び追加し、作成されたイメージを containerImage
としてプッシュします。
次に、KMM は、セレクターに一致するすべてのノードに署名された kmod をロードします。kmods は、MOK データベースに公開鍵を持つすべてのノード、およびセキュアブートが有効になっていないすべてのノード (署名を無視するノード) に正常にロードされます。
前提条件
-
keySecret
およびcertSecret
シークレットが、残りのリソースと同じ namespace に作成されている。
手順
YAML ファイルを適用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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 ファイルを適用します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
リソースを作成できます。
4.14.3. ManagedClusterModule CRD の使用 リンクのコピーリンクがクリップボードにコピーされました!
ManagedClusterModule
カスタムリソース定義 (CRD) を使用して、スポーククラスターでのカーネルモジュールのデプロイメントを設定します。この CRD はクラスタースコープであり、Module
仕様をラップし、次の追加フィールドを追加します。
ビルドまたは署名の命令が .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 を設定します。
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>-
$ oc label node/<node_name> kmm.node.kubernetes.io/version-module.<module_namespace>.<module_name>-
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 必要に応じて、クラスター管理者として、カーネルモジュールのアップグレードに必要な追加のメンテナンスをノード上で実行します。
追加のアップグレードが必要ない場合は、
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>
$ oc label node/<node_name> kmm.node.kubernetes.io/version-module.<module_namespace>.<module_name>=<desired_version>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記ラベル名の 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)
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 の影響を受けるノードのコレクションを識別します。
OCP クラスターには、事前定義された MachineConfigPool
があります。
-
worker
: クラスター内のすべてのワーカーノードをターゲットにします -
master
: クラスター内のすべてのマスターノードをターゲットにします
マスター MachineConfigPool
をターゲットにするために、次の MachineConfig
を定義します。
metadata: labels: machineconfiguration.opensfhit.io/role: master
metadata:
labels:
machineconfiguration.opensfhit.io/role: master
ワーカー MachineConfigPool
をターゲットにするために、次の MachineConfig
を定義します。
metadata: labels: machineconfiguration.opensfhit.io/role: worker
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
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.2. kmod イメージのビルド リンクのコピーリンクがクリップボードにコピーされました!
手順
カーネルモジュール自体をビルドするだけでなく、バイナリーファームウェアをビルダーイメージに含めます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.18.3. モジュールリソースのチューニング リンクのコピーリンクがクリップボードにコピーされました!
手順
Module
カスタムリソース (CR) で.spec.moduleLoader.container.modprobe.firmwarePath
を設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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
$ oc logs -fn openshift-kmm deployments/kmm-operator-controller
KMM Webhook サーバーのコマンド例
oc logs -fn openshift-kmm deployments/kmm-operator-webhook-server
$ oc logs -fn openshift-kmm deployments/kmm-operator-webhook-server
KMM-Hub コントローラーのコマンド例
oc logs -fn openshift-kmm-hub deployments/kmm-operator-hub-controller
$ 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
$ oc logs -fn openshift-kmm deployments/kmm-operator-hub-webhook-server
4.20.2. イベントの観察 リンクのコピーリンクがクリップボードにコピーされました!
KMM イベントを表示するには、次の方法を使用します。
ビルドとサイン
KMM は、kmod イメージのビルドを開始するたびに、またはその結果を確認するたびにイベントをパブリッシュします。このイベントは、Module
オブジェクトにアタッチされ、次の例のように、oc describe module
コマンドの出力の最後に表示されます。
モジュールのロードまたはアンロード
KMM は、ノード上でカーネルモジュールを正常にロードまたはアンロードするたびにイベントをパブリッシュします。このイベントは、Node
オブジェクトにアタッチされ、次の例のように、oc describe node
コマンドの出力の最後に表示されます。
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
$ 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記KMM をカスタム namespace にインストールしている場合は、
-n <namespace>
スイッチを使用して namespace を指定します。must-gather
ツールを実行します。oc adm must-gather --image="${MUST_GATHER_IMAGE}" -- /usr/bin/gather
$ oc adm must-gather --image="${MUST_GATHER_IMAGE}" -- /usr/bin/gather
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Operator ログを表示します。
oc logs -fn openshift-kmm deployments/kmm-operator-controller
$ oc logs -fn openshift-kmm deployments/kmm-operator-controller
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例4.1 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
$ 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記KMM をカスタム namespace にインストールしている場合は、
-n <namespace>
スイッチを使用して namespace を指定します。must-gather
ツールを実行します。oc adm must-gather --image="${MUST_GATHER_IMAGE}" -- /usr/bin/gather -u
$ oc adm must-gather --image="${MUST_GATHER_IMAGE}" -- /usr/bin/gather -u
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Operator ログを表示します。
oc logs -fn openshift-kmm-hub deployments/kmm-operator-hub-controller
$ oc logs -fn openshift-kmm-hub deployments/kmm-operator-hub-controller
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例4.2 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Legal Notice
リンクのコピーリンクがクリップボードにコピーされました!
Copyright © 2025 Red Hat
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.