Pod在节点池中不平衡。为什么不传播到每个节点?
我在1个节点池中有9个实例。过去,我曾尝试添加到12个实例。豆荚不平衡。
image description here 是否想知道是否有任何解决方案可以帮助解决此问题,并且在1个节点池中使用了9个实例?
答案 0 :(得分:0)
pod计划由kube-scheduler在节点上运行。并且一旦安排好,除非将其删除,否则它们不会重新安排。
因此,如果您添加更多节点,则已运行的pod不会重新安排。
孵化器中有一个项目可以完全解决这个问题。
https://github.com/kubernetes-incubator/descheduler
Kubernetes中的调度是将挂起的Pod绑定到 节点,由Kubernetes的一个组件执行 kube-scheduler。调度程序的决定,无论Pod是否可以在何处执行 或无法安排,请遵循其可配置策略 由一组规则组成,称为谓词和优先级。的 调度程序的决定受Kubernetes视图的影响 在新时间点首次出现新广告连播的时间点群集 排程。由于Kubernetes集群非常动态并且其状态 随时间变化,可能需要将已经运行的吊舱移至 其他一些节点由于各种原因:
- 某些节点的利用率不足或过度。
- 最初的调度决策不再成立,因为污点或标签已添加到节点(pod /节点)或从节点中删除
亲和力要求不再得到满足。- 某些节点发生故障,并且吊舱已移至其他节点。
- 新节点已添加到集群中。
答案 1 :(得分:0)
您应该查看inter-pod anti-affinity。通过此功能,您可以根据在节点上运行的容器的标签来限制不应将容器调度的位置。对于您的情况,假设您的应用具有标签app-label
,则可以使用它来确保未在包含标签为app-label
的容器的节点上调度容器。例如:
apiVersion: apps/v1
kind: Deployment
...
spec:
selector:
matchLabels:
label-key: label-value
template:
metadata:
labels:
label-key: label-value
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: label-key
operator: In
values:
- label-value
topologyKey: "kubernetes.io/hostname"
...
PS:如果使用requiredDuringSchedulingIgnoredDuringExecution
,则最多可以有与节点数相同的Pod。如果您希望可用的Pod超过可用的节点数,则必须使用preferredDuringSchedulingIgnoredDuringExecution
,这会使反亲和力成为优先选择,而不是义务。