K8S调度不平衡问题分析过程和解决方案

ops/2024/10/22 8:31:05/

不平衡问题排查

问题描述
1、业务部署大量pod(据反馈,基本为任务型进程)过程中,k8s node内存使用率表现不均衡,范围从80%到百分之几;
2、单个node内存使用率超过95%,仍未发生pod驱逐,存在node不可正常运维风险;
期望效果
尽量保持pod调度平衡;
node内存使用率达到一定阈值,开始触发pod驱逐

分析过程

原理依据

K8S调度涉及到亲和性、资源可用情况等因素,而本案例是可调度但是调度后造成节点内存使用率差距很大,也即pod分布(基于内存使用率)不平衡;
Kube-Scheduler作为控制面节点接触,负责pod如何绑定到node的逻辑执行,一般默认为default-scheduler,且支持插件化配置和开发;
Kubelet作为K8S Node Agent,实际执行着创建、销毁以及驱逐pod的逻辑,其中驱逐分为软驱逐和硬驱逐,参数名为

--evited-hard=memory.available<100Mi 
--evited-soft=memory.available<100Mi

其中memory.available设置了触发驱逐的阈值,也即大于等于此阈值则在当前node发生pod驱逐

案例分析

Pod分布不平衡(按内存使用率)

内存使用率范围(0%,85%),监控如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

驱逐

未明确设定驱逐参数,如下图:
在这里插入图片描述

改进方案

Pod分布不平衡(按内存使用率)

由第二章分析可知,目前集群使用的调度器是default-scheduler,而该调度器不会直接监控节点的内存使用率,因此需要将节点的内存使用率加入调度逻辑(一般是算分阶段,进而影响最终排序),考虑到改动时间成本等因素(可参考第五章使用第三方调度等,单改动较大,风险也大),可以指定scheduler启动配置文件如下:

cat KubeSchedulerConfiguration.yamlapiVersion: kubescheduler.config.k8s.io/v1beta2
kind: KubeSchedulerConfiguration
profiles:- schedulerName: default-schedulerplugins:score:enabled:- name: PodTopologySpread- name: NodeResourcesFitpluginConfig:- args:scoringStrategy:resources:- name: cpuweight: 1- name: memoryweight: 10type: LeastAllocatedname: NodeResourcesFit- name: PodTopologySpreadargs:defaultingType: "List"defaultConstraints:- maxSkew: 1topologyKey: kubernetes.io/hostnamewhenUnsatisfiable: ScheduleAnywaymemoryWeight: 5  # 设置 memory 权重为 5,表示内存使用更重要

参数形如: --config=/path/to/ KubeSchedulerConfiguration.yaml
启动形如:kube-scheduler --config=/path/to/ KubeSchedulerConfiguration.yaml <...其他参数>
效果:
在这里插入图片描述

驱逐

前提:需要安装集群monitor
根据分析过程分析可知,kubelet未指定驱逐参数,此时kubelet会以memory.available<100Mi 运行,而node节点的内存范围为[376G,750G],默认驱逐值明显不适用,因此建议设置合理值,目前推荐如下:

 --evited-hard=memory.available<40G --evited-soft=memory.available<50G

或者按如下kubelet配置:
在这里插入图片描述
效果如下:
在这里插入图片描述

建议

此问题反映出资源分配和调度的问题,涉及范围较为综合,运维侧提供了较为稳定的iaas平台环境,很多场景可以保证资源的使用率,此时从资源充分使用角度落地方案;当节点数固定时,提出了资源使用平衡,则调度器需要较为实时感知到资源使用情况(此案例为内存使用率),以选择适合的节点进行绑定调度。

参考

案例参考:https://segmentfault.com/a/1190000042005893
其他组件:
Trimaran 官网地址:https://github.com/kubernetes-sigs/scheduler-plugins/tree/master/pkg/trimaran
descheduler 官网地址:https://github.com/kubernetes-sigs/descheduler


http://www.ppmy.cn/ops/127517.html

相关文章

springboot接口Get请求实体类入参

在springboot中&#xff0c;对HTTP GET请求&#xff0c;通常不会将请求体&#xff08;body&#xff09;作为主要的数据传输方式&#xff0c;因为GET请求通常用于请求数据&#xff0c;而不是发送数据到服务器&#xff08;尽管从技术上讲&#xff0c;GET请求可以包含请求体&#…

生成文件夹 - python 实现

生成文件夹保存图片和文本等信息。 代码具体实现如下&#xff1a; #-*-coding:utf-8-*- # date:2021-04-13 # Author: DataBall - XIAN # Function: 生成文件夹import os if __name__ "__main__":path "./dataset"if not os.path.exists(path): # 如果…

SCR相对标准偏差、氨氮比、截面速度,多平面计算

SCR截面速度、氨氮比等标准及相对标准偏差计算。 程序用来处理fluent通过xyplot导出的数据&#xff0c;导出可以选择多个平面&#xff0c;可计算标准偏差SD、相对标准偏差RSD&#xff0c;平均速度,适用于求解多个平面 # -*- coding: utf-8 -*- """ Created on …

无人机:无线电波控制技术!

一、无线电波控制技术 通过无线电波与无人机上的接收机进行通信。当飞手在遥控器上操作控制杆时&#xff0c;这些动作会被转换为无线电波信号&#xff0c;并发送给无人机上的接收机。接收机接收到信号后&#xff0c;会解读控制杆的位移&#xff0c;并将其转化为数字信号&#…

S7--环境搭建基本操作

1.修改蓝牙名称和地址 工程路径:$ADK_ROOT\adk\src\filesystems\CDA2\factory_default_config\ 在subsys7_config5.htf中 DeviceName = "DEVICE_NAME“ # replace with your device name BD_ADDRESS=[00 FF 00 5B 02 00] # replace with your BD address 2.earbud工程修改…

音视频:安防监控

文章目录 一、安防系统二、视频监控系统的组成三、相关机制1.看门狗进程2.心跳保活机制 四、相关协议和工具库1.FFmpeg2.RTSP3.WebRTC4.其他(1)OpenCV(2)Telnet 五、视频接口1.DVI2.VGA3.DP4.HDMI 一、安防系统 安防系统主要包括&#xff1a;视频监控系统、入侵报警系统、出入…

C++ | Leetcode C++题解之第498题对角线遍历

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> findDiagonalOrder(vector<vector<int>>& mat) {int m mat.size();int n mat[0].size();vector<int> res;for (int i 0; i < m n - 1; i) {if (i % 2) {int x i …

iOS 大数相加

大数相加的技术点在于进位(两数相加大于10之后进位) 思路如下: 1.从右往左便利,依次去除两个数M和N的个位数、十位数、百位数~~~相加 2.如果M遍历完了,N还没完,那么M用0作为位数上的加数: 代码如下: - (void)bigNumAdd:(NSMutableArray *)arrayA ArrayB:(NSMutableArray *…