Str*_*lus 10 autoscaling kubernetes
我需要扩展一组运行基于队列的工作程序的 pod。工人的工作可以运行很长时间(小时),不应中断。Pod 的数量基于工作队列的长度。缩放要么使用使用自定义指标的水平自动缩放器,要么使用一个改变副本数量的简单控制器。
任一解决方案的问题在于,在缩小规模时,无法控制终止哪个 Pod。在任何给定时间,大多数工人可能都在处理短期运行的工作、空闲或(更罕见的)处理长期运行的工作。我想避免杀死长时间运行的工作人员,空闲或短期运行的工作人员可以毫无问题地终止。
以低复杂度做到这一点的方法是什么?我能想到的一件事是根据 pod 的 CPU 使用情况来执行此操作。不理想,但它可能已经足够好了。另一种方法可能是工作人员以某种方式公开一个优先级,表明他们是否是要删除的首选 pod。不过,每次工人接受新工作时,这个优先级都会改变。
最终所有的工作都将是短期运行的,这个问题会消失,但这是目前的长期目标。
在pod终止过程中,Kubernetes 会向 pod 的容器发送 SIGTERM 信号。您可以使用该信号正常关闭您的应用程序。问题是 Kubernetes 不会永远等待您的应用程序完成,在您的情况下,您的应用程序可能需要很长时间才能退出。
在这种情况下,我建议您使用preStop hook,该钩子在 Kubernetes 向容器发送 KILL 信号之前完成。这里有一个关于如何使用处理程序的示例:
Run Code Online (Sandbox Code Playgroud)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"]
| 归档时间: |
|
| 查看次数: |
1360 次 |
| 最近记录: |