1.2. 模板处理


配置策略和操作器策略支持包含 Golang 文本模板。这些模板在 hub 集群或目标受管集群的运行时使用与该集群相关的配置解决。这可让您使用动态内容定义配置策略,并通知或强制实施为目标集群自定义的 Kubernetes 资源。

策略定义可以包含 hub 集群和受管集群模板。hub 集群模板首先在 hub 集群中处理,然后将带有已解析 hub 集群模板的策略定义传播到目标集群。在受管集群中,ConfigPolicyController 处理策略定义中的任何受管集群模板,然后强制执行或验证完全解析的对象定义。

模板语法必须符合 Golang 模板语言规范,并且从解析的模板生成的资源定义必须是有效的 YAML。如需更多与 Package 模板相关的信息,请参阅 Golang 文档。模板验证中的任何错误都将识别为策略违反情况。当您使用自定义模板功能时,这些值会在运行时被替换。

重要:

  • 重要: 如果您使用 hub 集群模板传播 secret 或其他敏感数据,则敏感数据存在于 hub 集群上的受管集群命名空间和发布该策略的受管集群中。模板内容在策略中扩展,策略不会由 OpenShift Container Platform ETCD 加密支持加密。要解决这个问题,请使用 fromSecretcopySecretData,它会自动加密 secret 中的值,或 protect 加密其他值。
  • 当您添加多行字符串值(如 certificate)时,始终在模板管道末尾添加 | toRawJson | toLiteral 语法来处理换行符。例如,如果您要从 Secret 资源复制证书并将其包含在 ConfigMap 资源中,则模板管道可能类似如下:

    ca.crt: '{{ fromSecret "openshift-config" "ca-config-map-secret" "ca.crt"  | base64dec | toRawJson | toLiteral }}'
    Copy to Clipboard Toggle word wrap

    toRawJson 模板函数将输入值转换为 JSON 字符串,其中新行转义不会影响 YAML 结构。toLiteral 模板函数从输出中删除外部单引号。例如,当对 键处理模板时:'{{ 'hello\nworld' | toRawJson }}' 模板管道,输出为 key: '"hello\nworld"'键的输出:"{{ 'hello\nworld' | toRawJson | toLiteral }}' template pipeline is key: "hello\nworld".

如需 hub 集群和受管集群模板的比较,请参阅下表:

1.2.1. hub 集群和受管集群模板的比较

Expand
表 1.4. 比较表
模板hub 集群受管集群(managed cluster)

Syntax

golang 文本模板规格

golang 文本模板规格

Delimiter

{{hub … hub}}

{{ … }}

Context

上下文变量 .ManagedClusterName.ManagedClusterLabels.PolicyMetadata 可用。.ManagedClusterName 解析为传播策略的目标集群的名称。.ManagedClusterLabels 解析为传播策略的受管集群中标签的键和值映射。.PolicyMetadata 使用 root 策略中的值解析为带有 名称命名空间标签和注解 键的映射。

对于ConfigurationPolicy资源,上下文变量.ObjectName.ObjectNamespace.ObjectobjectDefinition内可用。如果对象不是集群范围的,则 ObjectNamespace会解析为您指定的spec.namespaceSelectormetadata.namespace中选择的命名空间的名称。.ObjectName解析为您指定的objectSelectormetadata.name中的对象名称。.Object是当前位于集群上的完整目标对象。

Access control

默认情况下,您只能引用与 Policy 对象相同的命名空间中的命名空间 Kubernetes 资源,以及策略传播到的集群的 ManagedCluster 对象。

或者,您可以将 Policy 对象中的 spec.hubTemplateOptions.serviceAccountName 字段指定到与 Policy 资源相同的命名空间中的服务帐户。当您指定字段时,服务帐户用于所有 hub 集群模板查找。

注: 服务帐户必须具有在 hub 集群模板中查找的任何资源 的列表 和监视 权限。

您可以引用集群中的任何资源。

Functions

组模板功能,支持对 Kubernetes 资源和字符串操作的动态访问。如需更多信息,请参阅模板功能。有关查询限制,请参阅 Access control 行。

