19.14. 클러스터 활동 모니터링을 위한 RAN 정책 적용

제로 터치 프로비저닝(ZTP)은 RHACM(Red Hat Advanced Cluster Management)을 사용하여 정책 기반 거버넌스 접근 방식을 통해 RAN(Radio Access Network) 정책을 적용하여 클러스터 활동을 자동으로 모니터링합니다.

PolicyGen(정책 생성기)은 사전 정의된 사용자 정의 리소스에서 ACM 정책을 쉽게 생성할 수 있는 Kustomize 플러그인입니다. 세 가지 주요 항목인 Policy categorization, Source CR 정책 및 PolicyGenTemplate이 있습니다. PolicyGen은 이러한 정책을 사용하여 정책 및 해당 배치 바인딩 및 규칙을 생성합니다.

다음 다이어그램에서는 RAN 정책 생성자가 GitOps 및 ACM과 상호 작용하는 방법을 보여줍니다.

RAN 정책 생성기

RAN 정책은 다음 세 개의 기본 그룹으로 분류됩니다.

Common
일반 범주에 존재하는 정책은 사이트 계획으로 표현할 모든 클러스터에 적용됩니다.
그룹
그룹 범주에 있는 정책은 클러스터 그룹에 적용됩니다. 모든 클러스터 그룹은 그룹 범주에 있는 자체 정책을 보유할 수 있습니다. 예를 들어 Groups/group1 에는 group1 에 속하는 클러스터에 적용되는 자체 정책이 있을 수 있습니다.
사이트
Sites 범주에 있는 정책은 특정 클러스터에 적용됩니다. 모든 클러스터에는 Sites 범주에 있는 자체 정책이 있을 수 있습니다. 예를 들어 Sites/cluster1 에는 cluster 1 에 적용되는 자체 정책이 적용됩니다.

다음 다이어그램에서는 정책이 생성되는 방법을 보여줍니다.

정책 생성

19.14.1. 소스 사용자 정의 리소스 정책 적용

소스 사용자 정의 리소스 정책에는 다음이 포함됩니다.

  • SR-IOV 정책
  • PTP 정책
  • Performance Add-on Operator 정책
  • MachineConfigPool 정책
  • SCTP 정책

메타데이터 또는 spec/data에 대한 오버레이를 고려하여 ACM 정책을 생성하는 소스 사용자 지정 리소스를 정의해야 합니다. 예를 들어 common-namespace-policy 에는 모든 관리 클러스터에 있는 네임스페이스 정의가 포함되어 있습니다. 이 네임스페이스 는 Common 카테고리 아래에 배치되며 모든 클러스터에서 해당 사양 또는 데이터를 변경하지 않습니다.

네임스페이스 정책 예

다음 예에서는 이 네임스페이스의 소스 사용자 정의 리소스를 보여줍니다.

apiVersion: v1
kind: Namespace
metadata:
 name: openshift-sriov-network-operator
 labels:
   openshift.io/run-level: "1"

출력 예

네임스페이스 를 적용하는 정책에는 다음 예와 같이 위의 변경 없이 정의한 네임스페이스 가 포함됩니다.

apiVersion: policy.open-cluster-management.io/v1
kind: Policy
metadata:
   name: common-sriov-sub-ns-policy
   namespace: common-sub
   annotations:
       policy.open-cluster-management.io/categories: CM Configuration Management
       policy.open-cluster-management.io/controls: CM-2 Baseline Configuration
       policy.open-cluster-management.io/standards: NIST SP 800-53
spec:
   remediationAction: enforce
   disabled: false
   policy-templates:
       - objectDefinition:
           apiVersion: policy.open-cluster-management.io/v1
           kind: ConfigurationPolicy
           metadata:
               name: common-sriov-sub-ns-policy-config
           spec:
               remediationAction: enforce
               severity: low
               namespaceselector:
                   exclude:
                       - kube-*
                   include:
                       - '*'
               object-templates:
                   - complianceType: musthave
                     objectDefinition:
                       apiVersion: v1
                       kind: Namespace
                       metadata:
                           labels:
                               openshift.io/run-level: "1"
                           name: openshift-sriov-network-operator

