Kubernetes更新pod-deletion-cost注解时频繁失败,NodeJS Bull服务结合Keda Redis plugin扩缩容场景下的问题求助
大家好,想跟各位请教一个我们团队近期遇到的棘手问题:
我们用NodeJS搭建了一套任务服务,用Bull管理任务队列,同时借助Keda的Redis插件实现自动扩缩容——这部分整体运行得都挺顺畅的。但最近发现个核心问题:Kubernetes缩容时,经常会误杀掉正在执行重型任务的Pod,导致任务中断,对业务造成了不小影响。
为了解决这个问题,我们想到利用pod-deletion-cost注解来控制Pod的删除优先级:给每个任务分配对应的成本值,任务启动时就把对应Pod的总删除成本往上累加,任务执行完毕再把成本回调回去。理论上K8s缩容时会优先删除成本低的Pod,这样就能保住正在跑重任务的Pod了。
逻辑本身我们已经实现,而且确实有部分更新操作能成功修改pod-deletion-cost的值,但尴尬的是,大概70%的更新尝试都会失败,抛出下面的错误:
Pod "redacted" is invalid: spec: Forbidden: pod updates may not change fields other than
spec.containers[*].image,spec.initContainers[*].image,spec.activeDeadlineSeconds,spec.tolerations(only additions to existing tolerations),spec.terminationGracePeriodSeconds(allow it to be set to 1 if it was previously negative)
core.PodSpec{
Volumes: {redacted...},
InitContainers: ni...
我们排查了很久,确认更新操作只修改了注解字段,完全没碰PodSpec里的其他内容,但还是频繁出现这个错误。想问问各位有没有遇到过类似的情况?或者有没有什么办法能稳定更新这个注解?如果有其他替代方案能实现“让K8s缩容时优先保留正在执行重任务的Pod”这个目标,也欢迎大家给我们支招!
备注:内容来源于stack exchange,提问作者Dor Gross

