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

创建部署策略(Yaml)

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

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

部署策略是资源跨集群分发的基础,可用于指定资源部署在哪些集群中。本文介绍如何使用 Yaml 创建部署策略。

前提条件

操作步骤

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

alt

以创建命名空间级别的部署策略为例,完整的 Yaml 模板如下:

apiVersion: core.kubeadmiral.io/v1alpha1
kind: PropagationPolicy
metadata:
  name: mypolicy # adjust name for your policy
  namespace: users-namespace # specify your namespace to apply policy
spec:
  schedulingMode: Duplicate # schedulingMode could be Divide or Duplicate
  disableFollowerScheduling: false
  placement:
    - cluster: ClusterID-01 # Modify the selected cluster ID to propagate the resource.
      #preferences:
        #weight: 40
        #minReplicas: 1
        #maxReplicas: 3
    - cluster: ClusterID-02 # Modify the selected cluster ID to propagate the resource.
      #preferences:
        #weight: 40
        #minReplicas: 1
        #maxReplicas: 3
  #clusterSelector:
    #region: beijing
    #az: zone1
  #clusterAffinity:
    #- matchExpressions:
      #- key: region
        #operator: In
        #values:
          #- beijing
      #- key: provider
        #operator: In
        #values:
          #- volcengine
  #tolerations:
  #- key: "key1"
    #operator: "Equal"
    #value: "value1"
    #effect: "NoSchedule"
  #- key: "key2"
    #operator: "Exists"
    #effect: "NoSchedule"
  #maxClusters: 1 # Maximum number of clusters that can be scheduled.
  reschedulePolicy:
    disableRescheduling: false
    rescheduleWhen:
      policyContentChanged: true
      clusterJoined: false
      clusterLabelsChanged: false
      clusterAPIResourcesChanged: false
    replicaRescheduling:
      avoidDisruption: true # If set to true, the algorithm will attempt to avoid disrupting existing replicas (this might lead to deviation from weights).
  autoMigration:
    keepUnschedulableReplicas: true # If set to true, besides starting new pods, the unschedulable pods will be kept in the original cluster so the new pods can be migrated back if the cluster recovers.
    when:
      podUnschedulableFor: 1m # pods which remain unschedulable beyond this duration will be subject to auto migration.
  
配置项说明
apiVersionAPI 版本信息,固定为:core.kubeadmiral.io/v1alpha1

kind

部署策略的级别,包括:PropagationPolicy、ClusterPropagationPolicy。

  • PropagationPolicy:命名空间级别的部署策略,此类型需要继续在metadata中配置namespace

  • ClusterPropagationPolicy:集群级别的部署策略。

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

schedulingMode

副本调度策略,包括: Duplicate、Divide。

  • Duplicate:复制分发模式,表示在多个成员集群中,分发完全相同数量的资源。

  • Divide:副本模式调度,可根据系统算法自动匹配的动态权重,或自定义配置权重的静态权重,将多个副本分发到多个集群中。

说明

副本模式调度目前仅针对 Deployment 资源生效,其他资源默认按照复制分发生效。

disableFollowerScheduling

跟随调度,工作负载关联的资源(如 ConfigMap、Secret等)自动跟随副本分发到成员集群中。

  • true:开启跟随调度功能。

  • false:关闭跟随调度功能。

replicasStrategy

集群优先级配置参数,replicasStrategy: Binpack表示开启集群优先级调度能力并配置为 Binpack 模式。若开启集群优先级调度能力,副本将调度到优先级高的集群;可通过priority来配置每个集群的优先级,数字越大优先级越高。

placement

指定集群:部署策略只在指定的成员集群内生效,资源仅在指定成员集群中进行调度。推荐选择多个成员集群作为部署集群,以满足联邦调度的场景。

说明

  • 支持指定一个或多个成员集群的 ID。
  • placement内容为空或长度为 0,且clusterSelectorclusterAffinity内容均为空时,表示匹配所有成员集群。

配置资源分发的集群、权重、副本数,适用于多集群分发的场景。配置参数包括:cluster、weight、minReplicas、maxReplicas。

  • cluster:策略分发的部署集群,从已有成员集群中指定。

  • priority:集群优先级,replicasStrategy 开启后可配置,数字越大优先级越高。

  • weight:静态权重分发时的相对权重,取值范围为 1 ~ 100 ,数字越大相对权重越高,实际按照生效成员集群配置的相对权重生效。例如:所选两个部署集群的权重分别为 1(或者 100),则静态权重各为 50%。

  • minReplicas:最小副本数,当前集群分发副本的最小值,minReplicasmaxReplicas相等表示指定固定副本数。

  • maxReplicas:最大副本数,当前集群分发副本的最大值。

典型应用场景如下:

  1. 复制分发场景,配置资源分发的部署集群,按需配置副本数。
schedulingMode: Duplicate
placement:
  - cluster: ccf3rmafqtofnjdusp3d0
  - cluster: ccf3rmafqtofnjdusp3d1
      preferences:
        minReplicas: 3
        maxReplicas: 3
  - cluster: ccf3rmq7qtofnjdusp3e2
      preferences:
        minReplicas: 1
        maxReplicas: 3
  1. 动态分发场景,仅配置资源分发的部署集群即可。
schedulingMode: Divide
placement:
  - cluster: ccf3rmafqtofnjdusp3d0
  - cluster: ccf3rmq7qtofnjdusp3e0
  1. 静态分发场景,配置部署集群的同时,还需要配置权重。
