You need to enable JavaScript to run this app.
导航

封装的覆写语法

最近更新时间2023.12.13 19:07:12

首次发布时间2023.12.13 19:07:12

封装的覆写语法是针对指定资源(包括:Image、Command、Args、Labels、Annotations 等)封装的覆写语法,资源覆盖面局限但覆写颗粒度更细。本文为您介绍封装覆写语法的整体语义和典型使用示例。

背景信息

原有的 JsonPatch 覆写语法只能整体的替换字段,覆写粒度较粗,无法满足精细化覆写场景,例如:JsonPatch 覆写语法替换镜像的仓库地址时只能整体替换,不能精细化替换镜像仓库地址中的 Registry、Repository、Tag、Digest 字段。

因此,为了弥补 JsonPatch 覆写语法的局限性,针对 Image、Command、Args、Labels、Annotations 资源提供封装的覆写语法,满足指定字段统一覆盖的场景。

覆写规则

operator 操作针对有存量字段、无存量字段、空值时的覆写规则如下:

注意

  • ✔️表示允许操作、❌表示报错、- 表示不涉及,其余文字说明表示较复杂的行为。
  • 部分删除:针对 Command、Args、Labels、Annotations 资源,delete有存量字段时,只删除用户指定的值。
  • 部分替换:针对 Labels、Annotations 资源,overwrite有存量字段时,只替换存量中已有的 key,若存量中没有 key,即使用户已经指定也会被忽略。

operator

ImageOverrider
(操作对象:镜像组件字符串)

Command/Args
(操作对象:命令或参数列表)

Labels/Annotations
(操作对象:标签或注解 map)

有存量字段

无存量字段

新值允许为空
(空字符串)

有存量字段

无存量字段

新值允许为空
(空列表)

有存量字段
(存在相同 key)

无存量字段
(无相同 key)

新值允许为空
(空 map)

addIfAbsent✔️---✔️
append---直接追加✔️---
overwrite整体替换✔️✔️整体替换✔️✔️部分替换✔️✔️
delete整体删除✔️✔️部分删除✔️✔️部分删除✔️✔️

典型示例

示例一:针对内置资源,覆写镜像地址中的字段

此差异化策略表示覆写 Kubernetes 原生资源镜像仓库的各个字段。镜像仓库地址组成为:[Registry '/'] Repository [ ":" Tag ][ "@" Digest ],针对镜像地址资源,涉及到的覆写语法参数如下:

  • containerNames:可选项,表示要操作 Pod 中的 Container 名称。不指定时表示适用于所有 Container;指定时表示仅适用于目标 Container。

  • imageComponent:必填项,表示要操作的镜像仓库地址的哪个组成部分,可选值如下。

    • Registry:镜像所在仓库地址。
    • Repository:镜像名称。
    • Tag:镜像版本号。
    • Digest:镜像标识符。
  • operator:必填项,表示要对以上目标的操作方式,详细介绍参见:覆写规则

  • value:必填项,表示以上操作中需要追加或替换的值。

apiVersion: core.kubeadmiral.io/v1alpha1
kind: ClusterOverridePolicy
metadata:
  name: mypolicy
spec:
  overrideRules:
    # 规则组一
    - targetClusters:
        clusters:
          - kubeadmiral-member-1
          - kubeadmiral-member-2
        clusterSelector:
      # 规则
      overriders:
    # 规则组二
    - targetClusters:
        clusters:
          - kubeadmiral-member-1
          - kubeadmiral-member-2
      # 规则
      overriders:
        image:
          - containerNames: 
              - "server-1"
              - "server-2"
            operations: 
              - imageComponent: Registry
                operator: addIfAbsent
                value: cluster.io

示例二:针对 CRD 资源,覆写镜像地址中的字段

此差异化策略表示覆写 CRD 资源镜像仓库的各个字段。针对镜像地址资源,涉及到的覆写语法参数如下:

  • imagePath:表示要进行覆写操作的资源路径,例如:/spec/template/spec/containers/0/image

  • imageComponent:同 Kubernetes 原生资源中的使用逻辑。

  • operator:同 Kubernetes 原生资源中的使用逻辑。

  • value:同 Kubernetes 原生资源中的使用逻辑。

