4.12. KMM ハブおよびスポーク

ハブおよびスポークシナリオでは、多くのスポーククラスターが中央の強力なハブクラスターに接続されます。Kernel Module Management (KMM) は、ハブおよびスポーク環境で動作するために Red Hat Advanced Cluster Management (RHACM) に依存します。

KMM は、KMM 機能の分離によりハブおよびスポーク環境と互換性があります。ManagedClusterModule カスタムリソース定義 (CRD) は、既存の Module CRD をラップし、選択したスポーククラスターに拡張するために提供されています。また、ハブクラスター上でイメージを構築し、モジュールに署名する新しいスタンドアロンコントローラーである KMM-Hub も提供されます。

ハブおよびスポークのセットアップでは、スポークはハブクラスターによって集中管理される、リソースに制約のある集中的なクラスターです。スポークは、リソースを大量に消費する機能を無効にした状態で、KMM の単一クラスターエディションを実行します。KMM をこの環境に適応させるには、ハブが高価なタスクを処理しながら、スポークで実行されるワークロードを最小限に抑える必要があります。

カーネルモジュールイメージの構築と .ko ファイルへの署名は、ハブ上で実行する必要があります。モジュールローダーおよびデバイスプラグイン DaemonSet のスケジューリングは、スポーク上でのみ実行できます。

4.12.1. KMM-Hub

KMM プロジェクトは、ハブクラスター専用の KMM エディションである KMM-Hub を提供します。KMM-Hub は、スポーク上で実行しているすべてのカーネルバージョンを監視し、カーネルモジュールを受け取る必要があるクラスター上のノードを決定します。

KMM-Hub は、イメージのビルドや kmod 署名などの計算集約型タスクをすべて実行し、RHACM を介してスポークに転送されるようにトリミングされた Module を準備します。

注記

KMM-Hub を使用してハブクラスターにカーネルモジュールをロードすることはできません。カーネルモジュールをロードするには、KMM の通常版をインストールします。

4.12.2. KMM-Hub のインストール

次のいずれかの方法を使用して、KMM-Hub をインストールできます。

  • Operator Lifecycle Manager (OLM) の使用
  • KMM リソースの作成

4.12.2.1. Operator Lifecycle Manager を使用した KMM-Hub のインストール

OpenShift コンソールの Operators セクションを使用して、KMM-Hub をインストールします。

4.12.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.12.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'
1
moduleSpec: Module リソースと同様に、moduleLoader セクションと devicePlugin セクションが含まれます。
2
ManagedCluster 内のノードを選択します。
3
Module を作成する namespace を指定します。
4
ManagedCluster オブジェクトを選択します。

ビルドまたは署名の命令が .spec.moduleSpec に存在すると、その Pod はオペレーターの namespace のハブクラスター上で実行します。

.spec.selector が 1 つ以上の ManagedCluster リソースと一致すると、KMM-Hub は対応する namespace に ManifestWork リソースを作成します。ManifestWork には、カーネルマッピングは保持されていますが、すべての buildsign サブセクションが削除された、トリミングされた Module リソースが含まれています。タグで終わるイメージ名を含む containerImage フィールドは、同等のダイジェストに置き換えられます。

4.12.4. スポーク上で KMM の実行

KMM をスポークにインストールしたら、それ以上の操作は必要ありません。ハブから ManagedClusterModule オブジェクトを作成して、スポーククラスターにカーネルモジュールをデプロイします。

手順

RHACM Policy オブジェクトを通じて KMM をスポーククラスターにインストールできます。Operator ハブから 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
                          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: 1
        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
    1
    spec.clusterSelector フィールドは、選択クラスターのみをターゲットにするようにカスタマイズできます。