还是有点K8的菜鸟,希望有人能在这里提供一些指导。
设置:
- 负责运行CI作业的k8s集群。这些作业最多可运行20分钟。
- 集群中也有一个代理pod在运行,它负责声明作业并启动运行作业的pod(每个作业示例一个pod)
- 集群中有一个正在运行的cluster-autoscaler Pod。由于CI的周期性/可变性,我们需要能够动态扩展可用节点的数量以满足需求。
问题一:
- 在缩小规模的过程中,我们看到工作舱在工作中被杀死。这显然是不可取的。
尝试解决方案:
- 根据CA常见问题解答,我已将CA的
scale-down-utilization-threshold
配置为0
- 我还将
scale-down-unneeded-time
缩短为从10m
到1m
,希望增加空节点保持空状态足够长时间以触发缩减的概率。
问题二:
- 虽然上面的内容似乎解决了问题#1,但我现在有一个新的问题,即集群资源利用率要低得多。
为什么会这样?
我相信在默认情况下,k8的工作负载放置类似于所有合格节点之间的循环调度(如果我错了请纠正我)。这意味着,一旦集群扩展,节点将运行至少一个作业的概率非常高。这将防止CA缩减节点,即使利用率很低并且作业可以轻松地打包到更少数量的节点中。
期望行为
我正在寻找一种方法来配置k8s,以便在集群配置的其他约束条件下,以更有利于提高资源利用率的方式放置pod。
到目前为止,我能想到的唯一方法是使用配置好的标签+节点亲和性的多层节点,在第2层开始接收pod之前,第1层会被填满,等等。虽然我认为这会起作用,但它似乎很混乱,应该有更好的方法。
1条答案
按热度按时间wnvonmuf1#
你需要看看Karpenter。与cluster-autoscaler相比,它直接与EC2示例一起操作,而不是通过ASG。
在您的情况下,当您有一个新的CI任务时,它将创建一个仅适合所需POD的示例,从而使您有更多的机会在其上不运行其他POD。因此,当工作完成时,整个节点将被终止。我们已经在我们所有的项目中使用了一年多,它工作得很好。