1.2. 템플릿 처리


구성 정책 및 Operator 정책은 Golang 텍스트 템플릿을 포함할 수 있도록 지원합니다. 이러한 템플릿은 허브 클러스터 또는 해당 클러스터와 관련된 구성을 사용하여 대상 관리 클러스터에서 런타임 시 해결됩니다. 이를 통해 동적 콘텐츠로 정책을 정의하고 대상 클러스터에 사용자 지정된 Kubernetes 리소스를 알리거나 적용할 수 있습니다.

정책 정의에는 허브 클러스터 및 관리 클러스터 템플릿이 모두 포함될 수 있습니다. Hub 클러스터 템플릿은 허브 클러스터에서 먼저 처리된 다음 해결된 허브 클러스터 템플릿이 있는 정책 정의가 대상 클러스터로 전파됩니다. 관리 클러스터의 컨트롤러는 정책 정의에서 관리되는 클러스터 템플릿을 모두 처리한 다음 완전히 해결된 오브젝트 정의를 적용하거나 확인합니다.

템플릿은 Golang 템플릿 언어 사양을 준수해야 하며 확인된 템플릿에서 생성된 리소스 정의는 유효한 YAML이어야 합니다. 자세한 내용은 패키지 템플릿에 대한 Golang 설명서를 참조하십시오. 템플릿 검증의 오류는 정책 위반으로 인식됩니다. 사용자 지정 템플릿 함수를 사용하면 런타임 시 값이 교체됩니다.

중요:

  • 허브 클러스터 템플릿을 사용하여 시크릿 또는 기타 민감한 데이터를 전파하는 경우 허브 클러스터의 관리 클러스터 네임스페이스 및 해당 정책이 배포된 관리 클러스터에 중요한 데이터가 있습니다. 템플릿 콘텐츠는 정책에서 확장되며 정책은 OpenShift Container Platform ETCD 암호화 지원에 의해 암호화되지 않습니다. 이 문제를 해결하려면 시크릿에서 값을 자동으로 암호화하는 fromSecret 또는 copySecretData 를 사용하거나 다른 값을 암호화하도록 보호합니다.
  • 인증서와 같은 여러 줄 문자열 값을 추가하면 항상 템플릿 파이프라인 끝에 | toRawJson | toLiteral 구문을 추가하여 줄 바꿈을 처리합니다. 예를 들어 Secret 리소스에서 인증서를 복사하여 ConfigMap 리소스에 포함하는 경우 템플릿 파이프라인이 다음 구문과 유사할 수 있습니다.

    ca.crt: '{{ fromSecret "openshift-config" "ca-config-map-secret" "ca.crt"  | base64dec | toRawJson | toLiteral }}'

    toRawJson 템플릿 함수는 입력 값을 YAML 구조에 영향을 미치지 않도록 새 줄이 이스케이프된 JSON 문자열로 변환합니다. toLiteral 템플릿 함수는 출력에서 외부 작은따옴표를 제거합니다. 예를 들어, '{{ 'hello\nworld' | toRawJson }}' 템플릿 파이프라인에 대해 템플릿이 처리되면 key: '"hello\nworld"' 입니다. 키의 출력: '{{ 'hello\nworld' | toRawJson | toLiteral }}' 템플릿 파이프라인은 key: "hello\nworld" 입니다.

hub 클러스터 및 관리형 클러스터 템플릿의 비교는 다음 표를 참조하십시오.

1.2.1. 허브 클러스터 및 관리형 클러스터 템플릿 비교

표 1.4. 비교표
Templateshub 클러스터관리형 클러스터

구문

Golang 텍스트 템플릿 사양

Golang 텍스트 템플릿 사양

구분 기호

{{Hub … hub}}

{{ … }}

컨텍스트

런타임 시 정책이 전파되는 대상 클러스터의 이름으로 확인되는 .ManagedClusterName 변수를 사용할 수 있습니다. .ManagedClusterLabels 변수를 사용할 수도 있으며, 이 변수는 정책이 전파되는 관리형 클러스터의 라벨과 키 맵으로 확인됩니다.

컨텍스트 변수 없음

액세스 제어

기본적으로 Policy 오브젝트와 동일한 네임스페이스에 있는 네임스페이스가 지정된 Kubernetes 리소스 및 정책이 제공하는 클러스터의 ManagedCluster 오브젝트만 참조할 수 있습니다.

