Z.S.K.'s Records

Kube-batch学习(kube-batch踩坑记)

由于kube-batch经久未修,导致在引入kube-batch到环境中验证期间fix了很多问题,记录于此

Kube-batch版本为v1.5.0, kube-batch github上能看到的最后一个release版本.

解决集群中如果存在pdb时出现的空指针问题

在kube-batch的稳定版本中(目前是v1.5.0),如果集群中有pdb,pdb在k8s中是一种安全机制,可参考

如果podb的属性值有空值时,kube-batch在启动时会出现空指针异常,核心代码:

1
2
3
4
5
6
7
8
9
10
11
func (ji *JobInfo) SetPDB(pdb *policyv1.PodDisruptionBudget) {
ji.Name = pdb.Name
//ji.MinAvailable = pdb.Spec.MinAvailable.IntVal # fix之前的错误代码,以下是fix之后新增的代码
defaultMinAvailable := intstr.IntOrString{Type: intstr.Int, IntVal: int32(0)}
minAvailable := pdb.Spec.MinAvailable
ji.MinAvailable = int32(intstr.ValueOrDefault(minAvailable, defaultMinAvailable).IntValue())
ji.Namespace = pdb.Namespace

ji.CreationTimestamp = pdb.GetCreationTimestamp()
ji.PDB = pdb
}

异常代码在于注释的那行,代码中直接获取min值,但是这个值可能为NaN值,没有做安全处理

fix之后的代码如注释之后的代码

经过本人的验证,这个fix依然会有问题,没有考虑到pdb的所有情况,所以在volcano项目中(基于kube-batch衍生而来),作者直接去除了pdb的支持,将pdb相关的代码直接去掉了

fix

failed to delete pod

在kube-batch的日志中会出现failed to delete pod之类的错误,这个错误的原因大部分是是由于cache模块在更新pod的调度状态时,首先针将pod删除,然后再添加pod, 但是在删pod时发现task此时已经不再它原来的node上,因此无法删除,也就无法再添加pod,所以fix是如果无法删除这种情况直接忽略,再添加就没问题

fix

资源计算错误问题

Kube-batch中对每一次调度之后都会计划queue中所有的task所占用的资源是不是超过了queue能够使用的最大资源,如果超过,则会返回一个标志位overUsed,返回这个标志位,kube-batch则不会对属于该queue中的task进行调度

但是kube-batch在进行资源比较时出现了计算错误,

核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
ssn.AddOverusedFn(pp.Name(), func(obj interface{}) bool {
queue := obj.(*api.QueueInfo)
attr := pp.queueOpts[queue.UID]

//overused := attr.deserved.Less(attr.allocated)
overused := attr.deserved.LessEqual(attr.allocated)
if overused {
glog.V(3).Infof("Queue <%v>: deserved <%v>, allocated <%v>, share <%v>",
queue.Name, attr.deserved, attr.allocated, attr.share)
}

return overused
})

该问题比较严重,fix

shadowpodgroup资源对象

kube-batch支持直接在annotation中指定生成shadowpodgroup,这样就不需要每次都创建podgroup对象了

注意,生成的shaowpodgroup并不能通过kubectl查询得到,除了这点不一样之外,其它的跟podgroup的性质是一样的

使用方法:

1
2
3
4
5
6
7
8
# ...
templates:
- name: seg
schedulerName: kube-batch ### 这里指定使用kube-batch调度器,没有指定则会使用k8s集群中默认的调度器 ###
metadata:
annotations:
"scheduling.k8s.io/group-min-member": "2" ### 这里指定podgroup中minMember
# ...

merge

参考文章:

转载请注明原作者: 周淑科(https://izsk.me)

 wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?