4.12. KMM Hub 및 spoke

허브 및 스포크 시나리오에서 많은 스포크 클러스터는 중앙의 강력한 허브 클러스터에 연결됩니다. KMM(커널 모듈 관리)은 hub 및 spoke 환경에서 작동하는 RHACM(Red Hat Advanced Cluster Management)에 따라 다릅니다.

KMM은 KMM 기능을 분리하여 Hub 및 spoke 환경과 호환됩니다. ManagedClusterModule CRD(Custom Resource Definition)는 기존 모듈 CRD를 래핑하여 스케이크 클러스터를 선택하도록 확장됩니다. 또한 Hub 클러스터에서 이미지를 빌드하고 서명하는 새로운 독립 실행형 컨트롤러인 KMM-Hub도 제공됩니다.

hub 및 spoke 설정에서 spokes는 hub 클러스터에서 중앙에서 관리하는 리소스 제한 클러스터에 중점을 두고 있습니다. spokes는 리소스 집약적인 기능이 비활성화된 KMM의 단일 클러스터 버전을 실행합니다. KMM을 이 환경에 맞게 조정하려면 허브에서 비용이 많이 드는 작업을 처리하는 동안 스포크에서 실행되는 워크로드를 최소화해야 합니다.

커널 모듈 이미지를 빌드하고 .ko 파일에 서명하면 허브에서 실행해야 합니다. 모듈 로더 및 장치 플러그인 DaemonSet의 예약은 spokes 에서만 발생할 수 있습니다.

4.12.1. KMM-Hub

KMM 프로젝트는 허브 클러스터 전용 KMM-Hub 버전을 제공합니다. KMM-Hub는 spokes에서 실행되는 모든 커널 버전을 모니터링하고 커널 모듈을 수신해야 하는 클러스터의 노드를 결정합니다.

KMM-Hub는 이미지 빌드 및 kmod 서명과 같은 모든 컴퓨팅 집약적인 작업을 실행하고 trimmed-down Module 이 RHACM을 통해 spokes로 전송할 수 있도록 준비합니다.

참고

KMM-Hub는 허브 클러스터에서 커널 모듈을 로드하는 데 사용할 수 없습니다. KMM의 일반 버전을 설치하여 커널 모듈을 로드합니다.

추가 리소스

4.12.2. KMM-Hub 설치

다음 방법 중 하나를 사용하여 KMM-Hub를 설치할 수 있습니다.

  • OLM(Operator Lifecycle Manager) 사용
  • KMM 리소스 생성

추가 리소스

4.12.2.1. Operator Lifecycle Manager를 사용하여 KMM-Hub 설치

OpenShift 콘솔의 Operators 섹션을 사용하여 KMM-Hub를 설치합니다.

4.12.2.2. KMM 리소스를 생성하여 KMM-Hub 설치

절차

  • KMM-Hub를 프로그래밍 방식으로 설치하려면 다음 리소스를 사용하여 네임스페이스,OperatorGroupSubscription 리소스를 생성할 수 있습니다.
---
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(Custom Resource Definition)를 사용하여 spoke 클러스터에서 커널 모듈 배포를 구성합니다. 이 CRD는 클러스터 범위로, 모듈 사양을 래핑하고 다음과 같은 추가 필드를 추가합니다.

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: 모듈 리소스와 유사하게 moduleLoaderdevicePlugin 섹션을 포함합니다.
2
ManagedCluster 내에서 노드를 선택합니다.
3
모듈을 생성해야 하는 네임스페이스 를 지정합니다.
4
ManagedCluster 오브젝트를 선택합니다.

.spec.moduleSpec 에 빌드 또는 서명 지침이 있는 경우 해당 Pod는 Operator의 네임스페이스의 허브 클러스터에서 실행됩니다.

.spec.selector가 하나 이상의 ManagedCluster 리소스와 일치하는 경우 KMM-Hub는 해당 네임스페이스에 ManifestWork 리소스를 생성합니다. ManifestWork 에는 커널 매핑이 유지되지만 모든 buildsign 하위 섹션이 제거된 트리다운 모듈 리소스가 포함되어 있습니다. 태그로 끝나는 이미지 이름이 포함된 containerImage 필드는 동일한 다이제스트로 교체됩니다.

4.12.4. spoke에서 KMM 실행

spoke에 KMM을 설치한 후에는 추가 작업이 필요하지 않습니다. 허브에서 ManagedClusterModule 오브젝트를 생성하여 spoke 클러스터에 커널 모듈을 배포합니다.

절차

RHACM 정책 오브젝트를 통해 spokes 클러스터에 KMM을 설치할 수 있습니다. Operator 허브에서 KMM을 설치하고 경량 스포크 모드로 실행하는 것 외에도 RHACM 에이전트에서 모듈 리소스를 관리하는 데 필요한 추가 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 필드는 선택한 클러스터만 대상으로 지정하도록 사용자 지정할 수 있습니다.