https://github.com/kubernetes-sigs/descheduler
背景:
当所处集群由于驱逐或者其它原因,导致集群在一段时间内就可能会出现不均衡的状态,这就需要人为或者借助工具去调度pod促使集群达到一个平衡的状态;
概念:
DeScheduler 是Kubernetes 原生社区 实现的一个基于 node 真实负载进行重调度的插件。在kubernetes集群中安装该插件后,该插件会和 Kube-scheduler 协同生效,实时监控集群中高负载节点并驱逐低优先级 Pod,该插件依赖 Prometheus 监控组件以及相关规则配置;
Descheduler 的策略是可配置的,包括可以启用或禁用的策略。默认情况下,所有策略均已启用。
nodeSelector:
evictLocalStoragePods:
ignorePvcPods:
maxNoOfPodsToEvictPerNode:
maxNoOfPodsToEvictPerNamespace:
evictFailedBarePods:
apiVersion: "descheduler/v1alpha1"
kind: "DeschedulerPolicy"
nodeSelector: prod=dev
evictFailedBarePods: false
evictLocalStoragePods: true
evictSystemCriticalPods: true
maxNoOfPodsToEvictPerNode: 40
ignorePvcPods: false
strategies:
...
策略举例:
apiVersion: "descheduler/v1alpha1"
kind: "DeschedulerPolicy"
strategies:
"LowNodeUtilization":
enabled: true
params:
nodeResourceUtilizationThresholds:
thresholds:
"cpu" : 20
"memory": 20
"pods": 20
targetThresholds:
"cpu" : 50
"memory": 50
"pods": 50
apiVersion: "descheduler/v1alpha1"
kind: "DeschedulerPolicy"
strategies:
"RemoveDuplicates":
enabled: true
"RemovePodsViolatingInterPodAntiAffinity":
enabled: true
"LowNodeUtilization":
enabled: true
params:
nodeResourceUtilizationThresholds:
thresholds:
"cpu" : 20
"memory": 20
"pods": 20
targetThresholds:
"cpu" : 50
"memory": 50
"pods": 5
节点资源消耗由 Pod 的请求和限制决定,而不是实际使用量。选择这种方法是为了保持与 kube-scheduler 的一致性,kube-scheduler 遵循将 pod 调度到节点上的相同设计。这意味着 Kubelet(或类似命令kubectl top)报告的资源使用情况可能与计算的消耗不同,因为这些组件报告了实际使用指标。descheduler 是通过合计 Node 上 Pod 的 Request 值来计算使用情况的,故这种方式可能并不太适合真实场景。如果能直接拿 metrics-server 或者 Prometheus 中的数据,会更有意义,因为很多情况下 Request、Limit 设置都不准确;
浙公网安备 33010602011771号