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 键的值。

    注意

    ConfigMap CR 有一个 1 MiB 大小限制ConfigMap CR 的有效大小被 last-applied-configuration 注解进一步限制。要避免 last-applied-configuration 限制,请在模板 ConfigMap 中添加以下注解:

    argocd.argoproj.io/sync-options: Replace=true
  • base64enc 返回输入字符串的 base64 编码值
  • base64dec 返回 base64 编码的输入字符串的解码值
  • indent 返回输入字符串,并带有添加的缩进空格
  • autoindent 返回输入字符串,并根据父模板中使用的空间添加空格
  • toInt casts 并返回输入值的整数值
  • 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 键字段。您不能将其与 namenamespace 字段一起使用。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 已以具有 cluster-admin 权限的用户身份登录到 hub 集群。
  • 您已创建了管理自定义站点配置数据的 Git 存储库。存储库必须可从 hub 集群访问,并定义为 GitOps ZTP ArgoCD 应用程序的源存储库。

流程

  1. 创建包含组和站点配置的三个 ConfigMap CR:

    1. 创建名为 group-hardware-types-configmapConfigMap CR,以存放特定于硬件的配置。例如:

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: group-hardware-types-configmap
        namespace: ztp-group
        annotations:
          argocd.argoproj.io/sync-options: Replace=true 1
      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 注解。
    2. 创建名为 group-zones-configmapConfigMap CR,以存放区域配置。例如:

      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\"]}]"
    3. 创建名为 site-data-configmapConfigMap CR,以存放特定于站点的配置。例如:

      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"
    注意

    每个 ConfigMap CR 必须与从组 PolicyGenTemplate CR 生成的策略位于同一个命名空间中。

  2. 提交 Git 中的 ConfigMap CR,然后推送到由 Argo CD 应用程序监控的 Git 存储库。
  3. 将硬件类型和区域标签应用到集群。以下命令适用于名为 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"}}}'
  4. 创建使用 hub 模板从 ConfigMap 对象获取所需数据的组 PolicyGenTemplate CR。此 PolicyGenTemplate CR 示例为与 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 字段。这是一个模板上下文值设置为受管集群标签的值。

  5. 在 Git 中提交站点 PolicyGenTemplate CR,并推送到由 ArgoCD 应用程序监控的 Git 存储库。

    注意

    对引用的 ConfigMap CR 的后续更改不会自动同步到应用的策略。您需要手动同步新的 ConfigMap 更改来更新现有的 PolicyGenTemplate CR。请参阅 "Syncing new ConfigMap changes to existing PolicyGenTemplate CR"。

    您可以将相同的 PolicyGenTemplate CR 用于多个集群。如果有配置更改,则唯一需要进行修改的 ConfigMap 对象是保存每个集群配置和受管集群标签的 ConfigMap 对象。

10.11.3. 将新 ConfigMap 更改同步到现有的 PolicyGenTemplate CR

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 已以具有 cluster-admin 权限的用户身份登录到 hub 集群。
  • 您已创建了 PolicyGenTemplate CR,它使用 hub 集群模板从 ConfigMap CR 中拉取信息。

流程

  1. 更新 ConfigMap CR 的内容,并应用 hub 集群中的更改。
  2. 要将更新的 ConfigMap CR 的内容同步到部署的策略中,请执行以下操作之一:

    1. 选项 1:删除现有策略。ArgoCD 使用 PolicyGenTemplate CR 立即重新创建已删除的策略。例如,运行以下命令:

      $ oc delete policy <policy_name> -n <policy_namespace>
    2. 选项 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"
      注意

      您必须应用更新的策略才能使更改生效。如需更多信息,请参阅重新处理的特殊注解

  3. 可选:如果存在,删除包含策略的 ClusterGroupUpdate CR。例如:

    $ oc delete clustergroupupgrade <cgu_name> -n <cgu_namespace>
    1. 创建新的 ClusterGroupUpdate CR,其中包含要应用更新的 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
    2. 应用更新的策略:

      $ oc apply -f cgr-example.yaml
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.