4.14. 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.14.1. KMM-Hub
KMM 项目提供 KMM-Hub,它是一个专用于 hub 集群的 KMM 版本。KMM-Hub 监控 spoke 上运行的所有内核版本,并决定集群中应该接收内核模块的节点。
KMM-Hub 运行所有计算密集型任务,如镜像构建和 kmod 签名,并准备裁剪通过 RHACM 传送到 spoke 的 Module
。
KMM-Hub 无法用于在 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)在 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'
如果 .spec.moduleSpec
中存在构建或签名指令,则这些 pod 在 Operator 命名空间中的 hub 集群上运行。
当 .spec.selector
匹配一个或多个 ManagedCluster
资源时,KMM-Hub 在对应的命名空间中创建 ManifestWork
资源。manifestwork
包含 trimmed-down Module
资源,保留了内核映射,但所有 build
和 sign
子部分都会被删除。包含以标签结尾的镜像名称的 containerImage
字段将替换为等效摘要。
4.14.4. 在 spoke 上运行 KMM
在 spoke 上安装内核模块管理 (KMM) 后,不需要进一步操作。从 hub 创建一个 ManagedClusterModule
对象,以便在 spoke 集群上部署内核模块。
流程
您可以通过 RHACM Policy
对象在 spokes 集群上安装 KMM。除了从 Operator hub 安装 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