我在AWS EKS集群中使用HPA(Horizontal Pod Autoscaler)和Karpenter,分别用于在应用程序遇到高流量时增加Pod数量和提供新节点。
我的应用程序是一个简单的API服务pod,它接收来自外部世界的各种请求并适当地处理这些流量。
我对应用程序进行了一些负载测试,遇到了以下事件。我将尽可能地描述。
目前,有5个pod服务于我的API。这是因为部署中的副本数量设置为5。我设置了一个HPA从最小的5个舱扩展到最大的20个舱。它尝试将目标cpu利用率保持在50%。
另外,我已经部署了Karpenter,并创建了一个提供程序,为我的集群提供和取消特定类型的节点。
当我故意给我的应用程序大量流量来触发HPA时,它被成功触发并创建了最多20个pod来缓解流量。
由于现有节点中没有足够的资源来容纳所有20个pod,因此触发了Karpenter提供程序,并开始向我的集群提供几个节点。因此,它又提供了5个节点。现有节点和新节点现在能够一起为所有20个pod提供服务。
现在,当我删除所有流量时,HPA将pod的数量从20减少到5,因为cpu利用率现在几乎为0。然后,由于不需要额外的节点,因此触发了Karpenter提供程序,并开始解除预先创建的节点的配置。由于我在Karpenter提供程序的清单文件中将整合设置为true,因此取消配置被激活。
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
name: my-provisioner
spec:
consolidation:
enabled: true
...
但是,我发现并不是所有新配置的节点都被解除了配置。其中一个仍然留在集群中,因为5个pod(目前集群中有5个pod,因为部署声明了5个副本)中的一个位于karpenter提供的节点上,而不是在现有节点上。
我发现这相当浪费钱,因为我目前正在运行一个由Karpenter提供程序创建的额外节点,尽管这个节点并不一定需要;现有节点可以充分满足运行5个pod的所有需求。
是否有一种方法告诉HPA和/或Karpenter提供者首先驱逐哪些pod,万一不再需要额外创建的pod ?我认为上述情况的发生是因为HPA删除了原来存在的一个pod,而不是从HPA新创建的pod中删除。
是否有一种方法告诉HPA首先删除新创建的pod,在取消配置pod的情况下?
也许可以切换到Fargate/或有污点(或任何其他你想要的方式),这样只有你想要的荚将被调度到karpenter节点