SRIOV 정책 예

다음 예는 각 클러스터에 대해 다른 사양을 가진 다른 클러스터에 존재하는 SriovNetworkNodePolicy 정의를 보여줍니다. 이 예제에서는 SriovNetworkNodePolicy 의 소스 사용자 정의 리소스도 표시합니다.

apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
  name: sriov-nnp
  namespace: openshift-sriov-network-operator
spec:
  # The $ tells the policy generator to overlay/remove the spec.item in the generated policy.
  deviceType: $deviceType
  isRdma: false
  nicSelector:
    pfNames: [$pfNames]
  nodeSelector:
    node-role.kubernetes.io/worker: ""
  numVfs: $numVfs
  priority: $priority
  resourceName: $resourceName

출력 예

SriovNetworkNodePolicy 이름과 네임스페이스 는 모든 클러스터에 대해 동일하므로 둘 다 소스 SriovNetworkNodePolicy 에 정의됩니다. 그러나 생성된 정책에는 각 클러스터에 대한 정책을 조정하기 위해 입력 매개 변수로 $deviceType, $numVfs 가 필요합니다. 생성된 정책은 다음 예에 표시되어 있습니다.

apiVersion: policy.open-cluster-management.io/v1
kind: Policy
metadata:
    name: site-du-sno-1-sriov-nnp-mh-policy
    namespace: sites-sub
    annotations:
        policy.open-cluster-management.io/categories: CM Configuration Management
        policy.open-cluster-management.io/controls: CM-2 Baseline Configuration
        policy.open-cluster-management.io/standards: NIST SP 800-53
spec:
    remediationAction: enforce
    disabled: false
    policy-templates:
        - objectDefinition:
            apiVersion: policy.open-cluster-management.io/v1
            kind: ConfigurationPolicy
            metadata:
                name: site-du-sno-1-sriov-nnp-mh-policy-config
            spec:
                remediationAction: enforce
                severity: low
                namespaceselector:
                    exclude:
                        - kube-*
                    include:
                        - '*'
                object-templates:
                    - complianceType: musthave
                      objectDefinition:
                        apiVersion: sriovnetwork.openshift.io/v1
                        kind: SriovNetworkNodePolicy
                        metadata:
                            name: sriov-nnp-du-mh
                            namespace: openshift-sriov-network-operator
                        spec:
                            deviceType: vfio-pci
                            isRdma: false
                            nicSelector:
                                pfNames:
                                    - ens7f0
                            nodeSelector:
                                node-role.kubernetes.io/worker: ""
                            numVfs: 8
                            resourceName: du_mh
참고

필수 입력 매개 변수를 $value (예: $deviceType )로 정의는 필수가 아닙니다. $ 는 정책 생성기를 오버레이에 지시하거나 생성된 정책에서 항목을 제거합니다. 그렇지 않으면 값이 변경되지 않습니다.

19.14.2. PolicyGenTemplate

PolicyGenTemplate.yaml 파일은 PolicyGen에 생성된 정책과 오버레이해야 하는 항목을 분류할 위치를 알려주는 CRD(Custom Resource Definition)입니다.

다음 예제에서는 PolicyGenTemplate.yaml 파일을 보여줍니다.

apiVersion: ran.openshift.io/v1
kind: PolicyGenTemplate
metadata:
  name: "group-du-sno"
  namespace: "group-du-sno"
spec:
  bindingRules:
    group-du-sno: ""
  mcp: "master"
  sourceFiles:
    - fileName: ConsoleOperatorDisable.yaml
      policyName: "console-policy"
    - fileName: ClusterLogging.yaml
      policyName: "cluster-log-policy"
      spec:
        curation:
          curator:
            schedule: "30 3 * * *"
          collection:
            logs:
              type: "fluentd"
              fluentd: {}

