您可以在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定义
traits的type类型。traits. properties. replicas差异化的Deployment副本数。
差异化的目标集群:在
Workflow的steps中,同时引用差异化配置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差异化配置说明
参数  | 说明  | 
  | 定义  | 
  | 使用  | 
  | 差异化  | 
  | 差异化  | 
规则三: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"]差异化配置说明
参数  | 说明  | 
  | 定义  | 
  | 使用  | 
  | 差异化  | 
  | 差异化  | 
  | 在原有  | 
  | 从原有  | 
规则四: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"]差异化配置说明
参数  | 说明  | 
  | 定义  | 
  | 使用  | 
  | 增加新的env配置,如果原有Container的同名env,则覆盖原来env的值。  | 
  | 删除原有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"差异化配置说明
参数  | 说明  | 
  | 定义  | 
  | 增加资源的参数。  | 
  | 修改资源参数的值。  | 
  | 删除资源的参数。  | 
规则六: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",
      }
    }差异化配置说明
参数  | 说明  | 
  | 定义资源结构体,与原资源合并,实现差异化。  |