问题描述
在使用AWS的自动扩展策略在EKS工作节点上启动节点时,发现在每天固定时间只有一个节点会先启动,然后是第二个节点,最后是最后一个节点。因此,Kubernetes会将所有Pods添加到第一个节点上。用户想知道是否有办法在这种情况下均匀分布Pods。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
您可以使用亲和性(affinity)和反亲和性(anti-affinity)来控制Pods分布在哪个节点上。通过使用反亲和性,您可以确保每个部署(deployment)只有一个Pod在一个节点上。但是,这可能对您来说有点过度,因为您可能需要在一个节点上运行多个Pods,只是有一个限制。
您可以参考Kubernetes官方文档中关于节点亲和性的部分,了解更多信息:https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/
方案2
使用Descheduler项目可以在集群不平衡时杀死Pods。您可以将其作为一个Kubernetes Job运行。其中的LowNodeUtilization策略似乎适用于您的情况。该策略会找到未充分利用的节点,并尝试从其他节点中驱逐Pods,以便重新创建的Pods将被调度到这些未充分利用的节点上。
您还可以手动应用一些混沌工程,通过强制进行滚动更新来解决平衡问题,希望调度器在重新创建Pods时解决平衡问题。
您可以使用以下命令进行滚动更新:kubectl rollout restart my-deployment
。这比使用kubectl delete pod
直接删除Pods要好,因为滚动更新将在“重新平衡”期间确保可用性(尽管完全删除Pods会增加更好的重新平衡机会)。
请注意,使用Descheduler项目或手动滚动更新可能会增加一些复杂性,并且需要谨慎操作。