6.4. 创建参考配置
配置引用配置以验证集群中的配置资源。
6.4.1. metadata.yaml 文件的结构 复制链接链接已复制到粘贴板!
metadata.yaml 文件提供了一个中央配置点,用于在参考配置中定义和配置模板。该文件具有 parts 和 components 的层次结构。parts 是 components 组,components 是模版组。在每个组件下,您可以配置模板依赖项、验证规则并添加描述性元数据。
metadata.yaml 文件示例
apiVersion: v2
parts:
- name: Part1
components:
- name: Component1
<component1_configuration>
- name: Part2
- name: Component2
<component2_configuration>
6.4.2. 配置模板关系 复制链接链接已复制到粘贴板!
通过在参考配置中定义模板之间的关系,您可以支持复杂依赖项的用例。例如,您可以将组件配置为需要特定的模板,需要组中的一个模板,或者允许来自组的任何模板等。
流程
创建
metadata.yaml文件以匹配您的用例。使用以下结构作为示例:metadata.yaml 文件示例
apiVersion: v2 parts: - name: Part1 components: - name: Component1 allOf:1 - path: RequiredTemplate1.yaml - path: RequiredTemplate2.yaml - name: Component2 allOrNoneOf:2 - path: OptionalBlockTemplate1.yaml - path: OptionalBlockTemplate2.yaml - name: Component3 anyOf:3 - path: OptionalTemplate1.yaml - path: OptionalTemplate2.yaml - name: Component4 noneOf:4 - path: BannedTemplate1.yaml - path: BannedTemplate2.yaml - name: Component5 oneOf:5 - path: RequiredExclusiveTemplate1.yaml - path: RequiredExclusiveTemplate2.yaml - name: Component6 anyOneOf:6 - path: OptionalExclusiveTemplate1.yaml - path: OptionalExclusiveTemplate2.yaml #...
6.4.3. 在模板中配置预期的变体 复制链接链接已复制到粘贴板!
您可以使用 Golang 模板语法处理模板中的变量内容。使用这个语法,您可以配置处理模板中可选、必要和条件内容的验证逻辑。
-
cluster-compare插件要求所有模板呈现为有效的 YAML。为了避免解析缺失字段的错误,请在实施模板语法时使用条件模板语法,如{{- if .spec.<optional_field> }}。此条件逻辑可确保模板正常处理缺少的字段,并保持有效的 YAML 格式。 - 您可以将 Golang 模板语法与自定义和内置功能用于复杂用例。所有 Golang 内置功能都支持,包括 Sprig 库中的函数。
流程
创建
metadata.yaml文件以匹配您的用例。使用以下结构作为示例:apiVersion: v2 kind: Service metadata: name: frontend1 namespace: {{ .metadata.namespace }}2 labels: app: guestbook tier: frontend spec: {{- if and .spec.type (eq (.spec.type) "NodePort" "LoadBalancer") }} type: {{.spec.type }}3 {{- else }} type: should be NodePort or LoadBalancer {{- end }} ports: - port: 80 selector: app: guestbook {{- if .spec.selector.tier }}4 tier: frontend {{- end }}
6.4.3.1. 参考模板功能 复制链接链接已复制到粘贴板!
cluster-compare 插件支持所有 sprig 库函数,但 env 和 expandenv 功能除外。有关 sprig 库函数的完整列表,请参阅"Sprig Function 文档"。
下表描述了 cluster-compare 插件的额外模板功能:
| 功能 | 描述 | Example |
|---|---|---|
|
| 将传入字符串解析为结构化 JSON 对象。 |
|
|
| 将传入字符串解析为结构化 JSON 数组。 |
|
|
| 将传入字符串解析为结构化的 YAML 对象。 |
|
|
| 将传入的字符串解析为结构化的 YAML 数组。 |
|
|
| 在保留对象类型时将传入的数据呈现为 JSON。 |
|
|
| 将传入字符串呈现为结构化的 TOML 数据。 |
|
|
| 将传入的数据呈现为 YAML,同时保留对象类型。 |
对于简单的 scalar 值:
对于 list 或dict: |
|
|
防止模板与集群资源匹配,即使它通常匹配。您可以在模板中使用此功能,以有条件地将某些资源从关联中排除。使用
当模板没有指定固定名称或命名空间时,此功能特别有用。在这些情况下,您可以使用 |
|
|
|
返回与指定参数匹配的对象数组。例如:
如果
如果 | - |
|
|
返回与参数匹配的单个对象。如果多个对象匹配,则函数返回任何内容。此功能使用与 | - |
以下示例演示了如何使用 lookupCR 功能从多个匹配资源检索和呈现值:
使用 lookupCRs 的配置映射示例
kind: ConfigMap
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-settings
namespace: kubernetes-dashboard
data:
dashboard: {{ index (lookupCR "apps/v1" "Deployment" "kubernetes-dashboard" "kubernetes-dashboard") "metadata" "name" \| toYaml }}
metrics: {{ (lookupCR "apps/v1" "Deployment" "kubernetes-dashboard" "dashboard-metrics-scraper").metadata.name \| toYaml }}
以下示例演示了如何使用 lookupCR 功能从单个匹配资源检索和使用特定值:
使用 lookupCR 的配置映射示例
kind: ConfigMap
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-settings
namespace: kubernetes-dashboard
data:
{{- $objlist := lookupCRs "apps/v1" "Deployment" "kubernetes-dashboard" "*" }}
{{- $dashboardName := "unknown" }}
{{- $metricsName := "unknown" }}
{{- range $obj := $objlist }}
{{- $appname := index $obj "metadata" "labels" "k8s-app" }}
{{- if contains "metrics" $appname }}
{{- $metricsName = $obj.metadata.name }}
{{- end }}
{{- if eq "kubernetes-dashboard" $appname }}
{{- $dashboardName = $obj.metadata.name }}
{{- end }}
{{- end }}
dashboard: {{ $dashboardName }}
metrics: {{ $metricsName }}
6.4.4. 配置 metadata.yaml 文件以排除模板字段 复制链接链接已复制到粘贴板!
您可以配置 metadata.yaml 文件,以从比较中排除字段。排除与比较不相关的字段,如与集群配置不相关的注解或标签。
您可以使用以下方法在 metadata.yaml 文件中配置排除项:
- 排除模板中未指定的自定义资源中的所有字段。
排除使用
pathToKey字段定义的特定字段。注意pathToKey是一个以句点分隔的路径。使用引号来转义带有句点的键值。
6.4.4.1. 排除模板中未指定的所有字段 复制链接链接已复制到粘贴板!
在比较过程中,cluster-compare 插件通过将字段与对应的自定义资源(CR)合并来呈现模板。如果将 ignore-unspecified-fields 配置为 true,则 CR 中存在的但没有在模版中的所有字段都不包括在合并中。当您只想比较模板中指定的字段时,请使用这个方法。
流程
创建
metadata.yaml文件以匹配您的用例。使用以下结构作为示例:apiVersion: v2 parts: - name: Part1 components: - name: Namespace allOf: - path: namespace.yaml config: ignore-unspecified-fields: true1 #...- 1
- 指定
true从比较所有字段中排除没有在对应的namespace.yaml模板中明确配置的 CR。
6.4.4.2. 通过设置默认排除字段来排除特定字段 复制链接链接已复制到粘贴板!
您可以通过在 defaultOmitRef 字段中为 fieldsToOmitRefs 定义一个默认值来排除字段。此默认排除适用于所有模板,除非被特定模板的 config.fieldsToOmitRefs 字段覆盖。
6.4.4.3. 排除特定字段 复制链接链接已复制到粘贴板!
您可以通过定义字段的路径来指定要排除的字段,然后在模板的 config 部分中引用定义。
流程
创建
metadata.yaml文件以匹配您的用例。使用以下结构作为示例:metadata.yaml 文件示例
apiVersion: v2 parts: - name: Part1 components: - name: Component1 - path: deployment.yaml config: fieldsToOmitRefs: - deployments1 #... fieldsToOmit: items: deployments: - pathToKey: spec.selector.matchLabels.k8s-app2 注意设置
fieldsToOmitRefs替换默认值。
6.4.4.4. 通过设置默认排除组来排除特定字段 复制链接链接已复制到粘贴板!
您可以创建要排除的默认字段组。组排除项可以引用另一个组,以避免在定义排除时重复。
流程
创建
metadata.yaml文件以匹配您的用例。使用以下结构作为示例:metadata.yaml 文件示例
apiVersion: v2 parts: #... fieldsToOmit: defaultOmitRef: default items: common: - pathToKey: metadata.annotations."kubernetes.io/metadata.name" - pathToKey: metadata.annotations."kubernetes.io/metadata.name" - pathToKey: metadata.annotations."kubectl.kubernetes.io/last-applied-configuration" - pathToKey: metadata.creationTimestamp - pathToKey: metadata.generation - pathToKey: spec.ownerReferences - pathToKey: metadata.ownerReferences default: - include: common1 - pathToKey: status- 1
common组包含在 default 组中。
6.4.5. 为模板字段配置内联验证 复制链接链接已复制到粘贴板!
您可以启用内联正则表达式来验证模板字段,特别是在 Golang 模板语法难以维护或过于复杂的情况下。使用内联正则表达式可简化模板,提高可读性,并可以使用更高级的验证逻辑。
cluster-compare 插件为内联验证提供两个功能:
-
regex:使用正则表达式验证字段中的内容。 -
capturegroups:通过将非捕获组文本处理为完全匹配来增强多行文本比较功能,仅在指定捕获组中应用正则表达式匹配,并确保重复捕获组的一致性。
当您使用 regex 或 capturegroups 功能进行内联验证时,cluster-compare 插件会强制执行相同的命名的捕获组在模板中的多个字段中具有相同的值。这意味着,如果命名的捕获组(如 (?<username>[a-z0-9]+)) 出现在多个字段中,则该组的值必须在整个模板中保持一致。
6.4.5.1. 使用 regex 功能配置内联验证 复制链接链接已复制到粘贴板!
使用 regex 内联功能,使用正则表达式验证字段。
流程
创建
metadata.yaml文件以匹配您的用例。使用以下结构作为示例:apiVersion: v2 parts: - name: Part1 components: - name: Example allOf: - path: example.yaml config: perField: - pathToKey: spec.bigTextBlock1 inlineDiffFunc: regex2 使用正则表达式验证关联模板中的字段:
apiVersion: v1 kind: ConfigMap metadata: namespace: dashboard data: username: "(?<username>[a-z0-9]+)" bigTextBlock: |- This is a big text block with some static content, like this line. It also has a place where (?<username>[a-z0-9]+) would put in their own name. (?<username>[a-z0-9]+) would put in their own name.
6.4.5.2. 使用 capturegroups 功能配置内联验证 复制链接链接已复制到粘贴板!
使用 capturegroups 内联功能来更加精确地验证带有多行字符串的字段。此功能还确保同名的捕获组在多个字段之间具有相同的值。
流程
创建
metadata.yaml文件以匹配您的用例。使用以下结构作为示例:apiVersion: v2 parts: - name: Part1 components: - name: Example allOf: - path: example.yaml config: perField: - pathToKey: data.username1 inlineDiffFunc: regex2 - pathToKey: spec.bigTextBlock3 inlineDiffFunc: capturegroups4 使用正则表达式验证关联模板中的字段:
apiVersion: v1 kind: ConfigMap metadata: namespace: dashboard data: username: "(?<username>[a-z0-9]+)"1 bigTextBlock: |- This static content outside of a capture group should match exactly. Here is a username capture group: (?<username>[a-z0-9]+). It should match this capture group: (?<username>[a-z0-9]+).- 1
- 如果
data.username字段中的用户名值和bigTextBlock中捕获的值不匹配,cluster-compare插件会警告您不一致的匹配。
带有与不一致的匹配警告的输出示例:
WARNING: Capturegroup (?<username>…) matched multiple values: « mismatchuser | exampleuser »
6.4.6. 配置输出的描述 复制链接链接已复制到粘贴板!
每个部分、组件或模板都可以包含描述来提供额外的上下文、说明或文档链接。这些描述有助于说明需要特定模板或结构的原因。
流程
创建
metadata.yaml文件以匹配您的用例。使用以下结构作为示例:apiVersion: v2 parts: - name: Part1 description: |- General text for every template under this part, unless overridden. components: - name: Component1 # With no description set, this inherits the description from the part above. OneOf: - path: Template1.yaml # This inherits the component description, if set. - path: Template2.yaml - path: Template3.yaml description: |- This template has special instructions that don't apply to the others. - name: Component2 description: |- This overrides the part text with something more specific. Multi-line text is supported, at all levels. allOf: - path: RequiredTemplate1.yaml - path: RequiredTemplate2.yaml description: |- Required for important reasons. - path: RequiredTemplate3.yaml