4.17. KMM hub 和 spoke


在 hub 和 spoke 场景中,许多 spoke 集群连接到一个中央强大的 hub 集群。内核模块管理(KMM)依赖于 Red Hat Advanced Cluster Management (RHACM)在 hub 和 spoke 环境中运行。

KMM 通过分离 KMM 功能与 hub 和 spoke 环境兼容。提供了 ManagedClusterModule 自定义资源定义 (CRD) 来打包现有的 Module CRD,并将其扩展为选择 Spoke 集群。另外,提供了 KMM-Hub,它是一个新的独立控制器,用于在 hub 集群上构建镜像并签署模块。

在 hub 和 spoke 设置中,spokes 专注于由 hub 集群管理的资源受限集群。spoke 运行 KMM 的单集群版本,并禁用这些资源密集型功能。要将 KMM 适应此环境,您应该将 spoke 上运行的工作负载降低为最小值,而 hub 会处理昂贵的任务。

构建内核模块镜像并签名 .ko 文件,应在 hub 上运行。Module Loader 和 Device Plugin DaemonSet 的调度只能在 spoke 上进行。

4.17.1. KMM-Hub

KMM 项目提供 KMM-Hub,它是一个专用于 hub 集群的 KMM 版本。KMM-Hub 监控 spoke 上运行的所有内核版本,并决定集群中应该接收内核模块的节点。

KMM-Hub 运行所有计算密集型任务,如镜像构建和 kmod 签名,并准备裁剪通过 RHACM 传送到 spoke 的 Module

注意

KMM-Hub 无法用于在 hub 集群中加载内核模块。安装常规版本的 KMM 以加载内核模块。

4.17.2. 安装 KMM-Hub

您可以使用以下方法之一安装 KMM-Hub:

  • 使用 Operator Lifecycle Manager (OLM)
  • 创建 KMM 资源

4.17.2.1. 使用 Operator Lifecycle Manager 安装 KMM-Hub

使用 OpenShift 控制台的 Operators 部分安装 KMM-Hub。

4.17.2.2. 通过创建 KMM 资源来安装 KMM-Hub

流程

  • 如果要以编程方式安装 KMM-Hub,您可以使用以下资源创建 NamespaceOperatorGroupSubscription 资源:

    ---
    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
    Copy to Clipboard Toggle word wrap

4.17.3. 使用 ManagedClusterModule CRD

使用 ManagedClusterModule 自定义资源定义(CRD)在 spoke 集群上配置内核模块的部署。此 CRD 是集群范围的,嵌套了一个 Module spec,并添加以下附加字段:

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'
Copy to Clipboard Toggle word wrap
1
moduleSpec: 包含 moduleLoaderdevicePlugin 部分,类似于 Module 资源。
2
选择 ManagedCluster 中的节点。
3
指定应在其中创建 Module 的命名空间。
4
选择 ManagedCluster 对象。

如果 .spec.moduleSpec 中存在构建或签名指令,则这些 pod 在 Operator 命名空间中的 hub 集群上运行。

.spec.selector 匹配一个或多个 ManagedCluster 资源时,KMM-Hub 在对应的命名空间中创建 ManifestWork 资源。manifestwork 包含 trimmed-down Module 资源,保留了内核映射,但所有 buildsign 子部分都会被删除。包含以标签结尾的镜像名称的 containerImage 字段将替换为等效摘要。

4.17.4. 在 spoke 上运行 KMM

在 spoke 上安装内核模块管理 (KMM) 后,不需要进一步操作。从 hub 创建一个 ManagedClusterModule 对象,以便在 spoke 集群上部署内核模块。

您可以通过 RHACM Policy 对象在 spokes 集群上安装 KMM。除了从软件目录安装 KMM 并以轻量级 spoke 模式运行它外,Policy 还会配置 RHACM 代理所需的额外 RBAC 来管理 Module 资源。

流程

  • 使用以下 RHACM 策略在 spoke 集群上安装 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
    Copy to Clipboard Toggle word wrap
    1
    当在 spoke 集群上运行 KMM 时,需要这个环境变量。
    2
    spec.clusterSelector 字段可以自定义为仅目标选择的集群。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat