1.2. 模板处理
配置策略和操作器策略支持包含 Golang 文本模板。这些模板在 hub 集群或目标受管集群的运行时使用与该集群相关的配置解决。这可让您使用动态内容定义配置策略,并通知或强制实施为目标集群自定义的 Kubernetes 资源。
策略定义可以包含 hub 集群和受管集群模板。hub 集群模板首先在 hub 集群中处理,然后将带有已解析 hub 集群模板的策略定义传播到目标集群。在受管集群中,ConfigPolicyController 处理策略定义中的任何受管集群模板,然后强制执行或验证完全解析的对象定义。
模板语法必须符合 Golang 模板语言规范,并且从解析的模板生成的资源定义必须是有效的 YAML。如需更多与 Package 模板相关的信息,请参阅 Golang 文档。模板验证中的任何错误都将识别为策略违反情况。当您使用自定义模板功能时,这些值会在运行时被替换。
重要:
-
重要: 如果您使用 hub 集群模板传播 secret 或其他敏感数据,则敏感数据存在于 hub 集群上的受管集群命名空间和发布该策略的受管集群中。模板内容在策略中扩展,策略不会由 OpenShift Container Platform ETCD 加密支持加密。要解决这个问题,请使用
fromSecret或copySecretData,它会自动加密 secret 中的值,或protect加密其他值。 当您添加多行字符串值(如 certificate)时,始终在模板管道末尾添加
| toRawJson | toLiteral语法来处理换行符。例如,如果您要从Secret资源复制证书并将其包含在ConfigMap资源中,则模板管道可能类似如下:ca.crt: '{{ fromSecret "openshift-config" "ca-config-map-secret" "ca.crt" | base64dec | toRawJson | toLiteral }}'ca.crt: '{{ fromSecret "openshift-config" "ca-config-map-secret" "ca.crt" | base64dec | toRawJson | toLiteral }}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow toRawJson模板函数将输入值转换为 JSON 字符串,其中新行转义不会影响 YAML 结构。toLiteral模板函数从输出中删除外部单引号。例如,当对键处理模板时:'{{ 'hello\nworld' | toRawJson }}'模板管道,输出为key: '"hello\nworld"'。键的输出:"{{ 'hello\nworld' | toRawJson | toLiteral }}'template pipeline iskey: "hello\nworld".
如需 hub 集群和受管集群模板的比较,请参阅下表:
1.2.1. hub 集群和受管集群模板的比较 复制链接链接已复制到粘贴板!
| 模板 | hub 集群 | 受管集群(managed cluster) |
|---|---|---|
| Syntax | golang 文本模板规格 | golang 文本模板规格 |
| Delimiter | {{hub … hub}} | {{ … }} |
| Context |
上下文变量 |
对于 |
| Access control |
默认情况下,您只能引用与
或者,您可以将
注: 服务帐户必须具有在 hub 集群模板中查找的任何资源 | 您可以引用集群中的任何资源。 |
| Functions | 组模板功能,支持对 Kubernetes 资源和字符串操作的动态访问。如需更多信息,请参阅模板功能。有关查询限制,请参阅 Access control 行。
hub 集群上的
等效的调用可能使用以下语法: | 组模板功能,支持对 Kubernetes 资源和字符串操作的动态访问。如需更多信息,请参阅模板功能。 |
| Function output storage |
在与受管集群同步前,模板功能的输出存储在 hub 集群上每个适用的受管集群命名空间中的 | 模板功能的输出不存储在策略相关的资源对象中。 |
| Processing | 在 hub 集群的运行时,处理会在复制策略传播到集群的过程中进行。只有在创建或更新模板时,策略中的策略和 hub 集群模板才会在 hub 集群中处理。 | 在受管集群中进行处理。策略定期处理,利用所引用资源中的数据自动更新解析的对象定义。每当引用的资源更改时,Operator 策略会自动更新。 |
| Processing errors | hub 集群模板中的错误显示为策略应用到的受管集群中的违反情况。 | 受管集群模板中的错误会在发生违反情况的特定目标集群中以违反的形式显示。 |
继续阅读以下主题:
1.2.2. 模板功能 复制链接链接已复制到粘贴板!
使用 {{hub … hub}} 分隔符或受管集群上的 {{ … }} 分隔符引用 Kubernetes 资源,如特定于资源和通用的模板功能。为方便起见,您可以使用特定于资源的功能,并使资源内容更易于访问。
1.2.2.1. 模板功能描述 复制链接链接已复制到粘贴板!
如果您使用通用的函数 lookup,它更为高级,请熟悉正在查找的资源的 YAML 结构。除了这些功能外,实用程序功能(如 base64enc、base64dec、indent、autoindent、toInt、toBool 等等)。
要将模板符合 YAML 语法,您必须使用引号或块字符(| 或 > )在策略资源中将模板定义为字符串。这会导致解析的模板值也是字符串。要覆盖此功能,请使用 toInt 或 toBool 作为模板中的最终功能,以启动进一步处理,强制将值解释为整数或布尔值。
继续阅读以查看支持的一些自定义模板功能的描述和示例:
1.2.2.1.1. fromSecret 复制链接链接已复制到粘贴板!
fromSecret 功能返回 secret 中给定 data 键的值。查看该功能的以下语法:
func fromSecret (ns string, secretName string, datakey string) (dataValue string, err error)
func fromSecret (ns string, secretName string, datakey string) (dataValue string, err error)
使用此功能时,请输入 Kubernetes Secret 资源的命名空间、名称和数据键。在 hub 集群模板中使用函数时,您必须使用用于策略的同一命名空间。如需了解更多详细信息,请参阅模板处理。
查看在目标集群上强制执行 Secret 资源的以下配置策略。
重要: 当您添加多行字符串值时,证书始终会在模板管道末尾添加 | toRawJson | toLiteral 语法来处理换行符。例如,如果您要从 Secret 资源复制证书并将其包含在 ConfigMap 资源中,则模板管道可能类似如下:
ca.crt: '{{ fromSecret "openshift-config" "ca-config-map-secret" "ca.crt" | base64dec | toRawJson | toLiteral }}'
ca.crt: '{{ fromSecret "openshift-config" "ca-config-map-secret" "ca.crt" | base64dec | toRawJson | toLiteral }}'
-
toRawJson模板函数将输入值转换为 JSON 字符串,其中新行转义不会影响 YAML 结构。 -
toLiteral模板函数从输出中删除外部单引号。例如,当对键处理模板时:'{{ 'hello\nworld' | toRawJson }}'模板管道,输出为key: '"hello\nworld"'。键的输出:"{{ 'hello\nworld' | toRawJson | toLiteral }}'template pipeline iskey: "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)
func fromConfigMap (ns string, configmapName string, datakey string) (dataValue string, err Error)
查看在目标受管集群中强制执行 Kubernetes 资源的以下配置策略。
1.2.2.1.3. fromClusterClaim 复制链接链接已复制到粘贴板!
fromClusterClaim 功能返回 ClusterClaim 资源中的 Spec.Value 的值。查看该功能的以下语法:
func fromClusterClaim (clusterclaimName string) (dataValue string, err Error)
func fromClusterClaim (clusterclaimName string) (dataValue string, err Error)
查看在目标受管集群上强制执行 Kubernetes 资源的配置策略示例。
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)
func lookup (apiversion string, kind string, namespace string, name string, labelselector ...string) (value string, err Error)
有关标签选择器示例,请参阅 Kubernetes 标签和选择器 文档的额外资源部分。查看在目标受管集群上强制执行 Kubernetes 资源的配置策略示例。
1.2.2.1.5. base64enc 复制链接链接已复制到粘贴板!
base64enc 功能返回以 base64 编码的输入 data string 值。使用这个功能时,输入字符串值。查看该功能的以下语法:
func base64enc (data string) (enc-data string)
func base64enc (data string) (enc-data string)
查看以下使用 base64enc 功能的配置策略示例:
1.2.2.1.6. base64dec 复制链接链接已复制到粘贴板!
base64dec 功能返回一个以 base64 解码的输入的 enc-data string 值。使用这个功能时,输入字符串值。查看该功能的以下语法:
func base64dec (enc-data string) (data string)
func base64dec (enc-data string) (data string)
查看以下使用 base64enc 功能的配置策略示例:
1.2.2.1.7. indent 复制链接链接已复制到粘贴板!
indent 功能会返回经过 padded 的 data string。使用这个功能时,输入带有特定空格数的数据字符串。查看该功能的以下语法:
func indent (spaces int, data string) (padded-data string)
func indent (spaces int, data string) (padded-data string)
查看以下使用 indent 功能的配置策略示例:
1.2.2.1.8. autoindent 复制链接链接已复制到粘贴板!
autoindent 函数的作用类似于 indent 函数,它根据模板前面的空格数自动决定前导空格的数量。
查看以下使用 autoindent 函数的配置策略示例:
1.2.2.1.9. toInt 复制链接链接已复制到粘贴板!
toInt 函数处理并返回输入值的整数值。另外,如果这是模板中的最后一个功能,也会进一步处理源内容。这是为了确保该值由 YAML 解释为整数。使用这个功能时,输入需要转换为整数的数据。查看该功能的以下语法:
func toInt (input interface{}) (output int)
func toInt (input interface{}) (output int)
查看以下使用 toInt 功能的配置策略示例:
1.2.2.1.10. toBool 复制链接链接已复制到粘贴板!
toBool 函数将输入字符串转换为布尔值,并返回布尔值。另外,如果这是模板中的最后一个功能,也会进一步处理源内容。这是为了确保该值被 YAML 解释为布尔值。使用此功能时,请输入需要转换为布尔值的字符串数据。查看该功能的以下语法:
func toBool (input string) (output bool)
func toBool (input string) (output bool)
查看以下使用 toBool 函数的配置策略示例:
1.2.2.1.11. fromYaml 复制链接链接已复制到粘贴板!
fromYaml或fromYAML函数将 YAML 字符串解析为 Golang 对象。您可以将此功能与具有 YAML 字符串值的ConfigMap资源一起使用。
1.2.2.1.12. toYaml 复制链接链接已复制到粘贴板!
toYaml或toYAML函数将 Golang 对象解析为 YAML 字符串。为了使多行结果正确缩进,必须将输出传递给自动缩进或缩进函数。
1.2.2.1.13. 保护 复制链接链接已复制到粘贴板!
通过 protect 功能,您可以在 hub 集群策略模板中对字符串进行加密。评估策略时,它将在受管集群上自动解密。查看以下使用 protect 功能的配置策略示例:
在前面的 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 }}'
key: '{{ "[\"10.10.10.10\", \"1.1.1.1\"]" | toLiteral }}'
使用 toLiteral 功能后,会显示以下更新:
key: ["10.10.10.10", "1.1.1.1"]
key: ["10.10.10.10", "1.1.1.1"]
1.2.2.1.15. copySecretData 复制链接链接已复制到粘贴板!
copySecretData 功能复制指定 secret 的所有数据内容。查看以下函数示例:
1.2.2.1.16. copyConfigMapData 复制链接链接已复制到粘贴板!
copyConfigMapData 功能复制指定 ConfigMap 的所有 data 内容。查看以下函数示例:
1.2.2.1.17. getNodesWithExactRoles 复制链接链接已复制到粘贴板!
getNodesWithExactRoles 函数返回一个节点列表,它只具有您指定的角色,并忽略具有除 node-role.kubernetes.io/worker 角色以外的任何其他角色的节点。查看以下示例功能,您可以在其中选择 "infra" 节点并忽略存储节点:
1.2.2.1.18. hasNodesWithExactRoles 复制链接链接已复制到粘贴板!
如果集群只包含您指定的角色的节点,则 hasNodesWithExactRoles 功能会返回 true 值,并忽略具有任何额外角色的节点,node-role.kubernetes.io/worker 角色除外。查看以下函数示例:
1.2.2.1.19. skipObject 复制链接链接已复制到粘贴板!
skipObject 功能仅适用于 ConfigurationPolicy 资源的受管集群模板。在 Go 模板信号中随时调用 {{ skipObject }},以跳过该策略的特定对象。当您将 skipObject 与 objectSelector 搭配使用时,您可以根据名称进一步过滤对象。您可以在条件中单独调用skipObject或使用可选布尔参数调用它。
查看以下示例,它选择具有标签 foo: bar 的对象,但跳过名称为 suffix -prod 的对象:
1.2.2.1.20. Sprig 开源 复制链接链接已复制到粘贴板!
另外,Red Hat Advanced Cluster Management 还支持 sprig 开源项目中包含的以下模板功能:
| Sprig 库 | Functions |
|---|---|
| 加密和安全 |
|
| Date |
|
| default |
列出的 |
| 字典和字典 |
|
| 编码 |
|
| 流量控制 |
|
| 整数数数 |
|
| 整数片段 |
直到 , |
| 列表 |
|
| 字符串列表 |
|
| 字符串 |
|
| 版本比较 |
|
1.2.2.2. 其他资源 复制链接链接已复制到粘贴板!
- 如需了解更多详细信息,请参阅模板处理。
- 有关用例,请参阅 策略中的 高级模板处理。
- 如需了解在本地解析 Go 模板的工具,请参阅 Policy CLI。
- 有关标签选择器示例,请参阅 Kubernetes 标签和选择器 文档。
- 请参阅 Golang 文档 - 软件包模板
- 如需了解更多详细信息,请参阅 Sprig Function 文档。
1.2.3. 在策略中使用高级模板处理 复制链接链接已复制到粘贴板!
使用受管集群和 hub 集群模板来减少在策略定义中为每个目标集群或硬代码配置值创建单独的策略的需求。为安全起见,hub 集群模板中的特定于资源和通用查询功能都仅限于 hub 集群上策略的命名空间。
重要: 如果您使用 hub 集群模板传播 secret 或其他敏感数据,则敏感数据存在于 hub 集群上的受管集群命名空间和发布该策略的受管集群中。模板内容在策略中扩展,策略不会由 OpenShift Container Platform ETCD 加密支持加密。要解决这个问题,请使用 fromSecret 或 copySecretData,它会自动加密 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 中指定 kind。objectSelector 与 namespaceSelector 类似,但它没有名称过滤功能。要根据名称过滤,请使用 skipObject Go 模板功能。如果您随时引用 {{ skipObject }},它会信号从策略的 objectSelector 中跳过该特定对象。
请参阅以下 YAML 示例,它选择具有标签 foo: bar 的对象,但跳过名称为 suffix -prod 的对象:
1.2.3.4. 在配置策略中处理原始模板 复制链接链接已复制到粘贴板!
object-template-raw 参数是一个可选参数,支持高级模板用例,如 if 条件函数和 范围 循环功能。object-templates-raw 参数接受包含 Go 模板的字符串,在使用这些模板时,它们必须生成 object-templates 数组。
例如,请参阅以下 YAML 示例,它将 species-category: mammal 标签添加到 default 命名空间中的任何 ConfigMap 中,其名称 键等于 Sea Otter :
注: 虽然 spec.object-templates 和 spec.object-templates-raw 是可选的,但必须设置两个参数字段之一。
查看以下策略示例,它使用高级模板为您的受管集群创建和配置基础架构 MachineSet 对象。
1.2.3.5. 在定义配置策略后解决 hub 模板 复制链接链接已复制到粘贴板!
默认情况下,如果您在 ConfigurationPolicy 和 OperatorPolicy 资源中使用 hub 模板,则必须使用这些资源与 hub 集群上定义的 Policy 资源对应。
您可以直接在受管集群中定义配置策略。例如,OpenShift GitOps 是您可以直接在受管集群中定义配置策略。要在这种情形中解决受管集群上的 hub 模板,您可以启用 governance-standalone-hub-templating 附加组件。
要启用 governance-standalone-hub-templating 附加组件,请完成以下步骤:
- 在 hub 集群中,进入受管集群命名空间。
使用以下 YAML 示例,使用
governance-standalone-hub-templating名称创建一个ManagedClusterAddOn资源:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
默认情况下,受管集群上的代理只能访问 hub 集群上的 ManagedCluster 资源。您可以在直接部署到受管集群的 ConfigurationPolicies 中使用 hub 集群模板中的 .ManagedClusterLabels 模板变量。
如果您希望 hub 模板访问其他资源,如 lookup 或 fromConfigMap 功能调用,您必须将这些特定权限添加到附加组件组中。您可以通过资源(如 Roles、ClusterRoles、RoleBindings 和 Cluster )添加这些权限。
RoleBindings
附加组件组的名称取决于您的受管集群的名称,但它有以下标准形式: system:open-cluster-management:cluster:<cluster name>:addon:governance-standalone-hub-templating。
要允许访问 hub 集群上的受管集群命名空间中的 Configmap,请完成以下步骤:
运行以下命令来添加
Role资源:oc create role -n <cluster name> cm-reader --verb=get,list,watch --resource=configmaps
oc create role -n <cluster name> cm-reader --verb=get,list,watch --resource=configmapsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来添加
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
oc create rolebinding -n <cluster name> cm-reader-binding --role=cm-reader --group=system:open-cluster-management:cluster:<cluster name>:addon:governance-standalone-hub-templatingCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
要确保 hub 集群上的这些资源被备份和恢复,请在您创建的每个资源中添加以下标签:
cluster.open-cluster-management.io/backup。
添加这些资源后,附加组件可以解析 hub 模板,策略的状态会保存到受管集群的 secret 上。如果 hub 集群暂时对受管集群不可用,此 secret 可防止中断。
1.2.3.6. 其他资源 复制链接链接已复制到粘贴板!
- 有关 备份和恢复 资源的详情,请参阅备份的资源。
- 如需了解更多详细信息,请参阅模板功能。
- 返回到模板处理。
- 如需了解在本地解析 Go 模板的工具,请参阅 Policy CLI。
- 如需了解更多详细信息,请参阅 Kubernetes 配置策略控制器。
- 另请参阅备份 etcd 数据。