前言
k8s的容器调度有一套复杂的判断逻辑来保证其合理性,但根据实际使用经验,如果不对默认的调度进行一定的干预,往往会出现调度不均衡的情况,出现个别节点压力过大的现象,本人在实际工作中就遇到这种情况,最终写了个插件来实现根据监控指标来进行容器调度。
实现思路
用代码通过Prometheus采集各节点监控指标(CPU使用率、内存使用率等),将监控指标写入对应节点的Label,部署容器时通过节点亲和配置来对监控指标进行判断,以此来确保容器不会被调度到高负载的节点上。
本人工作场景是采用Rancher来管理k8s集群,Rancher已经集成了Prometheus,只需开启监控即可。如果直接使用k8s,需要安装好Prometheus并对集群各节点进行监控。
一、获取Prometheus的监控指标
1.1 部署Prometheus
在Rancher集群管理界面顶部菜单栏的【工具->监控】选项中启动监控,启动后可在集群界面看到监控数据。
1.2 配置API
在Rancher平台上,由于Prometheus没有暴露出监控API端口,需要手动配置。
1、首先进入System项目,在服务发现中为cattle-prometheus命名空间添加一条DNS记录。
2、填写参数如下图,映射端口为8080
3、为了在本地能够远程访问Prometheus API,需要配置一个负载均衡,通过域名访问;或者在上个步骤中将服务类型改成NodePort,然后通过主机IP+端口方式访问。
以下以http://prometheus.xxx.cn作为Prometheus API访问入口的示例。
1.2 访问监控接口
1、内存使用率
-
访问地址及参数
http://prometheus.xxx.cn/api/v1/query?query=(1-sum(node_memory_MemAvailable_bytes{node="node1"})/sum(node_memory_MemTotal_bytes{node="node1"}))*100
其中node1为节点名称
-
响应内容
{"status":"success","data":{"resultType":"vector","result":[{"metric":{},"value":[1658904252.442,"58.612902871333915"]}]}}
value中的58.612902871333915就是内存使用率
2、CPU使用率
-
访问地址及参数
http://prometheus.xxx.cn/api/v1/query?query=100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle",node="node1"}[5m])) * 100)
-
响应内容
{"status":"success","data":{"resultType":"vector","result":[{"metric":{"instance":"192.168.0.71:9796"},"value":[1658904957.78,"9.450000000651926"]}]}}
value中的9.450000000651926就是CPU使用率
二、将监控指标添加到节点Label
本人利用Kubernetes官方Java客户端client-java这个包,来实现对k8s集群的操作,为各节点添加Label。添加Label后可在Rancher后台看到各节点已加上了monitor-mem和monitor-ts的标签,或者可以通过kubectl查看节点label。
monitor-mem代表内存使用率,monitor-ts代表监控指标的更新时间(为了方便肉眼判断label数据的时效所以加了这个),每分钟会采集一次指标并更新Label。此处只处理了内存使用率的Label,因为在我的工作场景下,内存使用率是主要影响。
三、配置节点亲和
节点配置好label之后,通过配置工作负载的调度规则,可使容器优先部署在低负载的节点上。
1、通过yaml配置
在yaml文件中添加affinity标签内容,如下示例:
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: monitor-mem
operator: Lt
values:
- "80"
weight: 100
matchExpressions标签内容为匹配规则,以上配置表示优先匹配monitor-mem<80的节点。
2、在Rancher界面上配置
进入要配置的工作负载编辑界面,在主机调度中选择【每个 Pod 自动匹配主机】,在首选中添加规则monitor-mem<80,如下图:
总结
经过以上一些列处理,k8s集群的运行更加的稳定了,容器调度不平衡的问题算是基本解决了。希望本文能帮到大家解决容器调度不均衡的问题,欢迎共同探讨。