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 | func (ji *JobInfo) SetPDB(pdb *policyv1.PodDisruptionBudget) { |
异常代码在于注释的那行,代码中直接获取min值,但是这个值可能为NaN值,没有做安全处理
fix之后的代码如注释之后的代码
经过本人的验证,这个fix依然会有问题,没有考虑到pdb的所有情况,所以在volcano项目中(基于kube-batch衍生而来),作者直接去除了pdb的支持,将pdb相关的代码直接去掉了
failed to delete pod
在kube-batch的日志中会出现failed to delete pod之类的错误,这个错误的原因大部分是是由于cache模块在更新pod的调度状态时,首先针将pod删除,然后再添加pod, 但是在删pod时发现task此时已经不再它原来的node上,因此无法删除,也就无法再添加pod,所以fix是如果无法删除这种情况直接忽略,再添加就没问题
资源计算错误问题
Kube-batch中对每一次调度之后都会计划queue中所有的task所占用的资源是不是超过了queue能够使用的最大资源,如果超过,则会返回一个标志位overUsed,返回这个标志位,kube-batch则不会对属于该queue中的task进行调度
但是kube-batch在进行资源比较时出现了计算错误,
核心代码如下:
1 | ssn.AddOverusedFn(pp.Name(), func(obj interface{}) bool { |
该问题比较严重,fix
shadowpodgroup资源对象
kube-batch支持直接在annotation中指定生成shadowpodgroup,这样就不需要每次都创建podgroup对象了
注意,生成的shaowpodgroup并不能通过kubectl查询得到,除了这点不一样之外,其它的跟podgroup的性质是一样的
使用方法:
1 | # ... |
参考文章:
- https://github.com/kubernetes-sigs/kube-batch
- https://www.jianshu.com/p/042692685cf4
- https://argoproj.github.io/argo-workflows/fields/
- https://github.com/volcano-sh/volcano/pull/523
- https://github.com/kubernetes-sigs/kube-batch/issues/670
- https://github.com/kubernetes-sigs/kube-batch/issues/904
- https://kubernetes.io/zh/docs/tasks/run-application/configure-pdb/
- https://hub.fastgit.org/kubernetes-sigs/kube-batch/pull/908