1.2. 模板处理
配置策略和操作器策略支持包含 Golang 文本模板。这些模板在 hub 集群或目标受管集群的运行时使用与该集群相关的配置解决。这可让您使用动态内容定义策略,并通知或强制实施对目标集群自定义的 Kubernetes 资源。
策略定义可以包含 hub 集群和受管集群模板。hub 集群模板首先在 hub 集群中处理,然后将带有已解析 hub 集群模板的策略定义传播到目标集群。受管集群中的控制器处理策略定义中的任何受管集群模板,然后强制执行或验证完全解析的对象定义。
模板必须符合 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
功能返回配置映射中给定 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. 保护 复制链接链接已复制到粘贴板!
通过 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.12. toLiteral 复制链接链接已复制到粘贴板!
toLiteral
函数会在处理模板字符串后删除任何引号。您可以使用此功能将 JSON 字符串从配置映射字段转换为清单中的 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.13. copySecretData 复制链接链接已复制到粘贴板!
copySecretData
功能复制指定 secret 的所有数据
内容。查看以下函数示例:
1.2.2.1.14. copyConfigMapData 复制链接链接已复制到粘贴板!
copyConfigMapData
功能复制指定配置映射 的所有数据
内容。查看以下函数示例:
1.2.2.1.15. getNodesWithExactRoles 复制链接链接已复制到粘贴板!
getNodesWithExactRoles
函数返回一个节点列表,它只具有您指定的角色,并忽略具有除 node-role.kubernetes.io/worker
角色以外的任何其他角色的节点。查看以下示例功能,您可以在其中选择 "infra"
节点并忽略存储节点:
1.2.2.1.16. hasNodesWithExactRoles 复制链接链接已复制到粘贴板!
如果集群只包含您指定的角色的节点,则 hasNodesWithExactRoles
功能会返回 true
值,并忽略具有任何额外角色的节点,node-role.kubernetes.io/worker
角色除外。查看以下函数示例:
1.2.2.1.17. Sprig 开源 复制链接链接已复制到粘贴板!
Red Hat Advanced Cluster Management 支持 sprig
开源项目中包含的以下模板功能:
Sprig 库 | Functions |
---|---|
加密和安全 |
|
Date |
|
default |
|
字典和字典 |
|
整数数数 |
|
整数片段 |
直到 , |
列表 |
|
字符串函数 |
|
版本比较 |
|
1.2.2.2. 其他资源 复制链接链接已复制到粘贴板!
- 如需了解更多详细信息,请参阅 模板处理。
- 有关用例,请参阅配置策略中的高级模板处理。
- 有关标签选择器示例,请参阅 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. 对象模板处理 复制链接链接已复制到粘贴板!
使用 YAML 字符串表示设置对象模板。object-template-raw
参数是一个可选参数,它支持高级模板用例,如 if-else 和 range
功能。以下示例定义了将 species-category: mammal
标签添加到 default
命名空间中的任何 ConfigMap 中,其 name
键等于 Sea Otter
:
注: 虽然 spec.object-templates
和 spec.object-templates-raw
是可选的,但必须设置两个参数字段中的一个。
查看以下策略示例,它使用高级模板为您的受管集群创建和配置基础架构 MachineSet
对象。
1.2.3.3. 绕过模板处理 复制链接链接已复制到粘贴板!
您可能会创建一个策略,其中包含不是由 Red Hat Advanced Cluster Management 处理的模板。默认情况下,Red Hat Advanced Cluster Management 会处理所有模板。
要绕过 hub 集群的模板处理,必须将 {{ template content }}
改为 {{ `{{ template content }}`
}}
。
另外,您还可以在 Policy
的 ConfigurationPolicy
部分添加以下注解:policy.open-cluster-management.io/disable-templates: "true"
。当包含此注解时,则不需要以前的临时解决方案。为 ConfigurationPolicy
绕过模板处理。
1.2.3.4. 其他资源 复制链接链接已复制到粘贴板!
- 如需了解更多详细信息,请参阅模板功能。
- 返回到模板处理。
- 如需了解更多详细信息,请参阅 Kubernetes 配置策略控制器。
- 另外,请参阅 备份 etcd 数据。