6.5. 执行高级参考配置自定义


对于您要从参考设计中临时开发的情况,您可以应用更高级的自定义。

警告

这些自定义覆盖 cluster-compare 插件在比较过程中使用的默认匹配过程。在应用这些高级自定义时请小心,因为它可能会导致意外的结果,如从集群比较中排除后续信息。

用于动态自定义参考配置的一些高级任务包括:

  • 手动匹配 :配置用户配置文件,以手动将自定义资源从集群与参考配置中的模板匹配。
  • Patching the reference:在 cluster-compare 命令中使用 patch 选项对一个参考进行补丁来配置参考配置。

6.5.1. 配置 CR 和模板之间的手动匹配

在某些情况下,cluster-compare 插件的默认匹配可能无法按预期工作。您可以使用用户配置文件手动定义自定义资源(CR)如何映射到模板。

默认情况下,插件会根据 apiversionkindnamenamespace 字段将 CR 映射到模板。但是,多个模板可能与一个 CR 匹配。例如,在以下情况下可能会发生这种情况:

  • 有多个模板有相同的 apiversionkindnamenamespace 字段。
  • 模板将任何带有特定 apiversionkind 的 CR 匹配,无论其 namespacename

当一个 CR 匹配多个模板时,插件会使用一个 tie-breaking 机制来选择一个差异最小的模板。要明确控制插件选择的模板,您可以创建一个定义手动匹配规则的用户配置 YAML 文件。您可以将此配置文件传递给 cluster-compare 命令,以强制执行所需的模板选择。

流程

  1. 创建用户配置文件以定义手动匹配标准:

    user-config.yaml 文件示例

    correlationSettings: 
    1
    
       manualCorrelation: 
    2
    
          correlationPairs: 
    3
    
            ptp.openshift.io/v1_PtpConfig_openshift-ptp_grandmaster: optional/ptp-config/PtpOperatorConfig.yaml 
    4
    
            ptp.openshift.io/v1_PtpOperatorConfig_openshift-ptp_default: optional/ptp-config/PtpOperatorConfig.yaml
    Copy to Clipboard Toggle word wrap

    1
    correlationSettings 部分包含手动关联设置。
    2
    manualCorrelation 部分指定启用手动关联。
    3
    correlationPairs 部分列出了要手动匹配的 CR 和模板对。
    4
    指定要匹配的 CR 和模板对。CR 规格使用以下格式:<apiversion>_<kind>_<namespace>_<name>。对于没有命名空间的集群范围的 CR,请使用以下格式:<apiversion>_<kind>_<name>。模板的路径必须相对于 metadata.yaml 文件。
  2. 运行以下命令,在 cluster-compare 命令中引用用户配置文件:

    $ oc cluster-compare -r <path_to_reference_config>/metadata.yaml -c <path_to_user_config>/user-config.yaml 
    1
    Copy to Clipboard Toggle word wrap
    1
    使用 -c 选项指定 user-config.yaml 文件。

6.5.2. 修补参考配置

在某些情况下,您可能需要修补参考配置来处理集群配置中的预期偏差。该插件在比较过程中应用补丁,修改补丁文件中定义的指定资源字段。

例如,您可能需要临时修补模板,因为集群使用了最新的参考配置已弃用的字段。在比较输出概述中报告补丁文件。

您可以通过两种方式创建补丁文件:

  • 使用 cluster-compare 插件生成补丁 YAML 文件。
  • 创建您自己的补丁文件。

6.5.2.1. 使用 cluster-compare 插件生成补丁

您可以使用 cluster-compare 插件为特定模板文件生成补丁。该插件调整模板,以确保它与集群自定义资源(CR)匹配。补丁模板中的任何有效差异都不会报告。该插件在输出中突出显示补丁文件。

流程

  1. 运行以下命令,为模板生成补丁:

    $ oc cluster-compare -r <path_to_reference_config>/metadata.yaml -o 'generate-patches' --override-reason "A valid reason for the override" --generate-override-for "<template1_path>" --generate-override-for "<template2_path>" > <path_to_patches_file>
    Copy to Clipboard Toggle word wrap
    • -r 指定仓库配置的 metadata.yaml 文件的路径。
    • -o 指定输出格式。要生成补丁输出,您必须使用 generate-patches 值。
    • --override-reason 描述了补丁的原因。
    • --generate-override-for 指定需要补丁的模板的路径。

      注意

      您必须使用相对于 metadata.yaml 文件的目标模板的文件路径。例如,如果 metadata.yaml 文件的文件路径是 ./compare/metadata.yaml,则模板的相对文件路径可能是 optional/my-template.yaml

    • <path_to_patches_file> 指定补丁的文件名和路径。
  2. 可选:在应用到引用配置前查看补丁文件:

    patch-config 文件示例

    - apiVersion: storage.k8s.io/v1
      kind: StorageClass
      name: crc-csi-hostpath-provisioner
      patch: '{"provisioner":"kubevirt.io.hostpath-provisioner"}' 
    1
    
      reason: A valid reason for the override
      templatePath: optional/local-storage-operator/StorageClass.yaml 
    2
    
      type: mergepatch 
    3
    Copy to Clipboard Toggle word wrap

    1
    该插件对模板中的字段进行补丁,以匹配 CR。
    2
    模板的路径。
    3
    mergepath 选项将 JSON 合并到目标模板中。未指定的字段保持不变。
  3. 运行以下命令,将补丁应用到引用配置:

    $ oc cluster-compare -r <referenceConfigurationDirectory> -p <path_to_patches_file>
    Copy to Clipboard Toggle word wrap
    • -r 指定仓库配置的 metadata.yaml 文件的路径。
    • -p 指定补丁文件的路径。

      输出示例

      ...
      
      Cluster CR: storage.k8s.io/v1_StorageClass_crc-csi-hostpath-provisioner
      Reference File: optional/local-storage-operator/StorageClass.yaml
      Description: Component description
      Diff Output: None
      Patched with patch
      Patch Reasons:
      - A valid reason for the override
      
      ...
      
      No CRs are unmatched to reference CRs
      Metadata Hash: bb2165004c496b32e0c8509428fb99c653c3cf4fba41196ea6821bd05c3083ab
      Cluster CRs with patches applied: 1
      Copy to Clipboard Toggle word wrap

6.5.2.2. 手动创建补丁文件

您可以编写补丁文件来处理集群配置中的预期偏差。

注意

对于 type 字段,补丁有三个可能的值:

  • mergepatch - 将 JSON 合并到目标模板中。未指定的字段保持不变。
  • rfc6902 - 使用 add, remove, replace, move, 和 copy 操作在目标模板中合并 JSON。每个操作都以特定路径为目标。
  • go-template - 定义 Golang 模板。该插件使用集群自定义资源(CR)作为输入呈现模板,并为目标模板生成 mergepatchrfc6902 补丁。

以下示例显示了使用所有三个不同格式相同的补丁。

流程

  1. 创建一个补丁文件来与您的用例匹配。使用以下结构作为示例:

    patch-config示例

    - apiVersion: v1 
    1
    
      kind: Namespace
      name: openshift-storage
      reason: known deviation
      templatePath: namespace.yaml
      type: mergepatch
      patch: '{"metadata":{"annotations":{"openshift.io/sa.scc.mcs":"s0:c29,c14","openshift.io/sa.scc.supplemental-groups":"1000840000/10000","openshift.io/sa.scc.uid-range":"1000840000/10000","reclaimspace.csiaddons.openshift.io/schedule":"@weekly","workload.openshift.io/allowed":null},"labels":{"kubernetes.io/metadata.name":"openshift-storage","olm.operatorgroup.uid/ffcf3f2d-3e37-4772-97bc-983cdfce128b":"","openshift.io/cluster-monitoring":"false","pod-security.kubernetes.io/audit":"privileged","pod-security.kubernetes.io/audit-version":"v1.24","pod-security.kubernetes.io/warn":"privileged","pod-security.kubernetes.io/warn-version":"v1.24","security.openshift.io/scc.podSecurityLabelSync":"true"}},"spec":{"finalizers":["kubernetes"]}}'
    - name: openshift-storage
      apiVersion: v1
      kind: Namespace
      templatePath: namespace.yaml
      type: rfc6902
      reason: known deviation
      patch: '[
        {"op": "add", "path": "/metadata/annotations/openshift.io~1sa.scc.mcs", "value": "s0:c29,c14"},
        {"op": "add", "path": "/metadata/annotations/openshift.io~1sa.scc.supplemental-groups", "value": "1000840000/10000"},
        {"op": "add", "path": "/metadata/annotations/openshift.io~1sa.scc.uid-range", "value": "1000840000/10000"},
        {"op": "add", "path": "/metadata/annotations/reclaimspace.csiaddons.openshift.io~1schedule", "value": "@weekly"},
        {"op": "remove", "path": "/metadata/annotations/workload.openshift.io~1allowed"},
        {"op": "add", "path": "/metadata/labels/kubernetes.io~1metadata.name", "value": "openshift-storage"},
        {"op": "add", "path": "/metadata/labels/olm.operatorgroup.uid~1ffcf3f2d-3e37-4772-97bc-983cdfce128b", "value": ""},
        {"op": "add", "path": "/metadata/labels/openshift.io~1cluster-monitoring", "value": "false"},
        {"op": "add", "path": "/metadata/labels/pod-security.kubernetes.io~1audit", "value": "privileged"},
        {"op": "add", "path": "/metadata/labels/pod-security.kubernetes.io~1audit-version", "value": "v1.24"},
        {"op": "add", "path": "/metadata/labels/pod-security.kubernetes.io~1warn", "value": "privileged"},
        {"op": "add", "path": "/metadata/labels/pod-security.kubernetes.io~1warn-version", "value": "v1.24"},
        {"op": "add", "path": "/metadata/labels/security.openshift.io~1scc.podSecurityLabelSync", "value": "true"},
        {"op": "add", "path": "/spec", "value": {"finalizers": ["kubernetes"]}}
        ]'
    - apiVersion: v1
      kind: Namespace
      name: openshift-storage
      reason: "known deviation"
      templatePath: namespace.yaml
      type: go-template
      patch: |
        {
            "type": "rfc6902",
            "patch": '[
                {"op": "add", "path": "/metadata/annotations/openshift.io~1sa.scc.mcs", "value": "s0:c29,c14"},
                {"op": "add", "path": "/metadata/annotations/openshift.io~1sa.scc.supplemental-groups", "value": "1000840000/10000"},
                {"op": "add", "path": "/metadata/annotations/openshift.io~1sa.scc.uid-range", "value": "1000840000/10000"},
                {"op": "add", "path": "/metadata/annotations/reclaimspace.csiaddons.openshift.io~1schedule", "value": "@weekly"},
                {"op": "remove", "path": "/metadata/annotations/workload.openshift.io~1allowed"},
                {"op": "add", "path": "/metadata/labels/kubernetes.io~1metadata.name", "value": "openshift-storage"},
                {"op": "add", "path": "/metadata/labels/olm.operatorgroup.uid~1ffcf3f2d-3e37-4772-97bc-983cdfce128b", "value": ""},
                {"op": "add", "path": "/metadata/labels/openshift.io~1cluster-monitoring", "value": "false"},
                {"op": "add", "path": "/metadata/labels/pod-security.kubernetes.io~1audit", "value": "privileged"},
                {"op": "add", "path": "/metadata/labels/pod-security.kubernetes.io~1audit-version", "value": "v1.24"},
                {"op": "add", "path": "/metadata/labels/pod-security.kubernetes.io~1warn", "value": "privileged"},
                {"op": "add", "path": "/metadata/labels/pod-security.kubernetes.io~1warn-version", "value": "v1.24"},
                {"op": "add", "path": "/metadata/labels/security.openshift.io~1scc.podSecurityLabelSync", "value": "true"},
                {"op": "add", "path": "/spec", "value": {"finalizers": {{ .spec.finalizers | toJson }} }}
            ]'
        }
    Copy to Clipboard Toggle word wrap

    1
    补丁使用 kind, apiVersion, name, and namespace 字段来将补丁与正确的集群 CR 匹配。
  2. 运行以下命令,将补丁应用到参考配置:

    $ oc cluster-compare -r <referenceConfigurationDirectory> -p <path_to_patches_file>
    Copy to Clipboard Toggle word wrap
    • -r 指定仓库配置的 metadata.yaml 文件的路径。
    • p 指定补丁文件的路径。

      输出示例

      ...
      
      Cluster CR: storage.k8s.io/v1_StorageClass_crc-csi-hostpath-provisioner
      Reference File: namespace.yaml
      Description: Component description
      Diff Output: None
      Patched with patch
      Patch Reasons:
      - known deviation
      - known deviation
      - known deviation
      
      ...
      
      No CRs are unmatched to reference CRs
      Metadata Hash: bb2165004c496b32e0c8509428fb99c653c3cf4fba41196ea6821bd05c3083ab
      Cluster CRs with patches applied: 1
      Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat