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 をロードする前に、inTreeModulesToRemove を使用してツリー内の 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. Module CR の例 リンクのコピーリンクがクリップボードにコピーされました!
以下は、アノテーション付きの Module の例です。
apiVersion: kmm.sigs.x-k8s.io/v1beta1
kind: Module
metadata:
name: <my_kmod>
spec:
moduleLoader:
container:
modprobe:
moduleName: <my_kmod>
dirName: /opt
firmwarePath: /firmware
parameters:
- param=1
kernelMappings:
- 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$'
containerImage: "some.other.registry/org/<my_kmod>:${KERNEL_FULL_VERSION}"
- regexp: '^.+$'
containerImage: "some.registry/org/<my_kmod>:${KERNEL_FULL_VERSION}"
build:
buildArgs:
- name: ARG_NAME
value: <some_value>
secrets:
- name: <some_kubernetes_secret>
baseImageRegistryTLS:
insecure: false
insecureSkipTLSVerify: false
dockerfileConfigMap:
name: <my_kmod_dockerfile>
sign:
certSecret:
name: <cert_secret>
keySecret:
name: <key_secret>
filesToSign:
- /opt/lib/modules/${KERNEL_FULL_VERSION}/<my_kmod>.ko
registryTLS:
insecure: false
insecureSkipTLSVerify: false
serviceAccountName: <sa_module_loader>
devicePlugin:
container:
image: some.registry/org/device-plugin:latest
env:
- name: MY_DEVICE_PLUGIN_ENV_VAR
value: SOME_VALUE
volumeMounts:
- mountPath: /some/mountPath
name: <device_plugin_volume>
volumes:
- name: <device_plugin_volume>
configMap:
name: <some_configmap>
serviceAccountName: <sa_device_plugin>
imageRepoSecret:
name: <secret_name>
selector:
node-role.kubernetes.io/worker: ""
- 1 1 1
- 必須。
- 2
- 任意。
- 3
- オプション: このパスの内容を、
kmm-operator-manager-configconfig map のworker.setFirmwareClassPath(/var/lib/firmwareに事前設定) で指定されたパスにコピーします。このアクションは、カーネルモジュールを挿入するためにmodprobeが呼び出される前に発生します。 - 4
- 任意。
- 5
- 少なくとも 1 つのカーネル項目が必要です。
- 6
- 正規表現に一致するカーネルを実行している各ノードについて、KMM はタグまたはダイジェストが含まれているかどうかを確認します。コンテナーイメージにタグまたはダイジェストを指定していない場合、検証 Webhook はエラーを返し、モジュールを適用しません。
- 7
- その他のカーネルの場合は、
my-kmodConfigMap の Dockerfile を使用してイメージをビルドします。 - 8
- お客様の kmods を保持するコンテナーイメージ。このコンテナーには
cpバイナリーが含まれている必要があります。 - 9
- 任意。
- 10
- オプション:
some-kubernetes-secretの値は、/run/secrets/some-kubernetes-secretのビルド環境から取得できます。 - 11
- このフィールドは効果がありません。kmod イメージをビルドするか、kmod イメージ内で kmod に署名する場合は、信頼できない認証局 (CA) によって署名された証明書を提供するレジストリーから、ベースイメージを時折プルすることを推奨します。KMM がその CA を信頼するには、クラスターの CA バンドルを置き換えて新しい CA も信頼する必要があります。
クラスターの CA バンドルを置き換える方法は、関連情報を参照してください。
- 12
- オプション: このパラメーターは使用しないでください。
trueに設定すると、プレーン HTTP を使用して DockerfileFROM命令でイメージをプルするときに、ビルドで TLS サーバー証明書の検証がスキップされます。 - 13
- 必須。
- 14
- 必須: 鍵 'cert' を持つ公開セキュアブート鍵を保持するシークレット。
- 15
- 必須: 'key' という鍵が含まれるセキュアブート秘密鍵を保持するシークレット。
- 16
- オプション: このパラメーターは使用しないでください。
trueに設定すると、KMM がプレーン HTTP を使用してコンテナーイメージがすでに存在するかどうかを確認することが許可されます。 - 17
- オプション: このパラメーターは使用しないでください。
trueに設定すると、コンテナーイメージがすでに存在するかどうかを確認するときに、KMM で TLS サーバー証明書の検証がスキップされます。 - 18
- 任意。
- 19
- 任意。
- 20
- 必須: デバイスプラグインセクションが存在する場合。
- 21
- 任意。
- 22
- 任意。
- 23
- 任意。
- 24
- オプション: モジュールローダーとデバイスプラグインイメージをプルするために使用されます。