hub 集群上的 fromSecret 模板功能将生成的值作为加密字符串存储在受管集群命名空间中。

等效的调用可能使用以下语法:{{hub "(lookup "v1" "Secret" "default" "my-hub-secret").data.message | protect hub}}

组模板功能,支持对 Kubernetes 资源和字符串操作的动态访问。如需更多信息,请参阅模板功能

Function output storage

在与受管集群同步前,模板功能的输出存储在 hub 集群上每个适用的受管集群命名空间中的 Policy 资源对象中。这意味着,对 hub 集群上的 Policy 资源对象的读取访问权限的任何人都可以读取模板功能的任何敏感结果,以及对受管集群上 ConfigurationPolicyOperatorPolicy 资源对象的读取访问权限的任何人。另外,如果启用了 etcd 加密,策略资源对象不会被加密。使用返回敏感输出的模板功能(如从机密中)时,最好仔细考虑这一点。

模板功能的输出不存储在策略相关的资源对象中。

Processing

在 hub 集群的运行时,处理会在复制策略传播到集群的过程中进行。只有在创建或更新模板时,策略中的策略和 hub 集群模板才会在 hub 集群中处理。

在受管集群中进行处理。策略定期处理,利用所引用资源中的数据自动更新解析的对象定义。每当引用的资源更改时,Operator 策略会自动更新。

Processing errors

hub 集群模板中的错误显示为策略应用到的受管集群中的违反情况。

受管集群模板中的错误会在发生违反情况的特定目标集群中以违反的形式显示。

继续阅读以下主题:

1.2.2. 模板功能

使用 {{hub …​ hub}} 分隔符或受管集群上的 {{ …​ }} 分隔符引用 Kubernetes 资源,如特定于资源和通用的模板功能。为方便起见,您可以使用特定于资源的功能,并使资源内容更易于访问。

1.2.2.1. 模板功能描述

如果您使用通用的函数 lookup,它更为高级,请熟悉正在查找的资源的 YAML 结构。除了这些功能外,实用程序功能(如 base64encbase64decindentautoindenttoInttoBool 等等)。

要将模板符合 YAML 语法,您必须使用引号或块字符(| 或 > )在策略资源中将模板定义为字符串。这会导致解析的模板值也是字符串。要覆盖此功能,请使用 toInttoBool 作为模板中的最终功能,以启动进一步处理,强制将值解释为整数或布尔值。

继续阅读以查看支持的一些自定义模板功能的描述和示例:

1.2.2.1.1. fromSecret

fromSecret 功能返回 secret 中给定 data 键的值。查看该功能的以下语法:

func fromSecret (ns string, secretName string, datakey string) (dataValue string, err error)
Copy to Clipboard Toggle word wrap

使用此功能时,请输入 Kubernetes Secret 资源的命名空间、名称和数据键。在 hub 集群模板中使用函数时,您必须使用用于策略的同一命名空间。如需了解更多详细信息,请参阅模板处理

查看在目标集群上强制执行 Secret 资源的以下配置策略。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromsecret
spec:
  object-templates:
  - objectDefinition:
      apiVersion: v1
      kind: Secret 
1

      metadata:
        name: demosecret
        namespace: test
      type: Opaque
      data: 
2

        USER_NAME: YWRtaW4=
        PASSWORD: '{{ fromSecret "default" "localsecret" "PASSWORD" }}' 
3
Copy to Clipboard Toggle word wrap
1
如果目标集群上不存在 Kubernetes Secret 资源,则会出现策略违反的情况。如果目标集群上不存在 data 键,则该值将变为空字符串。
2
当您将 fromSecret 功能与 hub 集群模板搭配使用时,输出会自动使用 protect 功能加密,以保护到受管集群的值。
3
PASSWORD data 键的值是引用目标集群上 secret 的模板:

重要: 当您添加多行字符串值时,证书始终会在模板管道末尾添加 | toRawJson | toLiteral 语法来处理换行符。例如,如果您要从 Secret 资源复制证书并将其包含在 ConfigMap 资源中,则模板管道可能类似如下:

ca.crt: '{{ fromSecret "openshift-config" "ca-config-map-secret" "ca.crt"  | base64dec | toRawJson | toLiteral }}'
Copy to Clipboard Toggle word wrap
  • toRawJson 模板函数将输入值转换为 JSON 字符串,其中新行转义不会影响 YAML 结构。
  • toLiteral 模板函数从输出中删除外部单引号。例如,当对 键处理模板时:'{{ 'hello\nworld' | toRawJson }}' 模板管道,输出为 key: '"hello\nworld"'键的输出:"{{ 'hello\nworld' | toRawJson | toLiteral }}' template pipeline is key: "hello\nworld".
1.2.2.1.2. fromConfigmap

fromConfigMap 功能返回 ConfigMap 中给定 data 键的值。使用此功能时,请输入 Kubernetes ConfigMap 资源的命名空间、名称和数据键。您必须使用 hub 集群模板中的功能用于策略的同一命名空间。如需了解更多详细信息,请参阅模板处理

查看该功能的以下语法:

func fromConfigMap (ns string, configmapName string, datakey string) (dataValue string, err Error)
Copy to Clipboard Toggle word wrap

查看在目标受管集群中强制执行 Kubernetes 资源的以下配置策略。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromcm-lookup
spec:
  object-templates:
  - objectDefinition:
      ...
      data: 
1

        app-name: sampleApp
        app-description: "this is a sample app"
        log-file: '{{ fromConfigMap "default" "logs-config" "log-file" }}' 
2

        log-level: '{{ fromConfigMap "default" "logs-config" "log-level" }}' 
3
Copy to Clipboard Toggle word wrap
1
如果目标集群上不存在 data 键,则该值将变为空字符串。
2
log-file 模板值从 default 命名空间中的 logs-config ConfigMap 检索 log-file data 键的值。
3
log-level 模板值从 default 命名空间中的 logs-config ConfigMap 检索 log-level data 键的值。
1.2.2.1.3. fromClusterClaim

fromClusterClaim 功能返回 ClusterClaim 资源中的 Spec.Value 的值。查看该功能的以下语法:

func fromClusterClaim (clusterclaimName string) (dataValue string, err Error)
Copy to Clipboard Toggle word wrap

查看在目标受管集群上强制执行 Kubernetes 资源的配置策略示例。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-clusterclaims 
1

spec:
  object-templates:
  - objectDefinition:
      ...
      data: 
2

        platform: '{{ fromClusterClaim "platform.open-cluster-management.io" }}' 
3

        product: '{{ fromClusterClaim "product.open-cluster-management.io" }}'
        version: '{{ fromClusterClaim "version.openshift.io" }}'
Copy to Clipboard Toggle word wrap
1
使用此功能时,输入 Kubernetes ClusterClaim 资源的名称。如果 ClusterClaim 资源不存在,您会收到策略违反情况。
2
配置值可以设置为 key-value 属性。
3
platform 数据键的值是一个模板,它检索 platform.open-cluster-management.io 集群声明的值。同样,它从 ClusterClaim 获取产品和版本的值:
1.2.2.1.4. lookup

lookup 功能将 Kubernetes 资源作为 JSON 兼容映射返回。使用此功能时,输入 Kubernetes 资源的 API 版本、类型、命名空间、名称和可选标签选择器。您必须在 hub 集群模板中使用与策略相同的命名空间。如需了解更多详细信息,请参阅模板处理

如果请求的资源不存在,则返回空映射。如果资源不存在,并且值提供给另一个模板功能,您可能会得到以下错误: invalid value; expected string

注: 使用默认 模板功能,因此为后续模板功能提供了正确的类型。请参阅 Sprig 开源 部分。

查看该功能的以下语法:

func lookup (apiversion string, kind string, namespace string, name string, labelselector ...string) (value string, err Error)
Copy to Clipboard Toggle word wrap

有关标签选择器示例,请参阅 Kubernetes 标签和选择器 文档的额外资源部分。查看在目标受管集群上强制执行 Kubernetes 资源的配置策略示例。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-lookup
spec:
  object-templates:
  - objectDefinition:
      ...
      data: 
1

        app-name: sampleApp
        app-description: "this is a sample app"
        metrics-url: >- 
2

          http://{{ (lookup "v1" "Service" "default" "metrics").spec.clusterIP }}:8080
Copy to Clipboard Toggle word wrap
1
配置值可以设置为 key-value 属性。
2
metrics-url 数据键的值是一个模板,它从 default 命名空间中获取 v1/Service Kubernetes metrics 资源,并设置为查询的资源中的 Spec.ClusterIP 的值:
1.2.2.1.5. base64enc

base64enc 功能返回以 base64 编码的输入 data string 值。使用这个功能时,输入字符串值。查看该功能的以下语法:

func base64enc (data string) (enc-data string)
Copy to Clipboard Toggle word wrap

查看以下使用 base64enc 功能的配置策略示例:

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromsecret
spec:
  object-templates:
  - objectDefinition:
      ...
      data:
        USER_NAME: >-
          {{ fromConfigMap "default" "myconfigmap" "admin-user" | base64enc }}
Copy to Clipboard Toggle word wrap
1.2.2.1.6. base64dec

base64dec 功能返回一个以 base64 解码的输入的 enc-data string 值。使用这个功能时,输入字符串值。查看该功能的以下语法:

func base64dec (enc-data string) (data string)
Copy to Clipboard Toggle word wrap

查看以下使用 base64enc 功能的配置策略示例:

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromsecret
spec:
  object-templates:
  - objectDefinition:
      ...
      data:
        app-name: >-
          {{ ( lookup "v1"  "Secret" "testns" "mytestsecret") .data.appname ) | base64dec }}
Copy to Clipboard Toggle word wrap
1.2.2.1.7. indent

indent 功能会返回经过 padded 的 data string。使用这个功能时,输入带有特定空格数的数据字符串。查看该功能的以下语法:

func indent (spaces  int,  data string) (padded-data string)
Copy to Clipboard Toggle word wrap

查看以下使用 indent 功能的配置策略示例:

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
spec:
  object-templates:
  - objectDefinition:
      ...
      data:
        Ca-cert: >-
          {{ ( index ( lookup "v1" "Secret" "default" "mycert-tls"  ).data  "ca.pem"  ) |  base64dec | indent 4  }}
Copy to Clipboard Toggle word wrap
1.2.2.1.8. autoindent

autoindent 函数的作用类似于 indent 函数,它根据模板前面的空格数自动决定前导空格的数量。

查看以下使用 autoindent 函数的配置策略示例:

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-fromsecret
spec:
  object-templates:
  - objectDefinition:
      ...
      data:
        Ca-cert: >-
          {{ ( index ( lookup "v1" "Secret" "default" "mycert-tls"  ).data  "ca.pem"  ) |  base64dec | autoindent }}
Copy to Clipboard Toggle word wrap
1.2.2.1.9. toInt

toInt 函数处理并返回输入值的整数值。另外,如果这是模板中的最后一个功能,也会进一步处理源内容。这是为了确保该值由 YAML 解释为整数。使用这个功能时,输入需要转换为整数的数据。查看该功能的以下语法:

func toInt (input interface{}) (output int)
Copy to Clipboard Toggle word wrap

查看以下使用 toInt 功能的配置策略示例:

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-template-function
spec:
  object-templates:
  - objectDefinition:
      ...
      spec:
        vlanid: >-
          {{ (fromConfigMap "site-config" "site1" "vlan")  | toInt }}
Copy to Clipboard Toggle word wrap
1.2.2.1.10. toBool

toBool 函数将输入字符串转换为布尔值,并返回布尔值。另外,如果这是模板中的最后一个功能,也会进一步处理源内容。这是为了确保该值被 YAML 解释为布尔值。使用此功能时,请输入需要转换为布尔值的字符串数据。查看该功能的以下语法:

func toBool (input string) (output bool)
Copy to Clipboard Toggle word wrap

查看以下使用 toBool 函数的配置策略示例:

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-template-function
spec:
  object-templates:
  - objectDefinition:
      ...
      spec:
        enabled: >-
          {{ (fromConfigMap "site-config" "site1" "enabled")  | toBool }}
Copy to Clipboard Toggle word wrap
1.2.2.1.11. fromYaml

fromYamlfromYAML函数将 YAML 字符串解析为 Golang 对象。您可以将此功能与具有 YAML 字符串值的ConfigMap资源一起使用。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-template-function
spec:
  object-templates:
  - objectDefinition:
      ...
      spec:
        replicas: >-
          {{ (fromConfigMap "default" "app-config" "config.yaml") | fromYaml | index "replicas" }}
Copy to Clipboard Toggle word wrap
1.2.2.1.12. toYaml

toYamltoYAML函数将 Golang 对象解析为 YAML 字符串。为了使多行结果正确缩进,必须将输出传递给自动缩进缩进函数。

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-template-function
spec:
  object-templates:
  - objectDefinition:
      ...
      data:
        config.yaml: |
          {{ dict "key1" "value1" "key2" "value2" | toYaml | autoindent }}
Copy to Clipboard Toggle word wrap
1.2.2.1.13. 保护

通过 protect 功能,您可以在 hub 集群策略模板中对字符串进行加密。评估策略时,它将在受管集群上自动解密。查看以下使用 protect 功能的配置策略示例:

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: demo-template-function
spec:
  object-templates:
  - objectDefinition:
    ...
    spec:
      enabled: >-
        {{hub (lookup "v1" "Secret" "default" "my-hub-secret").data.message | protect hub}}
Copy to Clipboard Toggle word wrap

在前面的 YAML 示例中,定义了使用 lookup 功能的现有 hub 集群策略模板。在受管集群命名空间中的复制策略上,值可能类似以下语法 :$ocm_encrypted:okrrBqt72oI+3WT/0vxeI3vGa+wpLD7Z0ZxFMLvL204=

使用的每个加密算法是 256 位密钥的 AES-CBC。对于每个受管集群,每个加密密钥都需要是唯一的,每 30 天自动轮转。

这样可确保您的解密的值永不会存储在受管集群的策略中。

要强制立即轮转,在 hub 集群上删除 policy-encryption-key Secret 上的 policy.open-cluster-management.io/last-rotated 注解。然后,会重新处理策略以使用新的加密密钥。

1.2.2.1.14. toLiteral

toLiteral 函数会在处理模板字符串后删除任何引号。您可以使用此功能将 JSON 字符串从 ConfigMap 字段转换为清单中的 JSON 值。运行以下功能从 key 参数值中删除引号:

key: '{{ "[\"10.10.10.10\", \"1.1.1.1\"]" | toLiteral }}'
Copy to Clipboard Toggle word wrap

使用 toLiteral 功能后,会显示以下更新:

key: ["10.10.10.10", "1.1.1.1"]
Copy to Clipboard Toggle word wrap
1.2.2.1.15. copySecretData

copySecretData 功能复制指定 secret 的所有数据内容。查看以下函数示例:

...
objectDefinition:
  apiVersion: v1
  kind: Secret
  metadata:
    name: my-secret-copy
  data: '{{ copySecretData "default" "my-secret" }}' 
1
Copy to Clipboard Toggle word wrap
1
注:当您将此功能与 hub 集群模板搭配使用时,输出会使用 保护功能 自动加密。
1.2.2.1.16. copyConfigMapData

copyConfigMapData 功能复制指定 ConfigMap 的所有 data 内容。查看以下函数示例:

...
objectDefinition:
  apiVersion: v1
  kind: ConfigMap
  metadata:
    name: my-secret-copy
  data: '{{ copyConfigMapData "default" "my-configmap" }}'
Copy to Clipboard Toggle word wrap
1.2.2.1.17. getNodesWithExactRoles

getNodesWithExactRoles 函数返回一个节点列表,它只具有您指定的角色,并忽略具有除 node-role.kubernetes.io/worker 角色以外的任何其他角色的节点。查看以下示例功能,您可以在其中选择 "infra" 节点并忽略存储节点:

...
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 }}
Copy to Clipboard Toggle word wrap
1.2.2.1.18. hasNodesWithExactRoles

如果集群只包含您指定的角色的节点,则 hasNodesWithExactRoles 功能会返回 true 值,并忽略具有任何额外角色的节点,node-role.kubernetes.io/worker 角色除外。查看以下函数示例:

...
objectDefinition:
  apiVersion: v1
  kind: ConfigMap
  metadata:
    name: my-configmap
  data:
    key: '{{ hasNodesWithExactRoles "infra" }}'
Copy to Clipboard Toggle word wrap
1.2.2.1.19. skipObject

skipObject 功能仅适用于 ConfigurationPolicy 资源的受管集群模板。在 Go 模板信号中随时调用 {{ skipObject }},以跳过该策略的特定对象。当您将 skipObjectobjectSelector 搭配使用时,您可以根据名称进一步过滤对象。您可以在条件中单独调用skipObject或使用可选布尔参数调用它。

查看以下示例,它选择具有标签 foo: bar 的对象,但跳过名称为 suffix -prod 的对象:

...
objectSelector:
  matchExpressions:
  - key: foo
    operator: In
    values:
    - bar
objectDefinition:
  apiVersion: v1
  kind: ConfigMap
  data:
    key: '{{ skipObject (hasSuffix "-prod" .ObjectName) }}{{ hasNodesWithExactRoles "infra" }}'
Copy to Clipboard Toggle word wrap
1.2.2.1.20. Sprig 开源

