10.11. PolicyGenTemplate CR에서 허브 템플릿 사용
토폴로지 Aware Lifecycle Manager는 GitOps ZTP(ZTP)와 함께 사용되는 구성 정책에서 partial Red Hat Advanced Cluster Management(RHACM) 허브 클러스터 템플릿 기능을 지원합니다.
Hub-side 클러스터 템플릿을 사용하면 대상 클러스터에 동적으로 사용자 지정할 수 있는 구성 정책을 정의할 수 있습니다. 이렇게 하면 similiar 구성이 있지만 값이 다른 많은 클러스터에 대해 별도의 정책을 만들 필요가 줄어듭니다.
정책 템플릿은 정책이 정의된 네임스페이스와 동일한 네임스페이스로 제한됩니다. 즉, 정책이 생성되는 동일한 네임스페이스의 hub 템플릿에서 참조되는 오브젝트를 생성해야 합니다.
다음과 같은 지원되는 허브 템플릿 함수는 TALM을 사용하여 GitOps ZTP에서 사용할 수 있습니다.
fromConfigmap
은 이름이 지정된ConfigMap
리소스에 제공된 데이터 키 값을 반환합니다.참고ConfigMap
CR에는 1MiB 크기 제한이 있습니다.ConfigMap
CR의 유효 크기는last-applied-configuration
주석으로 추가로 제한됩니다.last-applied-configuration
제한을 방지하려면 템플릿ConfigMap
에 다음 주석을 추가합니다.argocd.argoproj.io/sync-options: Replace=true
-
base64enc
는 입력 문자열의 base64 인코딩 값을 반환합니다. -
base64dec
은 base64로 인코딩된 입력 문자열의 디코딩된 값을 반환합니다. -
들여쓰기
는 추가된 들여쓰기 공백을 사용하여 입력 문자열을 반환합니다. -
autoindent
는 상위 템플릿에 사용된 간격에 따라 추가 들여쓰기가 포함된 입력 문자열을 반환합니다. -
ToInt
입력 값의 정수 값을 캐스팅하고 반환합니다. -
toBool
입력 문자열을 부울 값으로 변환하고 부울을 반환합니다.
GitOps ZTP에서 다양한 오픈 소스 커뮤니티 기능 도 사용할 수 있습니다.
추가 리소스
10.11.1. hub 템플릿 예
다음 코드 예제는 유효한 허브 템플릿입니다. 이러한 각 템플릿은 기본
네임스페이스에 test-config
라는 이름으로 ConfigMap
CR의 값을 반환합니다.
common-key
키를 사용하여 값을 반환합니다.{{hub fromConfigMap "default" "test-config" "common-key" hub}}
.ManagedClusterName
필드의 연결된 값과-name
문자열을 사용하여 문자열을 반환합니다.{{hub fromConfigMap "default" "test-config" (printf "%s-name" .ManagedClusterName) hub}}
.ManagedClusterName
필드의 연결된 값 및 문자열-name
:에서 부울 값을 캐스팅하고 반환합니다.{{hub fromConfigMap "default" "test-config" (printf "%s-name" .ManagedClusterName) | toBool hub}}
.ManagedClusterName
필드의 연결된 값 및 문자열-name
:에서 정수 값을 캐스팅하고 반환합니다.{{hub (printf "%s-name" .ManagedClusterName) | fromConfigMap "default" "test-config" | toInt hub}}
10.11.2. 허브 템플릿을 사용하여 PolicyGenTemplate CR에서 그룹 및 사이트 구성 지정
hub 템플릿을 사용하여 관리 클러스터에 적용되는 생성된 정책의 그룹 및 사이트 값을 채우는 방식으로 ConfigMap
CR을 사용하여 클러스터의 구성을 관리할 수 있습니다. PGT( PolicyGenTemplate
) CR에서 허브 템플릿을 사용하면 각 사이트에 대해 PolicyGenTemplate
CR을 생성할 필요가 없습니다.
사용 사례에 따라 다양한 범주의 플릿으로 클러스터를 그룹화할 수 있습니다(예: 하드웨어 유형 또는 리전). 각 클러스터에는 클러스터가 있는 그룹 또는 그룹에 해당하는 레이블이 있어야 합니다. 다른 ConfigMap
CR에서 각 그룹의 구성 값을 관리하는 경우 hub 템플릿을 사용하여 그룹의 모든 클러스터에 변경 사항을 적용하려면 하나의 그룹 PolicyGenTemplate
CR만 있으면 됩니다.
다음 예제에서는 3개의 ConfigMap
CR과 하나의 그룹 PolicyGenTemplate
CR을 사용하여 사이트 구성과 그룹 구성을 하드웨어 유형 및 리전별로 그룹화한 클러스터에 적용하는 방법을 보여줍니다.
fromConfigmap
함수를 사용하면 템플릿 리소스 데이터
키 필드에만 Cryostat 변수를 사용할 수 있습니다.
name
및 namespace
필드에는 사용할 수 없습니다.
사전 요구 사항
-
OpenShift CLI(
oc
)가 설치되어 있습니다. -
cluster-admin
권한이 있는 사용자로 hub 클러스터에 로그인했습니다. - 사용자 지정 사이트 구성 데이터를 관리하는 Git 리포지토리를 생성했습니다. 리포지토리는 hub 클러스터에서 액세스할 수 있어야 하며 GitOps ZTP ArgoCD 애플리케이션의 소스 리포지토리로 정의해야 합니다.
프로세스
그룹 및 사이트 구성이 포함된 세 개의
ConfigMap
CR을 생성합니다.하드웨어별 구성을 유지하기 위해
group-hardware-types-configmap
이라는ConfigMap
CR을 생성합니다. 예를 들면 다음과 같습니다.apiVersion: v1 kind: ConfigMap metadata: name: group-hardware-types-configmap namespace: ztp-group annotations: argocd.argoproj.io/sync-options: Replace=true 1 data: # SriovNetworkNodePolicy.yaml hardware-type-1-sriov-node-policy-pfNames-1: "[\"ens5f0\"]" hardware-type-1-sriov-node-policy-pfNames-2: "[\"ens7f0\"]" # PerformanceProfile.yaml hardware-type-1-cpu-isolated: "2-31,34-63" hardware-type-1-cpu-reserved: "0-1,32-33" hardware-type-1-hugepages-default: "1G" hardware-type-1-hugepages-size: "1G" hardware-type-1-hugepages-count: "32"
- 1
ConfigMap
이 크기가 1MiB를 초과하는 경우에만argocd.argoproj.io/sync-options
주석이 필요합니다.
지역 구성을 유지하기 위해
group-zones-configmap
이라는ConfigMap
CR을 생성합니다. 예를 들면 다음과 같습니다.apiVersion: v1 kind: ConfigMap metadata: name: group-zones-configmap namespace: ztp-group data: # ClusterLogForwarder.yaml zone-1-cluster-log-fwd-outputs: "[{\"type\":\"kafka\", \"name\":\"kafka-open\", \"url\":\"tcp://10.46.55.190:9092/test\"}]" zone-1-cluster-log-fwd-pipelines: "[{\"inputRefs\":[\"audit\", \"infrastructure\"], \"labels\": {\"label1\": \"test1\", \"label2\": \"test2\", \"label3\": \"test3\", \"label4\": \"test4\"}, \"name\": \"all-to-default\", \"outputRefs\": [\"kafka-open\"]}]"
사이트별 구성을 유지하기 위해
site-data-configmap
이라는ConfigMap
CR을 생성합니다. 예를 들면 다음과 같습니다.apiVersion: v1 kind: ConfigMap metadata: name: site-data-configmap namespace: ztp-group data: # SriovNetwork.yaml du-sno-1-zone-1-sriov-network-vlan-1: "140" du-sno-1-zone-1-sriov-network-vlan-2: "150"
참고각
ConfigMap
CR은 그룹PolicyGenTemplate
CR에서 생성할 정책과 동일한 네임스페이스에 있어야 합니다.-
Git에서
ConfigMap
CR을 커밋한 다음 Argo CD 애플리케이션에서 모니터링하는 Git 리포지토리로 내보냅니다. 하드웨어 유형 및 리전 레이블을 클러스터에 적용합니다. 다음 명령은
du-sno-1-zone-1
이라는 단일 클러스터에 적용되며, 선택한 레이블은"hardware-type": "hardware-type-1"
및"group-du-sno-zone": "zone-1"
입니다.$ oc patch managedclusters.cluster.open-cluster-management.io/du-sno-1-zone-1 --type merge -p '{"metadata":{"labels":{"hardware-type": "hardware-type-1", "group-du-sno-zone": "zone-1"}}}'
hub 템플릿을 사용하여
ConfigMap
오브젝트에서 필요한 데이터를 가져오는 그룹PolicyGenTemplate
CR을 생성합니다. 이 예제PolicyGenTemplate
CR은spec.bindingRules
아래에 나열된 라벨과 일치하는 클러스터에 대해 로깅, VLAN ID, NIC 및 성능 프로필을 구성합니다.apiVersion: ran.openshift.io/v1 kind: PolicyGenTemplate metadata: name: group-du-sno-pgt namespace: ztp-group spec: bindingRules: # These policies will correspond to all clusters with these labels group-du-sno-zone: "zone-1" hardware-type: "hardware-type-1" mcp: "master" sourceFiles: - fileName: ClusterLogForwarder.yaml # wave 10 policyName: "group-du-sno-cfg-policy" spec: outputs: '{{hub fromConfigMap "" "group-zones-configmap" (printf "%s-cluster-log-fwd-outputs" (index .ManagedClusterLabels "group-du-sno-zone")) | toLiteral hub}}' pipelines: '{{hub fromConfigMap "" "group-zones-configmap" (printf "%s-cluster-log-fwd-pipelines" (index .ManagedClusterLabels "group-du-sno-zone")) | toLiteral hub}}' - fileName: PerformanceProfile.yaml # wave 10 policyName: "group-du-sno-cfg-policy" metadata: name: openshift-node-performance-profile spec: additionalKernelArgs: - rcupdate.rcu_normal_after_boot=0 - vfio_pci.enable_sriov=1 - vfio_pci.disable_idle_d3=1 - efi=runtime cpu: isolated: '{{hub fromConfigMap "" "group-hardware-types-configmap" (printf "%s-cpu-isolated" (index .ManagedClusterLabels "hardware-type")) hub}}' reserved: '{{hub fromConfigMap "" "group-hardware-types-configmap" (printf "%s-cpu-reserved" (index .ManagedClusterLabels "hardware-type")) hub}}' hugepages: defaultHugepagesSize: '{{hub fromConfigMap "" "group-hardware-types-configmap" (printf "%s-hugepages-default" (index .ManagedClusterLabels "hardware-type")) hub}}' pages: - size: '{{hub fromConfigMap "" "group-hardware-types-configmap" (printf "%s-hugepages-size" (index .ManagedClusterLabels "hardware-type")) hub}}' count: '{{hub fromConfigMap "" "group-hardware-types-configmap" (printf "%s-hugepages-count" (index .ManagedClusterLabels "hardware-type")) | toInt hub}}' realTimeKernel: enabled: true - fileName: SriovNetwork.yaml # wave 100 policyName: "group-du-sno-sriov-policy" metadata: name: sriov-nw-du-fh spec: resourceName: du_fh vlan: '{{hub fromConfigMap "" "site-data-configmap" (printf "%s-sriov-network-vlan-1" .ManagedClusterName) | toInt hub}}' - fileName: SriovNetworkNodePolicy.yaml # wave 100 policyName: "group-du-sno-sriov-policy" metadata: name: sriov-nnp-du-fh spec: deviceType: netdevice isRdma: false nicSelector: pfNames: '{{hub fromConfigMap "" "group-hardware-types-configmap" (printf "%s-sriov-node-policy-pfNames-1" (index .ManagedClusterLabels "hardware-type")) | toLiteral hub}}' numVfs: 8 priority: 10 resourceName: du_fh - fileName: SriovNetwork.yaml # wave 100 policyName: "group-du-sno-sriov-policy" metadata: name: sriov-nw-du-mh spec: resourceName: du_mh vlan: '{{hub fromConfigMap "" "site-data-configmap" (printf "%s-sriov-network-vlan-2" .ManagedClusterName) | toInt hub}}' - fileName: SriovNetworkNodePolicy.yaml # wave 100 policyName: "group-du-sno-sriov-policy" metadata: name: sriov-nw-du-fh spec: deviceType: netdevice isRdma: false nicSelector: pfNames: '{{hub fromConfigMap "" "group-hardware-types-configmap" (printf "%s-sriov-node-policy-pfNames-2" (index .ManagedClusterLabels "hardware-type")) | toLiteral hub}}' numVfs: 8 priority: 10 resourceName: du_fh
참고사이트별 구성 값을 검색하려면
.ManagedClusterName
필드를 사용합니다. 이는 대상 관리 클러스터의 이름으로 설정된 템플릿 컨텍스트 값입니다.그룹별 구성을 검색하려면
.ManagedClusterLabels
필드를 사용합니다. 이는 관리 클러스터 레이블의 값으로 설정된 템플릿 컨텍스트 값입니다.Git에서 사이트
PolicyGenTemplate
CR을 커밋하고 ArgoCD 애플리케이션에서 모니터링하는 Git 리포지토리로 내보냅니다.참고참조된
ConfigMap
CR에 대한 후속 변경 사항은 적용된 정책과 자동으로 동기화되지 않습니다. 새ConfigMap
변경 사항을 수동으로 동기화하여 기존PolicyGenTemplate
CR을 업데이트해야 합니다. "기존 PolicyGenTemplate CR에 새 ConfigMap 변경 동기화"를 참조하십시오.여러 클러스터에 동일한
PolicyGenTemplate
CR을 사용할 수 있습니다. 구성이 변경되면 각 클러스터에 대한 구성을 보유하는ConfigMap
오브젝트와 관리 클러스터의 레이블을 유지하는 유일한 수정 사항이 있습니다.
10.11.3. 기존 PolicyGenTemplate CR에 새 ConfigMap 변경 사항 동기화
사전 요구 사항
-
OpenShift CLI(
oc
)가 설치되어 있습니다. -
cluster-admin
권한이 있는 사용자로 hub 클러스터에 로그인했습니다. -
hub 클러스터 템플릿을 사용하여
ConfigMap
CR에서 정보를 가져오는PolicyGenTemplate
CR을 생성했습니다.
프로세스
-
ConfigMap
CR의 콘텐츠를 업데이트하고 hub 클러스터의 변경 사항을 적용합니다. 업데이트된
ConfigMap
CR의 콘텐츠를 배포된 정책에 동기화하려면 다음 중 하나를 수행하십시오.옵션 1: 기존 정책을 삭제합니다. rgocd는
PolicyGenTemplate
CR을 사용하여 삭제된 정책을 즉시 다시 생성합니다. 예를 들어 다음 명령을 실행합니다.$ oc delete policy <policy_name> -n <policy_namespace>
옵션 2:
ConfigMap
을 업데이트할 때마다 다른 값을 사용하여정책에 특수 주석 정책.open-cluster-management.io/trigger-update
를 적용합니다. 예를 들면 다음과 같습니다.$ oc annotate policy <policy_name> -n <policy_namespace> policy.open-cluster-management.io/trigger-update="1"
참고변경 사항을 적용하려면 업데이트된 정책을 적용해야 합니다. 자세한 내용은 재처리를 위한 특수 주석을 참조하십시오.
선택 사항: 존재하는 경우 정책이 포함된
ClusterGroupUpdate
CR을 삭제합니다. 예를 들면 다음과 같습니다.$ oc delete clustergroupupgrade <cgu_name> -n <cgu_namespace>
업데이트된
ConfigMap
변경 사항에 적용할 정책이 포함된 새ClusterGroupUpdate
CR을 생성합니다. 예를 들어cgr-example.yaml
파일에 다음 YAML을 추가합니다.apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: <cgr_name> namespace: <policy_namespace> spec: managedPolicies: - <managed_policy> enable: true clusters: - <managed_cluster_1> - <managed_cluster_2> remediationStrategy: maxConcurrency: 2 timeout: 240
업데이트된 정책을 적용합니다.
$ oc apply -f cgr-example.yaml