阅读本节前请了解 UnitedDeployment 的使用和功能
系列教程: Openkruise
openkruise doc :openkruise.io/zh/docs/use…
UnitedDeployment 是创建并管理多个 workload 的,一个 UnitedDeployment 只能管理一种 workload,然后通过 subsets 进行调度
Reconcile
准备阶段
- 调用
getNameToSubset(instance, control, expectedRevision)获得 subset-name, subset * 的 map nameToSubset,这里面的 subset 都是已经被 unitedDeployment 所管理的 nextReplicas, err := GetAllocatedReplicas(nameToSubset, instance),这里返回一个 subset-name, replicas 的 map,为的是解析各 subset replica 的数值( 因为定义里面也允许百分比例如 replicas: 50% )- 调用
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)
数据准备
- 对比 nameToSubset ****与 UnitedDeployment.Spec.Topology.Subsets(expectSubsets) 里的区别,nameToSubset ****里没有但 expectSubsets 有的subset会被记录到 creates []string 里。
- 同样对比 nameToSubset 与 expectSubsets,nameToSubset 有但 expectSubsets 没有的 subset 被认为应该删除的 subset,被记录到数组 deletes []string 里
创建
-
采用慢启动算法对 subset 进行创建:
r.subSetControls[subsetType].CreateSubset(ud, subsetName, revision, replicas, partition)-
这里有个核心函数是
m.adapter.ApplySubsetTemplate(ud, subsetName, revision, replicas, partition, set),不同的 workload 有不同的 adapter,该函数是把 spec.template 作为 workload 的模版,同时将 subset.nodeSelector,nextPartition 信息合并到 workload 的定义里,下面我们以 cloneSet 为例子讲述该函数的流程cloneset_adapter.go: ApplySubsetTemplate-
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
-
-
删除
- 删除 deletes 里的 subsets,具体来讲是通过 SubsetRef 查找到对应的 workload 然后删除
- 删除其他种类的 subset,意味着一个 UnitedDeployment 只能管理一种类型的 workload
更新
- 通过 revision 来确定需要更新的 subsets 并记录到 needUpdate []string 中
- 调用
UpdateSubset进行更新操作, 具体也是和创建流程一样,调用了m.adapter.ApplySubsetTemplate来填充 workload 模版进行跟新