另外,Red Hat Advanced Cluster Management 还支持 sprig 开源项目中包含的以下模板功能:

Expand
表 1.5. 支持的社区 Sprig 功能表
Sprig 库Functions

加密和安全

htpasswd

Date

date,mustToDate,now,toDate

default

默认fromJsonmustFromJson三元toJsontoRawJsonmustToRawJson

列出的Json函数也别名为等效的大写JSON函数。

字典和字典

dictdiggethasKeykeysmergemustMergesetunsetvalues

编码

b64dec , b64enc

流量控制

fail

整数数数

添加,mul,div,round,sub

整数片段

直到 , until Step,

列表

追加列表必须追加必须有必须前置必须切片前置切片

字符串列表

concatjoinsortAlphasplitsplitnsplitList

字符串

catcontainshasPrefixhasSuffixlowermustRegexFindmustRegexFindAllmustRegexMatchquoteregexFindregexFindAllregexMatchregexQuoteMetareplacesubstrtrimtrimAlltruncupper

版本比较

semver,semverCompare

1.2.2.2. 其他资源

1.2.3. 在策略中使用高级模板处理

使用受管集群和 hub 集群模板来减少在策略定义中为每个目标集群或硬代码配置值创建单独的策略的需求。为安全起见,hub 集群模板中的特定于资源和通用查询功能都仅限于 hub 集群上策略的命名空间。

