文档

差异化规则

更新时间:

您可以在ACK One Fleet实例上进行多集群应用分发差异化配置,实现同一个应用在不同目标集群上的配置不同。本文通过差异化配置示例介绍应用分发支持的更多差异化规则。

规则一:Deployment副本数的差异化

您可以通过以下YAML配置示例文件完成Deployment副本数的差异化配置,实现在目标集群managedcluster-cd****中部署副本数为5的Deployment。

配置示例

apiVersion: core.oam.dev/v1alpha1
kind: Policy
metadata:
  name: cluster-beijing
  namespace: demo
type: topology
properties:
  #定义分发的目标集群。
  clusters: ["managedcluster-cd****"]
---
apiVersion: core.oam.dev/v1alpha1
kind: Policy
metadata:
  name: override-replic-beijing
  namespace: demo
#定义分发的差异化配置。
type: override
properties:
  components:
  #通过名称引用Application中定义的Components,作为待差异化的Kubernetes资源。
  - name: "demo"
    #定义差异化配置类型,type scaler支持修改Deployment的副本数,本示例修改副本数为5。
    traits:
    - type: scaler
      properties:
        replicas: 5
---
apiVersion: core.oam.dev/v1alpha1
kind: Workflow
metadata:
  name: deploy-demo
  namespace: demo
steps:
  - type: deploy
    name: deploy-beijing
    properties:
      #在工作流中应用差异化配置和分发目标。
      policies: ["override-replic-beijing", "cluster-beijing"]
---
apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
  annotations:
    app.oam.dev/publishVersion: version1
  name: demo
  namespace: demo
spec:
  #定义Component。
  components:
    - name: demo
      type: ref-objects
      properties:
        objects:
          - apiVersion: apps/v1
            kind: Deployment
            name: demo
  #引用工作流。
  workflow:
    ref: deploy-demo

差异化配置说明

Deployment副本数差异化配置分为以下三部分:

  • 模块components:在Application中定义Component,将待差异化的Kubernetes资源作为Component的引用资源。

    说明

    差异化配置只会修改Component中引用的第一个资源。

  • 差异化配置traits:ACK One预先定义的差异化配置,简化差异化规则的编写。本示例中scaler支持修改Deployment的副本数。

    参数

    说明

    traits. type: scaler

    定义traitstype类型。

    traits. properties. replicas

    差异化的Deployment副本数。

  • 差异化的目标集群:在Workflowsteps中,同时引用差异化配置Policy和分发目标Policy,实现分发前对Kubernetes资源的差异化配置,将差异化的结果部署在目标集群中。

规则二:Deployment container image的差异化

您可以通过以下YAML配置示例文件完成Deployment container image的差异化配置,实现Deployment中Container的image配置修改。

配置示例

apiVersion: core.oam.dev/v1alpha1
kind: Policy
metadata:
  name: override-image-beijing
  namespace: demo
type: override
properties:
  components:
  - name: "demo"
    #定义差异化配置类型,type container-image支持修改Deployment中Container的image配置。
    traits:
    - type: container-image
      properties:
        containerName: demo
        image: registry.cn-hangzhou.aliyuncs.com/acs/rollouts-demo:green
        imagePullPolicy: Always

差异化配置说明

参数

说明

traits. type: container-image

定义traitstype类型。

traits. properties. containerName

使用 containerName在Deployment中选择Container做差异化配置,属于必选项。

traits. properties. image

差异化image配置,覆盖原有Deployment中Container的image配置,可按需选择。

traits. properties. imagePullPolicy

差异化imagePullPolicy配置,覆盖原有Deployment中Container的imagePullPolicy配置,可按需选择。

规则三:Deployment container command的差异化

您可以通过以下YAML配置示例文件完成Deployment container command的差异化配置,实现Deployment中Container的Command配置修改。

配置示例

apiVersion: core.oam.dev/v1alpha1
kind: Policy
metadata:
  name: override-command
  namespace: demo
type: override
properties:
  components:
  - name: "demo"
    #定义差异化配置类型,type command支持修改Deployment中Container的command配置。
    traits:
    - type: command
      properties:
        containerName: demo
        #覆盖container的command参数。
        command: ["demo-command", "demo-parameter1", "demo-parameter2"]
        #覆盖container的args参数。
        args: ["demo-parameter1", "demo-parameter2"]
        #在原有args中增加参数。
        addArgs: ["new-parameter1"]
        #从原有args中删除参数。
        delArgs: ["parameter1-to-delete"]

差异化配置说明

参数

说明

traits. type: command

定义traitstype类型。

traits. properties. containerName

使用containerName在Deployment中选择Container做差异化配置。

