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

创建差异化策略(Yaml)

最近更新时间2024.01.19 14:39:11

首次发布时间2023.07.20 10:49:31

差异化策略用于管理资源在不同集群分发时的差异化配置,Yaml 方式支持通过 JsonPatch 或封装的覆写语法配置差异化策略。本文介绍如何通过 Yaml 创建差异化策略。

前提条件

  • 已完成创建主控实例。详情请参见 创建主控实例
  • 已在主控实例中添加成员集群,详情请参见 添加成员集群
  • 若期望创建命名空间级的差异化策略,需提前创建联邦命名空间,详情请参见 创建命名空间

操作步骤

  1. 登录 分布式云原生控制台
  2. 在左侧导航栏选择 联邦主控实例,进入主控实例管理页面。
  3. 在主控实例列表,单击目标主控实例名称,进入主控实例配置页面。
  4. 在左侧导航栏选择 策略管理 > 差异化策略
  5. 单击 使用 Yaml 创建资源,并配置差异化策略,完成后单击 确定

alt

以创建命名空间级别的差异化策略为例,Yaml 模板示例如下:

apiVersion: core.kubeadmiral.io/v1alpha1
kind: OverridePolicy
metadata:
  name: mypolicy
  namespace: users-namespace
spec:
  overrideRules:
    - targetClusters:
        clusters:
          - ClusterID-01 # Modify the selected cluster ID to propagate the resource.
          - ClusterID-02 # Modify the selected cluster ID to propagate the resource.
        #clusterSelector:
          #region: beijing
          #az: zone1
        #clusterAffinity:
          #- matchExpressions:
            #- key: region
              #operator: In
              #values:
              #- beijing
            #- key: provider
              #operator: In
              #values:
              #- volcengine
      overriders:
        jsonpatch:
          - path: "/spec/template/spec/containers/0/image"
            operator: replace
            value: "nginx:test"
          #- path: /data/example
            #operator: add
            #value: 2
          #- path: /data/example
            #operator: remove
配置项说明

kind

差异化策略的类型,包括:OverridePolicy、ClusterOverridePolicy。

  • OverridePolicy:命名空间级别的差异化策略,此类型需要继续在metadata中配置namespace

  • ClusterOverridePolicy:集群级别的差异化策略。

name自定义差异化策略的名称。
namespace命名空间级别差异化策略所属的命名空间,当kind选择OverridePolicy时需要配置,直接指定已有命名空间的名称即可。

clusters

差异化策略的 Yaml 配置文件中,通过targetClusters中的clusters来配置策略生效的成员集群,指定成员集群的 ID 即可。

说明

  • 支持指定一个或多个成员集群的 ID。

  • clusers内容为空或长度为 0,且clusterSelectorclusterAffinity内容均为空时,表示匹配所有成员集群。

overrideRules:
  - targetClusters:
      clusters:
        - ccehg7mnqtofij7m5k0hg
        - ccehg86nqtofij7m5k0ig
    overriders:
      jsonpatch:
        ...

clusterSelector

clusterSelector 集群标签:通过键值对形式的标签来匹配集群,差异化策略在 clusterSelector 标签匹配的成员集群内生效。

说明

控制台要求选择一种类型的集群标签进行配置,若同时配置多个标签,生效规则如下:

  • 若使用 clusterSelector 类型的集群标签,成员集群必须匹配以下所有标签。

  • 若同时使用 clusterSelector 和 clusterAffinity 类型的集群标签,两种标签之间的结果取交集。

  • clusers内容为空或长度为 0,且clusterSelectorclusterAffinity内容均为空时,表示匹配所有成员集群。

clusterSelector:
  region: beijing
  az: zone1

clusterAffinity

clusterAffinity 集群标签:通过强制调度条件中配置的选择器标签来匹配集群,差异化策略在 clusterAffinity 标签匹配的成员集群内生效。

说明

控制台要求选择一种类型的集群标签进行配置,若同时配置多个标签,生效规则如下:

  • 若使用 clusterAffinity 类型的集群标签,成员集群只需满足以下任意一个「条件」,每个「条件」中的所有标签必须同时匹配。

  • 若同时使用 clusterSelector 和 clusterAffinity 类型的集群标签,两种标签之间的结果取交集。

  • clusers内容为空或长度为 0,且clusterSelectorclusterAffinity内容均为空时,表示匹配所有成员集群。

clusterAffinity:
      matchExpressions:
      - key: region
        operator: In
        values:
          - beijing
      - key: provider
        operator: In
        values:
          - volcengine
      matchExpressions:
      ...

overriders