重要: 如果您使用 hub 集群模板传播 secret 或其他敏感数据,则敏感数据存在于 hub 集群上的受管集群命名空间和发布该策略的受管集群中。模板内容在策略中扩展,策略不会由 OpenShift Container Platform ETCD 加密支持加密。要解决这个问题,请使用 fromSecretcopySecretData,它会自动加密 secret 中的值,或 protect 加密其他值。

继续阅读高级模板用例:

1.2.3.1. 重新处理的特殊注解

hub 集群模板会在策略创建过程中或更新引用的资源时解析到引用资源中的数据。

如果您需要手动启动更新,请使用特殊注解 policy.open-cluster-management.io/trigger-update 来指示模板引用的数据的更改。对特殊注解值的任何更改都会自动启动模板处理。另外,引用资源的最新内容会在传播以在受管集群上处理的策略定义中读取和更新。使用此注解的方法是每次递增值。

1.2.3.2. 绕过模板处理

默认情况下,Red Hat Advanced Cluster Management 会处理所有模板。您可能会创建一个策略,该策略在 policy-templates 中包含不是由 Red Hat Advanced Cluster Management 处理的策略。要绕过特定模板的模板处理,请将 {{ template content }} 更改为 +{{ '{{ template content }} +'。然后,模板会返回由后续模板引擎处理的原始字符串。

如果要完全绕过配置策略的模板解析,请在您的 Policy 资源中包含的相关 ConfigurationPolicy 中添加 policy.open-cluster-management.io/disable-templates: "true" 注解。

1.2.3.3. 配置策略 objectSelector

要迭代由带有 ConfigurationPolicy 的标签过滤的许多对象,请使用 objectSelector 并在 objectDefinition 中指定 kindobjectSelectornamespaceSelector 类似,但它没有名称过滤功能。要根据名称过滤,请使用 skipObject Go 模板功能。如果您随时引用 {{ skipObject }},它会信号从策略的 objectSelector 中跳过该特定对象。

请参阅以下 YAML 示例,它选择具有标签 foo: bar 的对象,但跳过名称为 suffix -prod 的对象:

...
objectSelector:
  matchExpressions:
  - key: foo
    operator: In
    values:
    - bar
objectDefinition:
  apiVersion: v1
  kind: ConfigMap
  data:
    key: '{{ if (hasSuffix "-prod" .ObjectName) }}{{ skipObject }}{{ end }}{{ hasNodesWithExactRoles "infra" }}'
Copy to Clipboard Toggle word wrap

1.2.3.4. 在配置策略中处理原始模板

object-template-raw 参数是一个可选参数,支持高级模板用例,如 if 条件函数和 范围 循环功能。object-templates-raw 参数接受包含 Go 模板的字符串,在使用这些模板时,它们必须生成 object-templates 数组。

例如,请参阅以下 YAML 示例,它将 species-category: mammal 标签添加到 default 命名空间中的任何 ConfigMap 中,其名称 键等于 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 }}
Copy to Clipboard Toggle word wrap

