Rancher&k8s根据监控指标进行容器调度


前言

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集群的运行更加的稳定了,容器调度不平衡的问题算是基本解决了。希望本文能帮到大家解决容器调度不均衡的问题,欢迎共同探讨。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔希达

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值