差异化策略的 Yaml 配置文件中,使用overriders配置覆写操作。表示对符合条件的成员集群中的资源进行具体的覆写操作,每个overriders中支持多条覆写规则。
目前支持的覆写方法包括:jsonpatch 覆写语法、高级覆写语法,可根据实际情况按需选择。

  • jsonpatch 覆写语法:通用的覆写语法,适用于指定路径整体覆写字段的场景,资源覆盖面广但覆写颗粒度较粗,详细介绍参见:jsonpatch 覆写语法

  • 封装的覆写语法:针对指定资源(包括:Image、Command、Args、Labels、Annotations 等)封装的覆写语法,资源覆盖面局限但覆写颗粒度更细,详细介绍参见:封装的覆写语法

jsonpatch

jsonpatch是通用的覆写语法,适用于指定路径整体覆写字段的场景,资源覆盖面广但覆写颗粒度较粗。语法和示例介绍如下:

  • pathjsonpatch中的path表示目标覆写字段的路径。

  • operatorjsonpatch中的operator表示支持的操作,包括:add、remove、replace。

    • add: 向资源追加一个或多个元素。

    • remove: 从资源中删除一个或多个元素。

    • replace: 替换资源中的一个或多个元素。

  • valuejsonpatch中的value表示目标覆写字段的值。

overrideRules:
  - targetClusters:
      ...
    overriders:
      jsonpatch:
        - path: "/spec/template/spec/containers/0/image"
          operator: replace
          value: "nginx:test"
        - path: /data/example
          operator: add
          value: 2
        - path: /data/example
          operator:remove
        ...

image

封装覆写策略中的一种,可针对 image 资源进行细粒度字段覆写。镜像仓库地址组成为:[Registry '/'] Repository [ ":" Tag ][ "@" Digest ],在「image」中通过提供一下配置字段与配置方式实现镜像地址的覆写。
Kubernetes 原生资源和 CRD 资源的语法略有差异,如下介绍。

Kubernetes 原生资源: 针对 Deployment、StatefulSet、DaemonSet、Job、CronJob、Pod 资源,需要覆写的镜像地址路径明确,作为内置资源可直接指定 containerNames。

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

说明

内置资源本质上是通过 container 名称明确覆写路径,原生资源也可以直接指定 CRD 中的 path 路径。

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

    • Registry:镜像所在仓库地址。

    • Repository:镜像名称。

    • Tag:镜像版本号。

    • Digest:镜像标识符。

  • operator:必填项,表示要对以上目标的操作方式,可选值如下。

    • addIfAbsent:将定义的值添加到目标现有值。例如:添加镜像 tag 或 digest。

    • overwrite:将定义的值替换目标现有值。例如:将 Registry 替换为相应环境的仓库地址。

    • delete:将目标的现有值整体删除。例如:将 Registry 统一删除。

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

overrideRules:
  - targetClusters:
      ...
      overriders:
        image:
          - containerNames:
              - "server-1"
              - "server-2"
            operations:
              - imageComponent: Registry
                operator: addIfAbsent
                value: cluster.io

CRD 资源: 因镜像地址路径不明确,用户需要手动指定需要覆写的路径 path。

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

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

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

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

overrideRules:
  - targetClusters:
      ...
      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:aaaaf56b44807c6408d1726"

Command/Args

封装覆写策略中的一种,可针对 Command 或 Args 资源进行细粒度字段覆写。

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

  • operator:必填项,表示要对以上目标的操作方式,可选值如下。

    • append:将定义的值追加到目标现有值。例如:在现有命令后追加补充命令。

    • overwrite:将定义的值替换目标现有值。例如:将已有命令整体替换为新命令。

    • delete:将目标的现有值整体删除。例如:将已有命令整体删除。

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

overrideRules:
  - targetClusters:
      ...
      overriders:
        command:
          - containerName: "server-1"
            operator: append
            value:
              - "/bin/sh"
              - "-c"
              - "sleep 10s"
          - containerName: "server-1"
            operator: overwrite
            value:
              - "/bin/sh"
              - "-c"
              - "sleep 10s"
          - containerName: "server-2"
            operator: delete
            value:
              - "sleep 10s"
        args:
          - containerName: "server-1"
            operator: append
            value:
              - "-v=4"
              - "--enable-profiling"

Labels/Annotations

封装覆写策略中的一种,可针对 Labels 或 Annotations 资源进行细粒度字段覆写。

  • operator:必填项,表示要对以上目标的操作方式,可选值如下。

    • addIfAbsent:将定义的值添加到目标现有值。例如:添加一条标签。

    • overwrite:将定义的值替换目标现有值。例如:替换已有标签app: "abc"的值为app: "def"

    • delete:将目标的现有值整体删除。例如:将已有标签整体删除。

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

overrideRules:
  - targetClusters:
      ...
      overriders:
        labels:
          - operator: addIfAbsent
            value:
              app: "chat"
          - operator: overwrite
            value:
              version: "v1.1.0"
          - operator: delete
            value:
              action: ""
        annotations:
          - operator: addIfAbsent
            value:
              imageregistry: "docker"

后续操作

完成创建差异化策略后,您可以在进行资源分发时,直接引用差异化策略,从而实现与预期相符的资源分发。详细介绍参见:资源分发实践