또는 Policy 리소스와 동일한 네임스페이스의 서비스 계정에 대해 Policy 오브젝트의 spec.hubTemplateOptions.serviceAccountName 필드를 지정할 수 있습니다. 필드를 지정하면 모든 허브 클러스터 템플릿 조회에 서비스 계정이 사용됩니다.

참고: 서비스 계정에는 허브 클러스터 템플릿에서 조회된 리소스에 대한 목록감시 권한이 있어야 합니다.

클러스터의 모든 리소스를 참조할 수 있습니다.

함수

Kubernetes 리소스 및 문자열 조작에 대한 동적 액세스를 지원하는 템플릿 함수 세트입니다. 자세한 내용은 템플릿 함수 를 참조하십시오. 조회 제한 사항은 액세스 제어 행을 참조하십시오.

hub 클러스터의 fromSecret 템플릿 기능은 결과 값을 관리되는 클러스터 네임스페이스에서 복제된 정책의 암호화된 문자열로 저장합니다.

동등한 호출은 다음 구문을 사용할 수 있습니다. {{hub "(lookup "v1" "Secret" "default" "my-hub-secret").data.message | protect hub}}

템플릿 함수 세트는 Kubernetes 리소스 및 문자열 조작에 대한 동적 액세스를 지원합니다. 자세한 내용은 템플릿 함수 를 참조하십시오.

함수 출력 스토리지

템플릿 기능의 출력은 관리 클러스터와 동기화되기 전에 Hub 클러스터의 각 관리 클러스터 네임스페이스의 Policy 리소스 오브젝트에 저장됩니다. 즉, hub 클러스터의 Policy 리소스 오브젝트에 대한 읽기 액세스 권한이 있는 모든 사용자와 관리 클러스터의 Configuration Policy 또는 OperatorPolicy 리소스 오브젝트에 대한 읽기 권한이 있는 사람이 템플릿 함수의 중요한 결과를 읽을 수 있습니다. 또한 etcd 암호화가 활성화된 경우 정책 리소스 오브젝트가 암호화되지 않습니다. 중요한 출력을 반환하는 템플릿 함수(예: 시크릿)를 사용할 때 이를 신중하게 고려하는 것이 좋습니다.

템플릿 기능의 출력은 정책 관련 리소스 오브젝트에 저장되지 않습니다.

정책 메타데이터

.PolicyMetadata 변수는 루트 정책의 값이 있는 ,namespace,labels, annotations 키가 있는 맵으로 확인됩니다.

컨텍스트 변수 없음

처리

처리는 클러스터에 복제된 정책을 전파하는 동안 허브 클러스터에서 런타임 시 수행됩니다. 정책 내의 정책 및 허브 클러스터 템플릿은 템플릿이 생성 또는 업데이트되는 경우에만 허브 클러스터에서 처리됩니다.

처리는 관리되는 클러스터에서 수행됩니다. 구성 정책은 정기적으로 처리되므로 확인된 오브젝트 정의를 참조된 리소스의 데이터로 자동으로 업데이트합니다. 참조된 리소스가 변경될 때마다 Operator 정책이 자동으로 업데이트됩니다.

처리 오류

허브 클러스터 템플릿의 오류는 정책이 적용되는 관리 클러스터에서 위반으로 표시됩니다.

관리형 클러스터 템플릿의 오류는 위반이 발생한 특정 대상 클러스터에서 위반으로 표시됩니다.

다음 항목을 계속 읽습니다.

1.2.2. 템플릿 함수

{{hub …​ hub}} 구분자를 사용하거나 {{ …​ }} 구분자를 사용하여 관리 클러스터에서 리소스별 및 일반 템플릿 기능과 같은 Kubernetes 리소스를 참조합니다. 편의를 위해 리소스별 기능을 사용하고 리소스의 콘텐츠에 보다 쉽게 액세스할 수 있도록 할 수 있습니다.

1.2.2.1. 템플릿 기능 설명

일반 함수를 사용하는 경우 더 고급인 lookup 을 사용하여 조회 중인 리소스의 YAML 구조를 숙지합니다. 이러한 함수 외에도 base64enc,base64dec,들여쓰기 ,autoindent ,toInt,toBool 등과 같은 유틸리티 함수를 사용할 수 있습니다.

YAML 구문을 사용하여 템플릿을 준수하려면 정책 리소스에 따옴표 또는 블록 문자(| 또는 > )를 사용하여 문자열로 템플릿을 정의해야 합니다. 이로 인해 해결된 템플릿 값도 문자열이 됩니다. 이를 재정의하려면 toInt 또는 toBool 을 템플릿의 최종 함수로 사용하여 값을 각각 정수 또는 부울로 해석하도록 강제 수행하는 추가 처리를 시작합니다.

지원되는 일부 사용자 지정 템플릿 함수에 대한 설명 및 예를 보려면 계속 읽으십시오.

1.2.2.1.1. fromSecret

fromSecret 함수는 시크릿에 지정된 데이터 키의 값을 반환합니다. 함수에 대해 다음 구문을 확인합니다.

func fromSecret (ns string, secretName string, datakey string) (dataValue string, err error)

이 기능을 사용하면 Kubernetes Secret 리소스의 네임스페이스, 이름 및 데이터 키를 입력합니다. hub 클러스터 템플릿의 기능을 사용할 때 정책에 사용되는 동일한 네임스페이스를 사용해야 합니다. 자세한 내용은 템플릿 처리를 참조하십시오.

대상 클러스터에 Secret 리소스를 적용하는 다음 구성 정책을 확인합니다.

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromsecret
  namespace: test
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
      apiVersion: v1
      data: 1
        USER_NAME: YWRtaW4=
        PASSWORD: '{{ fromSecret "default" "localsecret" "PASSWORD" }}' 2
      kind: Secret 3
      metadata:
        name: demosecret
        namespace: test
      type: Opaque
  remediationAction: enforce
  severity: low
1
이 기능을 hub 클러스터 템플릿과 함께 사용하면 보호 기능을 사용하여 출력이 자동으로 암호화됩니다.
2
PASSWORD 데이터 키의 값은 대상 클러스터의 시크릿을 참조하는 템플릿입니다.
3
Kubernetes Secret 리소스가 대상 클러스터에 없는 경우 정책 위반이 발생합니다. 데이터 키가 대상 클러스터에 없으면 값이 빈 문자열이 됩니다.

중요: 인증서와 같은 여러 줄 문자열 값을 추가하면 항상 템플릿 파이프라인 끝에 | toRawJson | toLiteral 구문을 추가하여 줄 바꿈을 처리합니다. 예를 들어 Secret 리소스에서 인증서를 복사하여 ConfigMap 리소스에 포함하는 경우 템플릿 파이프라인이 다음 구문과 유사할 수 있습니다.

ca.crt: '{{ fromSecret "openshift-config" "ca-config-map-secret" "ca.crt"  | base64dec | toRawJson | toLiteral }}'
  • toRawJson 템플릿 함수는 입력 값을 YAML 구조에 영향을 미치지 않도록 새 줄이 이스케이프된 JSON 문자열로 변환합니다.
  • toLiteral 템플릿 함수는 출력에서 외부 작은따옴표를 제거합니다. 예를 들어, '{{ 'hello\nworld' | toRawJson }}' 템플릿 파이프라인에 대해 템플릿이 처리되면 key: '"hello\nworld"' 입니다. 키의 출력: '{{ 'hello\nworld' | toRawJson | toLiteral }}' 템플릿 파이프라인은 key: "hello\nworld" 입니다.
1.2.2.1.2. fromConfigmap

fromConfigMap 함수는 구성 맵에 지정된 데이터 키의 값을 반환합니다. 이 기능을 사용하는 경우 Kubernetes ConfigMap 리소스의 네임스페이스, 이름 및 데이터 키를 입력합니다. hub 클러스터 템플릿의 기능을 사용하여 정책에 사용되는 동일한 네임스페이스를 사용해야 합니다. 자세한 내용은 템플릿 처리를 참조하십시오.

함수에 대해 다음 구문을 확인합니다.

func fromConfigMap (ns string, configmapName string, datakey string) (dataValue string, err Error)

대상 관리 클러스터에 Kubernetes 리소스를 적용하는 다음 구성 정책을 확인합니다.

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromcm-lookup
  namespace: test-templates
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
      kind: ConfigMap 1
      apiVersion: v1
      metadata:
        name: demo-app-config
        namespace: test
      data: 2
        app-name: sampleApp
        app-description: "this is a sample app"
        log-file: '{{ fromConfigMap "default" "logs-config" "log-file" }}' 3
        log-level: '{{ fromConfigMap "default" "logs-config" "log-level" }}' 4
  remediationAction: enforce
  severity: low
1
Kubernetes ConfigMap 리소스가 대상 클러스터에 없는 경우 정책 위반이 발생합니다.
2
데이터 키가 대상 클러스터에 없으면 값이 빈 문자열이 됩니다.
3
log-file 데이터 키의 값은 default 네임스페이스의 logs-config 구성 맵에서 로그 파일의 값을 검색하는 템플릿입니다.
4
로그 수준은 기본 네임스페이스에서 로그 수준 데이터 키의 값을 검색하는 tempalte입니다.
1.2.2.1.3. fromClusterClaim

fromClusterClaim 함수는 ClusterClaim 리소스의 Spec.Value 값을 반환합니다. 함수에 대해 다음 구문을 확인합니다.

func fromClusterClaim (clusterclaimName string) (dataValue string, err Error)

대상 관리 클러스터에 Kubernetes 리소스를 적용하는 구성 정책의 다음 예를 확인합니다.

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-clusterclaims 1
  namespace: default
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: sample-app-config
        namespace: default
      data: 2
        platform: '{{ fromClusterClaim "platform.open-cluster-management.io" }}' 3
        product: '{{ fromClusterClaim "product.open-cluster-management.io" }}'
        version: '{{ fromClusterClaim "version.openshift.io" }}'
  remediationAction: enforce
  severity: low
1
이 기능을 사용하는 경우 Kubernetes ClusterClaim 리소스의 이름을 입력합니다. ClusterClaim 리소스가 없는 경우 정책 위반이 발생합니다.
2
구성 값은 키-값 속성으로 설정할 수 있습니다.
3
platform data 키의 값은 platform.open-cluster-management.io 클러스터 클레임의 값을 검색하는 템플릿입니다. 마찬가지로 ClusterClaim 리소스에서 제품버전의 값을 검색합니다.
1.2.2.1.4. lookup

lookup 함수는 Kubernetes 리소스를 JSON 호환 맵으로 반환합니다. 이 기능을 사용하는 경우 Kubernetes 리소스의 API 버전, 종류, 네임스페이스, 이름 및 선택적 라벨 선택기를 입력합니다. 허브 클러스터 템플릿 내의 정책에 사용되는 동일한 네임스페이스를 사용해야 합니다. 자세한 내용은 템플릿 처리를 참조하십시오.

요청된 리소스가 없으면 빈 맵이 반환됩니다. 리소스가 존재하지 않고 값이 다른 템플릿 함수에 제공되는 경우 잘못된 값, 즉 예상 문자열 이라는 오류가 발생할 수 있습니다.

참고: 기본 템플릿 기능을 사용하므로 나중에 템플릿 기능에 올바른 유형이 제공됩니다. Sprig 오픈 소스 섹션을 참조하십시오.

함수에 대해 다음 구문을 확인합니다.

func lookup (apiversion string, kind string, namespace string, name string, labelselector ...string) (value string, err Error)

라벨 선택기 예제는 추가 리소스 섹션에서 Kubernetes 라벨 및 선택기 설명서에 대한 참조를 참조하십시오. 대상 관리 클러스터에 Kubernetes 리소스를 적용하는 구성 정책의 다음 예를 확인합니다.

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-lookup
  namespace: test-templates
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: demo-app-config
        namespace: test
      data: 1
        app-name: sampleApp
        app-description: "this is a sample app"
        metrics-url: | 2
          http://{{ (lookup "v1" "Service" "default" "metrics").spec.clusterIP }}:8080
  remediationAction: enforce
  severity: low
1
구성 값은 키-값 속성으로 설정할 수 있습니다.
2
metrics-url 데이터 키의 값은 default 네임스페이스에서 v1/Service Kubernetes 리소스 지표 를 검색하는 템플릿이며 쿼리된 리소스에서 Spec.ClusterIP 값으로 설정됩니다.
1.2.2.1.5. base64enc

base64enc 함수는 입력 데이터 문자열base64 로 인코딩된 값을 반환합니다. 이 함수를 사용하면 문자열 값을 입력합니다. 함수에 대해 다음 구문을 확인합니다.

func base64enc (data string) (enc-data string)

base64enc 함수를 사용하는 구성 정책의 다음 예제를 확인합니다.

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromsecret
  namespace: test
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
    ...
    data:
      USER_NAME: '{{ fromConfigMap "default" "myconfigmap" "admin-user" | base64enc }}'
1.2.2.1.6. base64dec

base64dec 함수는 입력 enc-data 문자열base64 디코딩 값을 반환합니다. 이 함수를 사용하면 문자열 값을 입력합니다. 함수에 대해 다음 구문을 확인합니다.

func base64dec (enc-data string) (data string)

base64dec 함수를 사용하는 구성 정책의 다음 예제를 확인합니다.

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromsecret
  namespace: test
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
    ...
    data:
      app-name: |
         "{{ ( lookup "v1"  "Secret" "testns" "mytestsecret") .data.appname ) | base64dec }}"
1.2.2.1.7. 들여쓰기

들여쓰기 함수는 패딩된 데이터 문자열 을 반환합니다. 이 함수를 사용하면 특정 수의 공백을 사용하여 데이터 문자열을 입력합니다. 함수에 대해 다음 구문을 확인합니다.

func indent (spaces  int,  data string) (padded-data string)

들여쓰기 함수를 사용하는 구성 정책의 다음 예제를 확인합니다.

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromsecret
  namespace: test
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
    ...
    data:
      Ca-cert:  |
        {{ ( index ( lookup "v1" "Secret" "default" "mycert-tls"  ).data  "ca.pem"  ) |  base64dec | indent 4  }}
1.2.2.1.8. autoindent

autoindent 함수는 템플릿 앞의 공백 수에 따라 선행 공간 수를 자동으로 결정하는 들여쓰기 함수처럼 작동합니다.

autoindent 함수를 사용하는 구성 정책의 다음 예제를 확인합니다.

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromsecret
  namespace: test
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
    ...
    data:
      Ca-cert:  |
        {{ ( index ( lookup "v1" "Secret" "default" "mycert-tls"  ).data  "ca.pem"  ) |  base64dec | autoindent }}
1.2.2.1.9. toInt

toInt 함수는 입력 값의 정수 값을 캐스팅하고 반환합니다. 이 기능이 템플릿의 마지막 기능인 경우 소스 콘텐츠를 추가로 처리합니다. 이는 값이 YAML에서 정수로 해석되도록 하는 것입니다. 이 함수를 사용하면 정수로 캐스팅해야 하는 데이터를 입력합니다. 함수에 대해 다음 구문을 확인합니다.

func toInt (input interface{}) (output int)

toInt 함수를 사용하는 구성 정책의 다음 예제를 확인합니다.

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-template-function
  namespace: test
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
    ...
    spec:
      vlanid:  |
        {{ (fromConfigMap "site-config" "site1" "vlan")  | toInt }}
1.2.2.1.10. toBool

toBool 함수는 입력 문자열을 부울로 변환하고 부울을 반환합니다. 이 기능이 템플릿의 마지막 기능인 경우 소스 콘텐츠를 추가로 처리합니다. 이는 값이 YAML에서 부울로 해석되도록 하는 것입니다. 이 함수를 사용하는 경우 부울로 변환해야 하는 문자열 데이터를 입력합니다. 함수에 대해 다음 구문을 확인합니다.

func toBool (input string) (output bool)

toBool 함수를 사용하는 구성 정책의 다음 예제를 확인합니다.

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-template-function
  namespace: test
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
    ...
    spec:
      enabled:  |
        {{ (fromConfigMap "site-config" "site1" "enabled")  | toBool }}
1.2.2.1.11. 보호

보호 기능을 사용하면 hub 클러스터 정책 템플릿에서 문자열을 암호화할 수 있습니다. 정책이 평가될 때 관리 클러스터에서 자동으로 암호 해독됩니다. protect 기능을 사용하는 구성 정책의 다음 예제를 확인합니다.

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-template-function
  namespace: test
spec:
  namespaceSelector:
    exclude:
    - kube-*
    include:
    - default
  object-templates:
  - complianceType: musthave
    objectDefinition:
    ...
    spec:
      enabled:  |
        {{hub (lookup "v1" "Secret" "default" "my-hub-secret").data.message | protect hub}}

이전 YAML 예제에는 lookup 함수를 사용하도록 정의된 기존 hub 클러스터 정책 템플릿이 있습니다. 관리형 클러스터 네임스페이스의 복제 정책에서 값은 다음 구문과 유사합니다. $ocm_encrypted:okrrBqt72oI+3WT/0vxeI3vGa+wpLD7Z0ZxFMLvL204=

사용되는 각 암호화 알고리즘은 256비트 키를 사용하는 AES-CBC입니다. 각 암호화 키는 관리 클러스터마다 고유하며 30일마다 자동으로 순환됩니다.

이렇게 하면 암호 해독된 값이 관리 클러스터의 정책에 저장되지 않습니다.

즉시 교체하려면 허브 클러스터의 관리 클러스터 네임스페이스의 policy.open-cluster -management.io/last- rotated 주석을 삭제합니다. 그런 다음 새 암호화 키를 사용하도록 정책을 다시 처리합니다.

1.2.2.1.12. toLiteral

toLiteral 함수는 처리된 후 템플릿 문자열 주위에 따옴표를 모두 제거합니다. 이 함수를 사용하여 구성 맵 필드에서 매니페스트의 JSON 값으로 JSON 문자열을 변환할 수 있습니다. 다음 함수를 실행하여 매개변수 값에서 따옴표를 제거합니다.

key: '{{ "[\"10.10.10.10\", \"1.1.1.1\"]" | toLiteral }}'

toLiteral 기능을 사용하면 다음 업데이트가 표시됩니다.

key: ["10.10.10.10", "1.1.1.1"]
1.2.2.1.13. copySecretData

copySecretData 함수는 지정된 시크릿의 모든 데이터 콘텐츠를 복사합니다. 함수의 다음 샘플을 확인합니다.

complianceType: musthave
      objectDefinition:
        apiVersion: v1
        kind: Secret
        metadata:
          name: my-secret-copy
        data: '{{ copySecretData "default" "my-secret" }}' 1
1
이 기능을 hub 클러스터 템플릿과 함께 사용하면 보호 기능을 사용하여 출력이 자동으로 암호화됩니다.
1.2.2.1.14. copyConfigMapData

copyConfigMapData 함수는 지정된 구성 맵의 모든 데이터 콘텐츠를 복사합니다. 함수의 다음 샘플을 확인합니다.

complianceType: musthave
      objectDefinition:
        apiVersion: v1
        kind: ConfigMap
        metadata:
          name: my-secret-copy
        data: '{{ copyConfigMapData "default" "my-configmap" }}'
1.2.2.1.15. getNodesWithExactRoles

getNodesWithExactRoles 함수는 지정한 역할만 가진 노드 목록을 반환하고 node-role.kubernetes.io/worker 역할을 제외한 추가 역할이 있는 노드를 무시합니다. "infra" 노드를 선택하고 스토리지 노드를 무시하는 다음 샘플 기능을 확인합니다.

      complianceType: musthave
      objectDefinition:
        apiVersion: v1
        kind: ConfigMap
        metadata:
          name: my-configmap
          data:
            infraNode: |
              {{- range $i,$nd := (getNodesWithExactRoles "infra").items }}
              node{{ $i }}: {{ $nd.metadata.name }}
              {{- end }}
            replicas: {{ len ((getNodesWithExactRoles "infra").items) | toInt }}
1.2.2.1.16. hasNodesWithExactRoles

hasNodesWithExactRoles 함수는 클러스터에 지정한 역할만 포함하는 노드가 포함된 경우 true 값을 반환하고 node-role.kubernetes.io/worker 역할을 제외한 추가 역할이 있는 노드를 무시합니다. 함수의 다음 샘플을 확인합니다.

      complianceType: musthave
      objectDefinition:
        apiVersion: v1
        kind: ConfigMap
        metadata:
          name: my-configmap
        data:
          key: '{{ hasNodesWithExactRoles "infra" }}'
1.2.2.1.17. sprig 오픈 소스

Red Hat Advanced Cluster Management는 sprig 오픈 소스 프로젝트에 포함된 다음 템플릿 기능을 지원합니다.

표 1.5. 지원되는 커뮤니티 Sprig 함수 표
sprig 라이브러리함수

암호화 및 보안

htpasswd

날짜

date,mustToDate,now,toDate

기본

Default,empty fromJson,mustFromJson,ternary,toJson,toRawJson

사전 및 사전

dict,dig,hasKey,merge,mustMerge,set,unset

정수 계산

더하기,mul,div,round,sub

정수 슬라이스

until, untilStep,

목록

추가,concat,has,list,mustAppend,mustHas,mustPrepend,mustSlice,prepend,slice

문자열 함수

cat, hasPrefix ,hasPrefix,hasSuffix,join,mustRegexFind All,mustRegexFindAll,mustRegexMatch,quote,regexFind,regexFindAll, CryostatMatch,regexQuoteMeta,replace,split n ,splitn,substr,trim All,trunc,upper

버전 비교

semver, semverCompare

1.2.2.2. 추가 리소스

1.2.3. 구성 정책의 고급 템플릿 처리

관리된 클러스터 및 허브 클러스터 템플릿을 모두 사용하여 각 대상 클러스터 또는 정책 정의에서 하드 코드 구성 값에 대한 별도의 정책을 생성할 필요성을 줄일 수 있습니다. 보안을 위해 리소스별 및 허브 클러스터 템플릿의 일반 조회 기능은 허브 클러스터의 정책 네임스페이스로 제한됩니다.

중요: 허브 클러스터 템플릿을 사용하여 보안 또는 기타 민감한 데이터를 전파하면 허브 클러스터의 관리 클러스터 네임스페이스 및 해당 정책이 배포된 관리 클러스터에 중요한 데이터 노출이 발생합니다. 템플릿 콘텐츠는 정책에서 확장되며 정책은 OpenShift Container Platform ETCD 암호화 지원에 의해 암호화되지 않습니다. 이 문제를 해결하려면 시크릿에서 값을 자동으로 암호화하는 fromSecret 또는 copySecretData 를 사용하거나 다른 값을 암호화하도록 보호합니다.

고급 템플릿 사용 사례에 대해 계속 읽습니다.

1.2.3.1. 재처리를 위한 특수 주석

Hub 클러스터 템플릿은 정책 생성 중에 참조된 리소스의 데이터 또는 참조된 리소스가 업데이트될 때 확인됩니다.

수동으로 업데이트를 시작해야 하는 경우 특수 주석 policy.open-cluster-management.io/trigger-update 를 사용하여 템플릿에서 참조하는 데이터의 변경 사항을 표시합니다. 특수 주석 값을 변경하면 템플릿 처리가 자동으로 시작됩니다. 또한 참조된 리소스의 최신 내용은 관리 클러스터에서 처리를 위해 전파되는 정책 정의에서 읽고 업데이트됩니다. 이 주석을 사용하는 방법은 매번 값을 하나씩 늘리는 것입니다.

1.2.3.2. 오브젝트 템플릿 처리

YAML 문자열 표현으로 오브젝트 템플릿을 설정합니다. object-template-raw 매개변수는 if-else 및 range 함수와 같은 고급 템플릿 사용 사례를 지원하는 선택적 매개변수입니다. 다음 예제는 kinds -category를 추가하도록 정의됩니다. 기본 네임스페이스의 모든 ConfigMap에 mammal 레이블은 name 키가 Sea Otter 와 같습니다.

object-templates-raw: |
  {{- range (lookup "v1" "ConfigMap" "default" "").items }}
  {{- if eq .data.name "Sea Otter" }}
  - complianceType: musthave
    objectDefinition:
      kind: ConfigMap
      apiVersion: v1
      metadata:
        name: {{ .metadata.name }}
        namespace: {{ .metadata.namespace }}
        labels:
          species-category: mammal
  {{- end }}
  {{- end }}

참고: spec.object-templatesspec.object-templates-raw 는 선택 사항이지만 두 매개변수 필드 중 하나만 설정해야 합니다.

고급 템플릿을 사용하여 관리 클러스터에 대한 인프라 MachineSet 오브젝트를 생성하고 구성하는 다음 정책 예제를 확인합니다.

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: create-infra-machineset
spec:
  remediationAction: enforce
  severity: low
  object-templates-raw: |
    {{- /* Specify the parameters needed to create the MachineSet  */ -}}
    {{- $machineset_role := "infra" }}
    {{- $region := "ap-southeast-1" }}
    {{- $zones := list "ap-southeast-1a" "ap-southeast-1b" "ap-southeast-1c" }}
    {{- $infrastructure_id := (lookup "config.openshift.io/v1" "Infrastructure" "" "cluster").status.infrastructureName }}
    {{- $worker_ms := (index (lookup "machine.openshift.io/v1beta1" "MachineSet" "openshift-machine-api" "").items 0) }}
    {{- /* Generate the MachineSet for each zone as specified  */ -}}
    {{- range $zone := $zones }}
    - complianceType: musthave
      objectDefinition:
        apiVersion: machine.openshift.io/v1beta1
        kind: MachineSet
        metadata:
          labels:
            machine.openshift.io/cluster-api-cluster: {{ $infrastructure_id }}
          name: {{ $infrastructure_id }}-{{ $machineset_role }}-{{ $zone }}
          namespace: openshift-machine-api
        spec:
          replicas: 1
          selector:
            matchLabels:
              machine.openshift.io/cluster-api-cluster: {{ $infrastructure_id }}
              machine.openshift.io/cluster-api-machineset: {{ $infrastructure_id }}-{{ $machineset_role }}-{{ $zone }}
          template:
            metadata:
              labels:
                machine.openshift.io/cluster-api-cluster: {{ $infrastructure_id }}
                machine.openshift.io/cluster-api-machine-role: {{ $machineset_role }}
                machine.openshift.io/cluster-api-machine-type: {{ $machineset_role }}
                machine.openshift.io/cluster-api-machineset: {{ $infrastructure_id }}-{{ $machineset_role }}-{{ $zone }}
            spec:
              metadata:
                labels:
                  node-role.kubernetes.io/{{ $machineset_role }}: ""
              taints:
                - key: node-role.kubernetes.io/{{ $machineset_role }}
                  effect: NoSchedule
              providerSpec:
                value:
                  ami:
                    id: {{ $worker_ms.spec.template.spec.providerSpec.value.ami.id }}
                  apiVersion: awsproviderconfig.openshift.io/v1beta1
                  blockDevices:
                    - ebs:
                        encrypted: true
                        iops: 2000
                        kmsKey:
                          arn: ''
                        volumeSize: 500
                        volumeType: io1
                  credentialsSecret:
                    name: aws-cloud-credentials
                  deviceIndex: 0
                  instanceType: {{ $worker_ms.spec.template.spec.providerSpec.value.instanceType }}
                  iamInstanceProfile:
                    id: {{ $infrastructure_id }}-worker-profile
                  kind: AWSMachineProviderConfig
                  placement:
                    availabilityZone: {{ $zone }}
                    region: {{ $region }}
                  securityGroups:
                    - filters:
                        - name: tag:Name
                          values:
                            - {{ $infrastructure_id }}-worker-sg
                  subnet:
                    filters:
                      - name: tag:Name
                        values:
                          - {{ $infrastructure_id }}-private-{{ $zone }}
                  tags:
                    - name: kubernetes.io/cluster/{{ $infrastructure_id }}
                      value: owned
                  userDataSecret:
                    name: worker-user-data
    {{- end }}

1.2.3.3. 템플릿 처리 우회

Red Hat Advanced Cluster Management에서 처리하지 않는 템플릿이 포함된 정책을 생성할 수 있습니다. 기본적으로 Red Hat Advanced Cluster Management는 모든 템플릿을 처리합니다.

허브 클러스터의 템플릿 처리를 바이패스하려면 {{ template content }}{{ '{{ template content }}' }} 로 변경해야 합니다.

또는 Policy:policy.open-cluster-management.io/disable-templates: "true"ConfigurationPolicy 섹션에 다음 주석을 추가할 수 있습니다. 이 주석이 포함된 경우 이전 해결 방법이 필요하지 않습니다. ConfigurationPolicy 용으로 템플릿 처리가 바이패스됩니다.

1.2.3.4. 추가 리소스

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.