apiVersion: core.kubeadmiral.io/v1alpha1
kind: ClusterOverridePolicy
metadata:
  name: mypolicy
spec:
  overrideRules:
    # 规则组一
    - targetClusters:
        clusters:
          - kubeadmiral-member-1
          - kubeadmiral-member-2
        clusterSelector:
      # 规则
      overriders:
    # 规则组二
    - targetClusters:
        clusters:
          - kubeadmiral-member-1
          - kubeadmiral-member-2
      # 规则
      overriders:
        image:
          - imagePath: "/spec/templates/0/container/image"
            operations: 
            - imageComponent: Registry
              operator: addIfAbsent
              value: cluster.io
            - imageComponent: Repository
              operator: overwrite
              value: "over/echo-server"
            - imageComponent: Tag
              operator: delete
            - imageComponent: Digest
              operator: addIfAbsent
              value: "sha256:aaaaf56b44807c64d294e6c8059b479f35350b454492398225034174808d1726"

示例三:覆写命令列表

此差异化策略分别表示追加、替换、删除命令资源。针对命令资源,涉及到的覆写语法参数如下:

  • containerNames:可选项,表示要操作 Pod 中的 Container 名称。不指定时表示适用于所有 Container;指定时表示仅适用于目标 Container。

  • operator:必填项,表示要对以上目标的操作方式,详细介绍参见:覆写规则

  • value:必填项,表示以上操作中需要追加或替换的值。

apiVersion: core.kubeadmiral.io/v1alpha1
kind: ClusterOverridePolicy
metadata:
  name: mypolicy
spec:
  overrideRules:
    - targetClusters:
        clusters:
          - kubeadmiral-member-1
      overriders:
        command:
          - containerName: "server-1"
            operator: append
            value: 
              - "/bin/sh"
              - "-c"
              - "sleep 10s"
          - containerName: "server-2"
            operator: overwrite
            value: 
              - "/bin/sh"
              - "-c"
              - "sleep 10s"
          - containerName: "server-3"
            operator: delete
            value:  
              - "sleep 10s"

示例四:覆写参数列表

此差异化策略表示追加参数列表资源。针对参数列表资源,涉及到的覆写语法参数如下:

  • containerNames:可选项,表示要操作 Pod 中的 Container 名称。不指定时表示适用于所有 Container;指定时表示仅适用于目标 Container。

  • operator:必填项,表示要对以上目标的操作方式,详细介绍参见:覆写规则

  • value:必填项,表示以上操作中需要追加或替换的值。

apiVersion: core.kubeadmiral.io/v1alpha1
kind: ClusterOverridePolicy
metadata:
  name: mypolicy
spec:
  overrideRules:
    - targetClusters:
        clusters:
          - kubeadmiral-member-1
      overriders:
        args:
          - containerName: "server-1"
            operator: append
            value:
              - "-v=4"
              - "--enable-profiling" 

示例五:覆写标签的键值对

此差异化策略分别表示添加、替换、删除标签资源。针对标签资源,涉及到的覆写语法参数如下:

  • operator:必填项,表示要对以上目标的操作方式,详细介绍参见:覆写规则

  • value:必填项,表示以上操作中需要追加或替换的值。

apiVersion: core.kubeadmiral.io/v1alpha1
kind: ClusterOverridePolicy
metadata:
  name: mypolicy
spec:
  overrideRules:
    - targetClusters:
        clusters:
          - kubeadmiral-member-1
      overriders:
        labels:
          - operator: addIfAbsent
            value: 
              app: "chat"
          - operator: overwrite
            value: 
              version: "v1.1.0"
          - operator: delete
            value: 
              action: ""

示例六:覆写注解的键值对

此差异化策略表示添加一条 Annotation。针对注解资源,涉及到的覆写语法参数如下:

  • operator:必填项,表示要对以上目标的操作方式,详细介绍参见:覆写规则

  • value:必填项,表示以上操作中需要追加或替换的值。

apiVersion: core.kubeadmiral.io/v1alpha1
kind: ClusterOverridePolicy
metadata:
  name: mypolicy
spec:
  overrideRules:
    - targetClusters:
        clusters:
          - kubeadmiral-member-1
      overriders:
        annotations:
          - operator: addIfAbsent
            value:
              imageregistry: "docker"