group-du-ranGen.yaml 파일은 group -du라는 그룹에 정책 그룹을 정의합니다. 이 파일은 sourceFiles 에 정의된 기타 정책의 노드 선택기로 사용되는 MachineConfigPool worker-du 를 정의합니다. ACM 정책은 source Files 에 존재하는 모든 소스 파일에 대해 생성됩니다. 또한 그룹-두 정책에 대한 클러스터 선택 규칙을 적용하기 위해 단일 배치 바인딩 및 배치 규칙이 생성됩니다.

소스 파일 PtpConfigSlave.yaml 을 예로 사용하여 PtpConfigSlave에는 PtpConfig CR(사용자 정의 리소스)에 대한 정의가 있습니다. PtpConfigSlave 예제에 대해 생성된 정책의 이름은 group-du-ptp-config-policy 입니다. 생성된 group-du-ptp-config-policy 에 정의된 PtpConfig CR은 du-ptp-slave 로 지정됩니다. PtpConfigSlave.yaml정의된 사양은 소스 파일에 정의된 다른 사양 항목과 함께 du-ptp-slave 아래에 배치됩니다.

다음 예제에서는 group-du-ptp-config-policy 를 보여줍니다.

apiVersion: policy.open-cluster-management.io/v1
kind: Policy
metadata:
  name: group-du-ptp-config-policy
  namespace: groups-sub
  annotations:
    policy.open-cluster-management.io/categories: CM Configuration Management
    policy.open-cluster-management.io/controls: CM-2 Baseline Configuration
    policy.open-cluster-management.io/standards: NIST SP 800-53
spec:
    remediationAction: enforce
    disabled: false
    policy-templates:
        - objectDefinition:
            apiVersion: policy.open-cluster-management.io/v1
            kind: ConfigurationPolicy
            metadata:
                name: group-du-ptp-config-policy-config
            spec:
                remediationAction: enforce
                severity: low
                namespaceselector:
                    exclude:
                        - kube-*
                    include:
                        - '*'
                object-templates:
                    - complianceType: musthave
                      objectDefinition:
                        apiVersion: ptp.openshift.io/v1
                        kind: PtpConfig
                        metadata:
                            name: slave
                            namespace: openshift-ptp
                        spec:
                            recommend:
                                - match:
                                - nodeLabel: node-role.kubernetes.io/worker-du
                                  priority: 4
                                  profile: slave
                            profile:
                                - interface: ens5f0
                                  name: slave
                                  phc2sysOpts: -a -r -n 24
                                  ptp4lConf: |
                                    [global]
                                    #
                                    # Default Data Set
                                    #
                                    twoStepFlag 1
                                    slaveOnly 0
                                    priority1 128
                                    priority2 128
                                    domainNumber 24
                                    .....

19.14.3. 사용자 정의 리소스 정책 생성 시 고려 사항

  • ACM 정책을 생성하는 데 사용되는 사용자 지정 리소스는 메타데이터 및 spec/data의 오버레이를 고려하여 정의해야 합니다. 예를 들어 사용자 지정 리소스 metadata.name 이 클러스터 간에 변경되지 않으면 사용자 정의 리소스 파일에서 metadata.name 값을 설정해야 합니다. 사용자 지정 리소스에 동일한 클러스터에 여러 개의 인스턴스가 있는 경우 사용자 지정 리소스 metadata.name 을 정책 템플릿 파일에 정의해야 합니다.
  • 특정 머신 구성 풀에 대한 노드 선택기를 적용하려면 정책 템플릿에서 정의된 mcp 값을 사용하여 $mcp 값을 오버레이하도록 노드 선택기 값을 $mcp 로 설정해야 합니다.
  • 서브스크립션 소스 파일은 변경되지 않습니다.

19.14.4. RAN 정책 생성

