UnitedDeployment

256 阅读2分钟

阅读本节前请了解 UnitedDeployment 的使用和功能

系列教程: Openkruise

openkruise doc :openkruise.io/zh/docs/use…

UnitedDeployment 是创建并管理多个 workload 的,一个 UnitedDeployment 只能管理一种 workload,然后通过 subsets 进行调度

Reconcile

准备阶段

  1. 调用 getNameToSubset(instance, control, expectedRevision) 获得 subset-name, subset * 的 map nameToSubset,这里面的 subset 都是已经被 unitedDeployment 所管理的
  2. nextReplicas, err := GetAllocatedReplicas(nameToSubset, instance),这里返回一个 subset-name, replicas 的 map,为的是解析各 subset replica 的数值( 因为定义里面也允许百分比例如 replicas: 50% )
  3. 调用 nextPartitions := calcNextPartitions(instance, nextReplicas)来进一步确定要更新的 replicas,此处是根据 partition 策略调整 replicas 的数量,以此来进行按批灰度 [ Ref: Pod 更新管理]

更新阶段

该函数使得 workload 符合 subsets 的描述

入口函数 newStatus, err := r.manageSubsets(instance, nameToSubset, nextReplicas, nextPartitions, currentRevision, updatedRevision, subsetType)

Subsets & workload 的创建与删除

exists, provisioned, err := r.manageSubsetProvision(ud, nameToSubset, nextReplicas, nextPartitions, currentRevision, updatedRevision, subsetType)

  数据准备

  1. 对比 nameToSubset ****与 UnitedDeployment.Spec.Topology.Subsets(expectSubsets) 里的区别,nameToSubset ****里没有但 expectSubsets 有的subset会被记录到 creates []string 里。
  2. 同样对比 nameToSubset 与 expectSubsets,nameToSubset 有但 expectSubsets 没有的 subset 被认为应该删除的 subset,被记录到数组 deletes []string 里

  创建

  1. 采用慢启动算法对 subset 进行创建:r.subSetControls[subsetType].CreateSubset(ud, subsetName, revision, replicas, partition)

    1. 这里有个核心函数是 m.adapter.ApplySubsetTemplate(ud, subsetName, revision, replicas, partition, set),不同的 workload 有不同的 adapter,该函数是把 spec.template 作为 workload 的模版,同时将 subset.nodeSelector,nextPartition 信息合并到 workload 的定义里,下面我们以 cloneSet 为例子讲述该函数的流程cloneset_adapter.go: ApplySubsetTemplate

      1.     set := obj.(*alpha1.CloneSet)
            // 初始化 ns/labels/selectors/annotations ......
            set.Namespace = ud.Namespace
            for k, v := range ud.Spec.Template.CloneSetTemplate.Labels {
                set.Labels[k] = v
            }
            for k, v := range ud.Spec.Selector.MatchLabels {
                set.Labels[k] = v
            }
            for k, v := range ud.Spec.Template.CloneSetTemplate.Annotations {
                set.Annotations[k] = v
            }
            .......
            
            // 调度策略的初始化,根据 subset 中的值写入到对应的 workload
            attachNodeAffinity(&set.Spec.Template.Spec, subSetConfig)
            attachTolerations(&set.Spec.Template.Spec, subSetConfig
        
      2.       

  删除

  1. 删除 deletes 里的 subsets,具体来讲是通过 SubsetRef 查找到对应的 workload 然后删除
  2. 删除其他种类的 subset,意味着一个 UnitedDeployment 只能管理一种类型的 workload

更新

  1. 通过 revision 来确定需要更新的 subsets 并记录到 needUpdate []string 中
  2. 调用 UpdateSubset 进行更新操作, 具体也是和创建流程一样,调用了 m.adapter.ApplySubsetTemplate来填充 workload 模版进行跟新