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 정책은 다음 세 개의 기본 그룹으로 분류됩니다.
- Common
-
일반범주에 존재하는 정책은 사이트 계획으로 표현할 모든 클러스터에 적용됩니다. - 그룹
-
그룹범주에 있는 정책은 클러스터 그룹에 적용됩니다. 모든 클러스터 그룹은 그룹 범주에 있는 자체 정책을 보유할 수 있습니다. 예를 들어Groups/group1에는group1에 속하는 클러스터에 적용되는 자체 정책이 있을 수 있습니다. - 사이트
-
Sites범주에 있는 정책은 특정 클러스터에 적용됩니다. 모든 클러스터에는Sites범주에 있는 자체 정책이 있을 수 있습니다. 예를 들어Sites/cluster1에는 cluster1에 적용되는 자체 정책이 적용됩니다.
다음 다이어그램에서는 정책이 생성되는 방법을 보여줍니다.
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 정책 생성 링크 복사링크가 클립보드에 복사되었습니다!
사전 요구 사항
- Kustomize 설치
- Kustomize Policy Generator 플러그인설치
절차
policyGenerator파일을 구성합니다. 다음 예는 PolicyGenerator 정의를 보여줍니다..yaml 파일을 참조하도록 thekustomization.yamlapiVersion: 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다음과 같습니다.
-
policyGenTempPath는policyGenTemp파일의 경로입니다. -
sourcepath : 소스 정책의 경로입니다. -
outPath: 생성된 ACM 정책을 저장하는 경로입니다. -
stdout:true인경우 생성된 정책을 콘솔에 인쇄합니다. -
customResources:true가 ACM 정책이 없는sourcePolicies파일에서 CR을 생성하는 경우
-
다음 명령을 실행하여 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공통 정책은 모든 클러스터에 적용되므로 플랫입니다. 그러나 그룹 및 사이트에는 다른 클러스터에 적용되므로 각 그룹 및 사이트의 하위 디렉터리가 있습니다.