基于Prometheus,Alermanager实现Kubernetes自动伸缩

到目前为止Kubernetes对基于cpu使用率的水平pod自动伸缩支持比较良好,但 根据自定义metrics的HPA支持并不完善,并且使用起来也不方便。

下面介绍一个基于Prometheus和Alertmanager实现Kubernetes Pod 自动伸缩的方案,该方案支持任意自定义metrics。思路比较简单:由Prometheus负责收集需要的性能指标(如:当前链接的并发数,当前cpu的使用率等),根据定义好的告警规则生成告警事件,然后将告警事件传递给Alertmanager,由alertmanager触发webhook来实现最终的pod伸缩功能,如下图所示:


Prometheus中Alert rules的配置示例:

 ALERT HpaTrigger
 IF app_active_task_count > 30
 FOR 30m 
 LABELS {serverity = "page",trigger="hpa",action = "scale-out",value = "{{$value}}", deployment="test", namespace = "{{$labels.namespace}}"}
 ANNOTATIONS {
 summary = "Instance {{$labels.namespace}}: scale-out",
 description = "{{$labels.namespace}} auto scale-out"
 }

上述规则表示应用的活动任务数持续30分钟都大于30的话,就需要创建新的pod以应对过多的任务数。但此处并不会直接触发水平Pod自动伸缩功能,prometheus根据告警规则只会生成一个告警事件,并将该事件传递给alertmanager,由alertmanager决定如何处理该告警。

Alertmanager配置示例:

 global:
 route:
 receiver: 'email' #全局配置,默认将收到的告警事件路由给email接收器
 group_wait: 30s
 group_interval: 5m
 repeat_interval: 4h
 routes:
 - receiver: 'auto-hpa' #将trigger=hpa的告警路由给auto-hpa
 match:
 trigger: hpa
 receivers:
 - name: 'email'
 email_configs:
 - to: [email protected]
 from: [email protected]
 smarthost: smtpserver:port
 auth_username: "username"
 auth_identity: "username"
 auth_password: "password"
 require_tls: true 
 - name: "auto-hpa"
 webhook_configs:
 - url: 'http://YOUR_WEBHOOK_IP:PORT/hpa' #自定义webhook url地址。
 send_resolved: true

Alertmanager接受到相应的告警之后,会将获取到的具体metics值(此处metric name为app_active_task_count)和在告警规则中定义的LABELS信息合并为一个json数据,以POST方式发送给我我们定义好的webhook url。

webhook Python脚本示例:

from flask import Flask,request
import json

app = Flask(__name__)

@app.route("/hpa",methods=["POST"]) def hpa():
 content = request.get_json()
 #分析content字段,提取相关数据,调用k8s api实现水平pod自动伸缩的功能
 #.......
 #....... print content

if __name__ == "__main__":
 app.run("0.0.0.0")

这里我省略了具体调用k8s api实现pod伸缩的逻辑。Alertmanager将所有的信息以json格式post给我们自定义的脚本了,具体怎么处理,就看业务需求了。

本文转自开源中国-基于Prometheus,Alermanager实现Kubernetes自动伸缩

更多相关推荐

阿里云容器服务Kubernetes 基于G...

基于GPU的指标扩缩容在深度学习训练中,训练完成的模型,通过Serving服务提供模型服务。本文介...

继续阅读

解决 Prometheus 不能获取 Kuber...

背景接上一篇快速搭建WindowsKubernetes,我们发现原来在WindowsKubernetes会有一些与在Linux上...

继续阅读

使用Django,Prometheus,和Kube...

作者:BobbySteinbach编者按本文强调了应用程序定制指标的重要性,用代码实例演示了如何设计指...

继续阅读

基于Python+Django的Kubernetes...

➠更多技术干货请戳:听云博客时至今日,接触kubernetes也有一段时间了,而我们的大部分业务也...

继续阅读

...

OpenAPI让API提供者可以定义自己的操作和模型,并让开发者可以自动化的生成喜欢语言的客户端,...

继续阅读

基于json文件实现的gearman任务...

一:在gearman任务失败后,调用task_failed二:打印失败信息后,调用check_frequency检查任务5...

继续阅读

基于Prometheus的Pushgateway实...

基于Prometheus的Pushgateway实战一、Pushgateway简介Pushgateway 是Prometheus生态中一个重要...

继续阅读

使用 ESS SDK 快速创建多可用区...

ESS伸缩组分为经典网络伸缩组、专有网络伸缩组,当您在创建专有网络伸缩组的时候,需要配置伸...

继续阅读

kubernetes + harbor的webhooks...

这是一个实验阶段的片段大致思路是:测试团队完成测试后的镜像,被push到线上系统的harbor镜像...

继续阅读

用 Ansible 实现基于 OpenShift...

《OpenShift4.xHOL教程汇总》文章目录Ansible的Kubernetes模块Ansible访问OpenShift或Kubernet...

继续阅读