10.11. 在 PolicyGenTemplate CR 中使用 hub 模板
Topology Aware Lifecycle Manager 支持在 GitOps Zero Touch Provisioning (ZTP) 的配置策略中支持部分 Red Hat Advanced Cluster Management (RHACM) hub 集群模板功能。
hub-side 集群模板允许您定义可动态自定义到目标集群的配置策略。这可减少为具有辅助配置但具有不同值的很多集群创建单独的策略的需求。
策略模板仅限于与定义策略的命名空间相同的命名空间。这意味着,您必须在创建策略的同一命名空间中创建 hub 模板中引用的对象。
以下支持的 hub 模板功能可用于 TALM 的 GitOps ZTP:
fromConfigmap返回命名的ConfigMap资源中提供的 data 键的值。注意ConfigMapCR 有一个 1 MiB 大小限制。ConfigMapCR 的有效大小被last-applied-configuration注解进一步限制。要避免last-applied-configuration限制,请在模板ConfigMap中添加以下注解:argocd.argoproj.io/sync-options: Replace=true-
base64enc返回输入字符串的 base64 编码值 -
base64dec返回 base64 编码的输入字符串的解码值 -
indent返回输入字符串,并带有添加的缩进空格 -
autoindent返回输入字符串,并根据父模板中使用的空间添加空格 -
toIntcasts 并返回输入值的整数值 -
toBool将输入字符串转换为布尔值,并返回布尔值
各种 开源社区功能 也可用于 GitOps ZTP。
10.11.1. hub 模板示例 复制链接链接已复制到粘贴板!
以下代码示例是有效的 hub 模板。每个模板都会从 default 命名空间的 ConfigMap CR 返回的其名称为 test-config 的值。
使用键
common-key返回值:{{hub fromConfigMap "default" "test-config" "common-key" hub}}使用
.ManagedClusterName字段的串联值和字符串-name返回一个字符串:{{hub fromConfigMap "default" "test-config" (printf "%s-name" .ManagedClusterName) hub}}casts 并从
.ManagedClusterName字段的串联值和字符串-name返回布尔值:{{hub fromConfigMap "default" "test-config" (printf "%s-name" .ManagedClusterName) | toBool hub}}casts 并从
.ManagedClusterName字段的串联值和字符串-name返回整数值:{{hub (printf "%s-name" .ManagedClusterName) | fromConfigMap "default" "test-config" | toInt hub}}
10.11.2. 使用 hub 模板在组 PolicyGenTemplate CR 中指定组和站点配置 复制链接链接已复制到粘贴板!
您可以使用 hub 模板填充应用到受管集群的生成的策略中的组和站点值来管理带有 ConfigMap CR 的集群配置。在站点 PolicyGenTemplate (PGT) CR 中使用 hub 模板意味着您不需要为每个站点创建一个 PolicyGenTemplate CR。
您可以根据用例(如硬件类型或区域)将集群分组到不同的类别中。每个集群都应该有一个与集群所在的组或组对应的标签。如果您管理位于不同 ConfigMap CR 中的每个组的配置值,则只需要一个组 PolicyGenTemplate CR 来使用 hub 模板将更改应用到组中的所有集群。
以下示例演示了如何使用三个 ConfigMap CR 和一个组 PolicyGenTemplate CR 将站点和组配置应用到按硬件类型和区域分组的集群。
当您使用 fromConfigmap 功能时,printf 变量仅适用于模板资源 data 键字段。您不能将其与 name 和 namespace 字段一起使用。
先决条件
-
已安装 OpenShift CLI(
oc)。 -
已以具有
cluster-admin权限的用户身份登录到 hub 集群。 - 您已创建了管理自定义站点配置数据的 Git 存储库。存储库必须可从 hub 集群访问,并定义为 GitOps ZTP ArgoCD 应用程序的源存储库。
流程
创建包含组和站点配置的三个
ConfigMapCR:创建名为
group-hardware-types-configmap的ConfigMapCR,以存放特定于硬件的配置。例如:apiVersion: v1 kind: ConfigMap metadata: name: group-hardware-types-configmap namespace: ztp-group annotations: argocd.argoproj.io/sync-options: Replace=true1 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大于 1 MiB 时,才需要argocd.argoproj.io/sync-options注解。
创建名为
group-zones-configmap的ConfigMapCR,以存放区域配置。例如: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的ConfigMapCR,以存放特定于站点的配置。例如: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"
注意每个
ConfigMapCR 必须与从组PolicyGenTemplateCR 生成的策略位于同一个命名空间中。-
提交 Git 中的
ConfigMapCR,然后推送到由 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对象获取所需数据的组PolicyGenTemplateCR。此PolicyGenTemplateCR 示例为与spec.bindingRules下列出的标签匹配的集群配置日志、VLAN ID、NIC 和 Performance Profile: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 中提交站点
PolicyGenTemplateCR,并推送到由 ArgoCD 应用程序监控的 Git 存储库。注意对引用的
ConfigMapCR 的后续更改不会自动同步到应用的策略。您需要手动同步新的ConfigMap更改来更新现有的PolicyGenTemplateCR。请参阅 "Syncing new ConfigMap changes to existing PolicyGenTemplate CR"。您可以将相同的
PolicyGenTemplateCR 用于多个集群。如果有配置更改,则唯一需要进行修改的ConfigMap对象是保存每个集群配置和受管集群标签的 ConfigMap 对象。
10.11.3. 将新 ConfigMap 更改同步到现有的 PolicyGenTemplate CR 复制链接链接已复制到粘贴板!
先决条件
-
已安装 OpenShift CLI(
oc)。 -
已以具有
cluster-admin权限的用户身份登录到 hub 集群。 -
您已创建了
PolicyGenTemplateCR,它使用 hub 集群模板从ConfigMapCR 中拉取信息。
流程
-
更新
ConfigMapCR 的内容,并应用 hub 集群中的更改。 要将更新的
ConfigMapCR 的内容同步到部署的策略中,请执行以下操作之一:选项 1:删除现有策略。ArgoCD 使用
PolicyGenTemplateCR 立即重新创建已删除的策略。例如,运行以下命令:$ oc delete policy <policy_name> -n <policy_namespace>选项 2:在每次更新 ConfigMap 时,每次更新
ConfigMap时,将特殊注解policy.open-cluster-management.io/trigger-update应用到策略。例如:$ oc annotate policy <policy_name> -n <policy_namespace> policy.open-cluster-management.io/trigger-update="1"注意您必须应用更新的策略才能使更改生效。如需更多信息,请参阅重新处理的特殊注解。
可选:如果存在,删除包含策略的
ClusterGroupUpdateCR。例如:$ oc delete clustergroupupgrade <cgu_name> -n <cgu_namespace>创建新的
ClusterGroupUpdateCR,其中包含要应用更新的ConfigMap更改的策略。例如,将以下 YAML 添加到文件cgr-example.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