traits. properties. command

差异化command配置,覆盖原有Deployment中Container的command配置。

traits. properties. args

差异化args配置,覆盖原有Deployment中Container的args配置。

traits. properties. addArgs

在原有args中增加参数。

traits. properties. delArgs

从原有args中删除参数。

规则四:Deployment container env的差异化

您可以通过以下YAML配置示例文件完成Deployment container env的差异化配置,实现Deployment中Container的env配置修改。

配置示例

apiVersion: core.oam.dev/v1alpha1
kind: Policy
metadata:
  name: override-command
  namespace: demo
type: override
properties:
  components:
  - name: "demo"
    #定义差异化配置类型,type env支持修改Deployment中Container的env配置。
    traits:
    - type: env
      properties:
        containerName: demo
        #增加新的env配置,如果原有Container的同名env,则覆盖env的值。
        env:
          key_first: value_first
          key_second: value_second
        #删除原有Container的env配置。
        unset: ["ENV1"]

差异化配置说明

参数

说明

traits. type: env

定义traitstype类型。

traits. properties. containerName

使用containerName在Deployment中选择Container做差异化配置。

traits. properties. env

增加新的env配置,如果原有Container的同名env,则覆盖原来env的值。

traits. properties. unset

删除原有Container的env配置。

规则五:基于JSON Patch的差异化

您可以通过以下YAML配置示例文件完成基于JSON Patch的差异化配置,实现资源参数的修改。

配置示例

apiVersion: core.oam.dev/v1alpha1
kind: Policy
metadata:
  name: override-json-path
  namespace: demo
type: override
properties:
  components:
  - name: "demo"
    #定义差异化配置类型,type json-patch支持通过JSON Patch选择要修改的资源的参数,并定义修改方式。
    traits:
    - type: json-patch
      properties:
        operations:
          #op: add增加资源的参数,示例中,增加一个Label。
          - op: add
            path: "/metadata/labels/label-to-add-key"
            value: label-to-add-key-value
          #op: replace修改资源的参数的值,示例中,修改一个已有Label的值。
          - op: replace
            path: "/metadata/labels/label-to-replace-key"
            value: label-modified-value
          #op: remove删除资源的参数,示例中,删除一个已有Label。
          - op: remove
            path: "/metadata/labels/label-to-remove-key"

差异化配置说明

参数

说明

traits. type: json-patch

定义traitstype类型。

traits. properties. operations. op: add

增加资源的参数。

traits. properties. operations. op: replace

修改资源参数的值。

traits. properties. operations. op: remove

删除资源的参数。

规则六:JSON Merge差异化

基于JSON Patch的差异化配置,需要为每个待定的参数定义差异化配置,当资源需要修改参数较多时比较繁琐,此时可以选用JSON Merge差异化来简化配置,实现大量资源参数的修改。

您可以通过以下YAML配置示例文件完成JSON Merge差异化配置,实现不同集群中ConfigMap的配置修改。

配置示例

#Fleet实例中创建ConfigMap。
apiVersion: v1
kind: ConfigMap
metadata:
  name: demo
  namespace: demo
data:
  confg-not-override: "not-override"
  confg-to-override: "value"
  config-file-to-override: |
    {
      "feature-parameters": {
        "key1": "value1",
        "key2": "value2",
      }
    }
  config-to-delete: "to-delete"

---
#创建差异化规则。
apiVersion: core.oam.dev/v1alpha1
kind: Policy
metadata:
  name: override-configmap
  namespace: demo
type: override
properties:
  components:
  - name: "demo"
    #定义差异化配置类型,type json-merge-patch支持通过在properties中定义结构体与原资源合并的方式修改资源。
    traits:
    - type: json-merge-patch
      properties:
        #待修改资源的第一级。
        data:
          #修改confg-to-override的值。
          confg-to-override: "value-override"
          #增加config-to-add。
          config-to-add: "to-add"
          #修改config-file-to-override的内容。
          config-file-to-override: |
            {
              "feature-parameters": {
                "key1": "value1-override",
                "key2": "value2-override",
              }
            }
          #删除config-to-delete。
          config-to-delete: null

---
#修改后的资源。
apiVersion: v1
kind: ConfigMap
metadata:
  name: demo
  namespace: demo
data:
  #confg-not-override没有差异化保持不变。
  confg-not-override: "not-override"
  confg-to-override: "value-override"
  config-file-to-override: |
    {
      "feature-parameters": {
        "key1": "value1-override",
        "key2": "value2-override",
      }
    }

差异化配置说明

参数

说明

traits. type: json-merge-patch

定义资源结构体,与原资源合并,实现差异化。