在可能缩小时防止杀死一些豆荚?

Str*_*lus 10 autoscaling kubernetes

我需要扩展一组运行基于队列的工作程序的 pod。工人的工作可以运行很长时间(小时),不应中断。Pod 的数量基于工作队列的长度。缩放要么使用使用自定义指标的水平自动缩放器,要么使用一个改变副本数量的简单控制器。

任一解决方案的问题在于,在缩小规模时,无法控制终止哪个 Pod。在任何给定时间,大多数工人可能都在处理短期运行的工作、空闲或(更罕见的)处理长期运行的工作。我想避免杀死长时间运行的工作人员,空闲或短期运行的工作人员可以毫无问题地终止。

以低复杂度做到这一点的方法是什么?我能想到的一件事是根据 pod 的 CPU 使用情况来执行此操作。不理想,但它可能已经足够好了。另一种方法可能是工作人员以某种方式公开一个优先级,表明他们是否是要删除的首选 pod。不过,每次工人接受新工作时,这个优先级都会改变。

最终所有的工作都将是短期运行的,这个问题会消失,但这是目前的长期目标。

vic*_*rtv 2

在pod终止过程中,Kubernetes 会向 pod 的容器发送 SIGTERM 信号。您可以使用该信号正常关闭您的应用程序。问题是 Kubernetes 不会永远等待您的应用程序完成,在您的情况下,您的应用程序可能需要很长时间才能退出。
在这种情况下,我建议您使用preStop hook,该钩子在 Kubernetes 向容器发送 KILL 信号之前完成。这里有一个关于如何使用处理程序的示例:

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:
        exec:
          command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]
Run Code Online (Sandbox Code Playgroud)

  • 这对于设想的解决方案不起作用,因为长时间运行的作业无法从保存的状态恢复;他们必须重新开始。 (2认同)