注: 虽然 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 }}
Copy to Clipboard Toggle word wrap

1.2.3.5. 在定义配置策略后解决 hub 模板

默认情况下,如果您在 ConfigurationPolicyOperatorPolicy 资源中使用 hub 模板,则必须使用这些资源与 hub 集群上定义的 Policy 资源对应。

您可以直接在受管集群中定义配置策略。例如,OpenShift GitOps 是您可以直接在受管集群中定义配置策略。要在这种情形中解决受管集群上的 hub 模板,您可以启用 governance-standalone-hub-templating 附加组件。

要启用 governance-standalone-hub-templating 附加组件,请完成以下步骤:

  1. 在 hub 集群中,进入受管集群命名空间。
  2. 使用以下 YAML 示例,使用 governance-standalone-hub-templating 名称创建一个 ManagedClusterAddOn 资源:

    apiVersion: addon.open-cluster-management.io/v1alpha1
    kind: ManagedClusterAddOn
    metadata:
      name: governance-standalone-hub-templating
      namespace: <cluster name>
      labels:
        cluster.open-cluster-management.io/backup: ''
    spec:
      installNamespace: open-cluster-management-agent-addon
    Copy to Clipboard Toggle word wrap

默认情况下,受管集群上的代理只能访问 hub 集群上的 ManagedCluster 资源。您可以在直接部署到受管集群的 ConfigurationPolicies 中使用 hub 集群模板中的 .ManagedClusterLabels 模板变量。