사전 요구 사항

절차

  1. policyGenerator .yaml 파일을 참조하도록 thekustomization.yaml 파일을 구성합니다. 다음 예는 PolicyGenerator 정의를 보여줍니다.

    apiVersion: policyGenerator/v1
    kind: PolicyGenerator
    metadata:
      name: acm-policy
      namespace: acm-policy-generator
    # The arguments should be given and defined as below with same order --policyGenTempPath= --sourcePath= --outPath= --stdout --customResources
    argsOneLiner: ./ranPolicyGenTempExamples ./sourcePolicies ./out true false

    다음과 같습니다.

    • policyGenTempPathpolicyGenTemp 파일의 경로입니다.
    • source path : 소스 정책의 경로입니다.
    • outPath: 생성된 ACM 정책을 저장하는 경로입니다.
    • stdout: true인 경우 생성된 정책을 콘솔에 인쇄합니다.
    • customResources: true 가 ACM 정책이 없는 sourcePolicies 파일에서 CR을 생성하는 경우
  2. 다음 명령을 실행하여 PolicyGen을 테스트합니다.

    $ cd cnf-features-deploy/ztp/ztp-policy-generator/
    $ XDG_CONFIG_HOME=./ kustomize build --enable-alpha-plugins

    다음 예와 같이 예상 정책이 포함된 아웃 디렉터리가 생성됩니다.

    out
    ├── common
    │   ├── common-log-sub-ns-policy.yaml
    │   ├── common-log-sub-oper-policy.yaml
    │   ├── common-log-sub-policy.yaml
    │   ├── common-pao-sub-catalog-policy.yaml
    │   ├── common-pao-sub-ns-policy.yaml
    │   ├── common-pao-sub-oper-policy.yaml
    │   ├── common-pao-sub-policy.yaml
    │   ├── common-policies-placementbinding.yaml
    │   ├── common-policies-placementrule.yaml
    │   ├── common-ptp-sub-ns-policy.yaml
    │   ├── common-ptp-sub-oper-policy.yaml
    │   ├── common-ptp-sub-policy.yaml
    │   ├── common-sriov-sub-ns-policy.yaml
    │   ├── common-sriov-sub-oper-policy.yaml
    │   └── common-sriov-sub-policy.yaml
    ├── groups
    │   ├── group-du
    │   │   ├── group-du-mc-chronyd-policy.yaml
    │   │   ├── group-du-mc-mount-ns-policy.yaml
    │   │   ├── group-du-mcp-du-policy.yaml
    │   │   ├── group-du-mc-sctp-policy.yaml
    │   │   ├── group-du-policies-placementbinding.yaml
    │   │   ├── group-du-policies-placementrule.yaml
    │   │   ├── group-du-ptp-config-policy.yaml
    │   │   └── group-du-sriov-operconfig-policy.yaml
    │   └── group-sno-du
    │       ├── group-du-sno-policies-placementbinding.yaml
    │       ├── group-du-sno-policies-placementrule.yaml
    │       ├── group-sno-du-console-policy.yaml
    │       ├── group-sno-du-log-forwarder-policy.yaml
    │       └── group-sno-du-log-policy.yaml
    └── sites
        └── site-du-sno-1
            ├── site-du-sno-1-policies-placementbinding.yaml
            ├── site-du-sno-1-policies-placementrule.yaml
            ├── site-du-sno-1-sriov-nn-fh-policy.yaml
            ├── site-du-sno-1-sriov-nnp-mh-policy.yaml
            ├── site-du-sno-1-sriov-nw-fh-policy.yaml
            ├── site-du-sno-1-sriov-nw-mh-policy.yaml
            └── site-du-sno-1-.yaml

    공통 정책은 모든 클러스터에 적용되므로 플랫입니다. 그러나 그룹 및 사이트에는 다른 클러스터에 적용되므로 각 그룹 및 사이트의 하위 디렉터리가 있습니다.