schedulingMode: Divide
placement:
  - cluster: ccf3rmafqtofnjdusp3d0
    preferences:
      weight: 40
  - cluster: ccf3rmq7qtofnjdusp3e0
    preferences:
      weight: 60
  1. 集群优先级调度场景,配置部署集群的同时,开启集群优先级调度 Binpack 模式,并配置集群优先级。
spec:
  schedulingMode: Divide
  replicasStrategy: Binpack # 开启集群优先级调度
  placement:
    - cluster: cclt81kqnjbeqedvbbt0g  # 成员集群 A 的 ID
      preferences:
        priority: 3  # 成员集群 A 的集群优先级
        minReplicas: 2
        maxReplicas: 10
    - cluster: ccltbv1p1h4ho7pq6sugg  # 成员集群 B 的 ID
      preferences:
        priority: 2  # 成员集群 B 的集群优先级
        minReplicas: 2
        maxReplicas: 10
    - cluster: cclt75bp1h4ho7pq6su9g  # 成员集群 C 的 ID
      preferences:
        priority: 1  # 成员集群 C 的集群优先级
        minReplicas: 2
        maxReplicas: 10

clusterSelector

clusterSelector 集群标签:通过键值对形式的标签来匹配集群。部署策略在 clusterSelector 标签匹配的成员集群内生效,资源在 clusterSelector 匹配标签的成员集群中进行调度。

说明

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

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

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

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

clusterSelector:
  region: beijing
  az: zone1

clusterAffinity

clusterAffinity 集群标签:通过强制调度条件中配置的选择器标签来匹配集群。部署策略在 clusterAffinity 标签匹配的成员集群内生效,资源仅在 clusterAffinity 匹配标签的成员集群中进行调度。

说明

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

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

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

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

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

tolerations

集群污点调度功能,配置后可按需配置污点容忍,并按照选择的多个污点进行集群调度。示例如下:

tolerations:
- effect: NoSchedule
  key: dedicated
  operator: Equal
  value: groupName
- effect: NoExecute
  key: special
  operator: Exists

maxClusters

副本分发的最大集群数,可用于配置资源可调度到的成员集群数上限,取值范围为正整数。
单集群分发场景,可将最大集群数配置为 1。例如:任务类负载调度,将最大集群数设置为 1,任务负载将会在多个可选成员集群中选择一个资源最优的集群调度执行。

disableRescheduling

关闭重调度功能的总开关,配置为 false 表示开启重调度功能。

  • false:资源分发到成员集群后将根据配置的 rescheduleWhen、avoidDisruption、autoMigration 等策略,触发副本重调度。

  • true:资源分发到成员集群后不会因为资源修改、策略变更等原因触发资源重调度。

rescheduleWhen

启用重调度机制下,可指定触发重调度的条件,当条件发生时会自动触发资源按照最新的策略配置及集群环境重新调度。
包括:部署策略调度语义变更、新增成员集群、成员集群标签变更、成员集群 API Resource 变化。

rescheduleWhen:
  policyContentChanged: true    # 部署策略调度语义变更
  clusterJoined: false          # 新增成员集群
  clusterLabelsChanged: false   # 成员集群标签变更
  clusterAPIResourcesChanged: false  # 成员集群 API Resource 变化

avoidDisruption

默认开启。开启后,因扩缩容、策略更新、副本不可调度迁移等原因导致副本重分配时,不会影响当前已调度的副本。

  • true:开启避免中断现有副本功能,上述策略生效,但可能导致权重偏离。

  • false:关闭避免中断现有副本功能。

示例一:副本数不变场景
重调度时可能遇到副本数量达到预期,但分布与权重不符的情况(尤其动态集群权重,集群可用资源持续变化的场景),若此时改变副本分布,可能造成可用性波动。因此,允许用户按需配置:

  • avoidDisruption: false时,不感知当前副本分布,都将按照权重重新分布,将导致分配期间的瞬时副本数偏低。

  • avoidDisruption: true时,只要副本数量达到预期,不管当前分布是否符合权重,都不改变分布,不影响业务可用性。

示例二:扩容场景
假设将副本数从 12 扩容到 18 副本,3 个集群权重相等,目前分布为 10+1+1。

  • avoidDisruption: false时,会将副本重分布为 6+6+6。杀掉 A 中 4 个副本,B 和 C 中各起 5 个副本,B 和 C 中新副本运作前,瞬时可用副本只有 6+1+1=8,低于当前副本数。

  • avoidDisruption: true时,会造成 10+4+4 的分布,任何集群中都不会影响正在运行的副本,任何时间可用副本数都不低于 12,不影响业务可用性。

示例三:缩容场景
假设将副本数从 60 缩容到 30 副本,3 个集群权重相等,目前分布为 60+1+1。

  • avoidDisruption: false时,会将副本重分布为 20+20+20。杀掉 A 中的 40 个副本,B 和 C 中各起 20 个副本,B 和 C 新的副本运作前,瞬时可用副本只有 20+0+0,低于目标副本数。

  • avoidDisruption: true时,会造成 30+0+0 的分布,任何时间可用副本数都不低于 30,不影响业务可用性。

autoMigration

副本不可调度迁移功能,需要配置以下参数:podUnschedulableFor、keepUnschedulableReplicas

  • keepUnschedulableReplicas:故障恢复迁回功能,true表示启用,副本迁移时会保留原集群不可调度的副本,当副本恢复后,迁移到其他集群的副本会被删除;false表示关闭,副本迁移时原集群不可调度副本会被删除。

  • podUnschedulableFor:不可调度的持续时间,副本在成员集群中不可调度持续的时间阈值,取值范围:大于 1 的正整数,单位为分钟。

autoMigration:
  keepUnschedulableReplicas: true
  when:
    podUnschedulableFor: 1m

后续操作

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