如果您希望 hub 模板访问其他资源,如 lookupfromConfigMap 功能调用,您必须将这些特定权限添加到附加组件组中。您可以通过资源(如 RolesClusterRoles、RoleBindings 和 ClusterRoleBindings )添加这些权限。

附加组件组的名称取决于您的受管集群的名称,但它有以下标准形式: system:open-cluster-management:cluster:<cluster name>:addon:governance-standalone-hub-templating

要允许访问 hub 集群上的受管集群命名空间中的 Configmap,请完成以下步骤:

  1. 运行以下命令来添加 Role 资源:

    oc create role -n <cluster name> cm-reader --verb=get,list,watch --resource=configmaps
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令来添加 Rolebinding

    oc create rolebinding -n <cluster name> cm-reader-binding --role=cm-reader --group=system:open-cluster-management:cluster:<cluster name>:addon:governance-standalone-hub-templating
    Copy to Clipboard Toggle word wrap
  3. 要确保 hub 集群上的这些资源被备份和恢复,请在您创建的每个资源中添加以下标签: cluster.open-cluster-management.io/backup

添加这些资源后,附加组件可以解析 hub 模板,策略的状态会保存到受管集群的 secret 上。如果 hub 集群暂时对受管集群不可用,此 secret 可防止中断。

1.2.3.6. 其他资源

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat