6.5. 执行高级参考配置自定义
对于您要从参考设计中临时开发的情况,您可以应用更高级的自定义。
这些自定义覆盖 cluster-compare 插件在比较过程中使用的默认匹配过程。在应用这些高级自定义时请小心,因为它可能会导致意外的结果,如从集群比较中排除后续信息。
用于动态自定义参考配置的一些高级任务包括:
- 手动匹配 :配置用户配置文件,以手动将自定义资源从集群与参考配置中的模板匹配。
-
Patching the reference:在
cluster-compare命令中使用 patch 选项对一个参考进行补丁来配置参考配置。
6.5.1. 配置 CR 和模板之间的手动匹配 复制链接链接已复制到粘贴板!
在某些情况下,cluster-compare 插件的默认匹配可能无法按预期工作。您可以使用用户配置文件手动定义自定义资源(CR)如何映射到模板。
默认情况下,插件会根据 apiversion、kind、name 和 namespace 字段将 CR 映射到模板。但是,多个模板可能与一个 CR 匹配。例如,在以下情况下可能会发生这种情况:
-
有多个模板有相同的
apiversion、kind、name和namespace字段。 -
模板将任何带有特定
apiversion和kind的 CR 匹配,无论其namespace或name。
当一个 CR 匹配多个模板时,插件会使用一个 tie-breaking 机制来选择一个差异最小的模板。要明确控制插件选择的模板,您可以创建一个定义手动匹配规则的用户配置 YAML 文件。您可以将此配置文件传递给 cluster-compare 命令,以强制执行所需的模板选择。
流程
创建用户配置文件以定义手动匹配标准:
user-config.yaml文件示例correlationSettings:1 manualCorrelation:2 correlationPairs:3 ptp.openshift.io/v1_PtpConfig_openshift-ptp_grandmaster: optional/ptp-config/PtpOperatorConfig.yaml4 ptp.openshift.io/v1_PtpOperatorConfig_openshift-ptp_default: optional/ptp-config/PtpOperatorConfig.yaml运行以下命令,在
cluster-compare命令中引用用户配置文件:$ oc cluster-compare -r <path_to_reference_config>/metadata.yaml -c <path_to_user_config>/user-config.yaml1 - 1
- 使用
-c选项指定user-config.yaml文件。
6.5.2. 修补参考配置 复制链接链接已复制到粘贴板!
在某些情况下,您可能需要修补参考配置来处理集群配置中的预期偏差。该插件在比较过程中应用补丁,修改补丁文件中定义的指定资源字段。
例如,您可能需要临时修补模板,因为集群使用了最新的参考配置已弃用的字段。在比较输出概述中报告补丁文件。
您可以通过两种方式创建补丁文件:
-
使用
cluster-compare插件生成补丁 YAML 文件。 - 创建您自己的补丁文件。
6.5.2.1. 使用 cluster-compare 插件生成补丁 复制链接链接已复制到粘贴板!
您可以使用 cluster-compare 插件为特定模板文件生成补丁。该插件调整模板,以确保它与集群自定义资源(CR)匹配。补丁模板中的任何有效差异都不会报告。该插件在输出中突出显示补丁文件。
流程
运行以下命令,为模板生成补丁:
$ 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>-
-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>指定补丁的文件名和路径。
-
可选:在应用到引用配置前查看补丁文件:
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.yaml2 type: mergepatch3 运行以下命令,将补丁应用到引用配置:
$ oc cluster-compare -r <referenceConfigurationDirectory> -p <path_to_patches_file>-
-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
-
6.5.2.2. 手动创建补丁文件 复制链接链接已复制到粘贴板!
您可以编写补丁文件来处理集群配置中的预期偏差。
对于 type 字段,补丁有三个可能的值:
-
mergepatch- 将 JSON 合并到目标模板中。未指定的字段保持不变。 -
rfc6902- 使用add,remove,replace,move, 和copy操作在目标模板中合并 JSON。每个操作都以特定路径为目标。 -
go-template- 定义 Golang 模板。该插件使用集群自定义资源(CR)作为输入呈现模板,并为目标模板生成mergepatch或rfc6902补丁。
以下示例显示了使用所有三个不同格式相同的补丁。
流程
创建一个补丁文件来与您的用例匹配。使用以下结构作为示例:
patch-config示例- apiVersion: v11 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 }} }} ]' }- 1
- 补丁使用
kind,apiVersion,name, andnamespace字段来将补丁与正确的集群 CR 匹配。
运行以下命令,将补丁应用到参考配置:
$ oc cluster-compare -r <referenceConfigurationDirectory> -p <path_to_patches_file>-
-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
-