vlambda博客
学习文章列表

云成本优化 之 基于zabbix插件的VM费用优化


        云成本优化指南        

云成本优化 之 基于zabbix插件的VM费用优化

—基于Zabbix插件的VM费用优化

云成本优化 之 基于zabbix插件的VM费用优化


云成本优化 之 基于zabbix插件的VM费用优化

目前大部分公司开始学习以及使用K8S来上线和发布自己的业务,但是目前还有很多公司还是继续在使用虚拟化的模式来部署业务,在使用虚拟机的方式一样会有资源浪费的问题,尤其是在云上,每增加一些计算或者内存就会增加很多成本,经过使用中会发现其实业务使用不到这么多资源,空闲的资源就被浪费了,需要根据实际情况来调整资源大小,今天就给大家带来一个云成本优化的小技巧,基于Zabbix插件的VM费用优化。

云成本优化 之 基于zabbix插件的VM费用优化


获取计算资源使用情况最简单的方法就是使用监控数据,Zabbix作为老牌监控系统,可以在IDC中使用,同样可以在云上使用,只需要在云上单独部署一个虚拟机就可以了,目前Zabbix已经更新到了6的版本,原生支持高可用等功能,同样具备完善的API功能,可以方便的进行二次开发,Zabbix默认不支持定制化监控数据导出功能,我们可以自己根据Zabbix的API进行定制开发,目前已经有大神已经开发完成,我们只需要安装使用即可,本次内容以zabbix_manager举例。


大概实现方式为脚本定期发送月度资源使用情况,主要包含CPU利用率、内存利用率、磁盘利用率,数据中包含资源的最小利用率平均利用率、最大利用率,我们可根据导出的数据进行图形数据定制,也可以直接根据数据进行分析,我们查看某个资源的平均利用率和最大利用率,假设该资源长时间的最大利用率都没有达到50%或你希望的利用率,那么大概率是存在资源浪费的现象,这种就可以尝试进行资源调整,如果该资源的最大达到很高,但是平均值比较低,我们可以环比以前的数据查看是否为突发问题,或分析使用率很高的那段时间的操作,需要我们根据经验进行分析是否降低资源是否可能影响业务。


  • Zabbix_manager安装配置方式请参考:

https://github.com/meetbill/zabbix_manager/wiki/install

安装完成后我们借助zabbix_manager插件工具进行脚本编写


  • Python脚本如下,可根据实际情况修改:

[root@ZABBIX reports]# cat Monthly-report.py #!/usr/bin/env python# -*- coding: utf-8 -*-# __author__ = "life"
import smtplib,datetime,os,sysfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.mime.application import MIMEApplicationfrom email.header import Header
date_range=()
def get_date_range(): last_month_date_first = datetime.datetime(datetime.date.today().year,datetime.date.today().month-1,1).strftime("%Y-%m-%d") # print(last_month_date_first) last_month_date_last = datetime.datetime(datetime.date.today().year,datetime.date.today().month,1) - datetime.timedelta(1) last_month_date_last = last_month_date_last.strftime("%Y-%m-%d") # print last_month_date_last return last_month_date_first,last_month_date_last
def gen_report_files(date_range): Start_date = ' \"' + date_range[0] # print Start_date End_date = ' \"' + date_range[1] # print End_date cmd_cpu = 'nohup zabbix_api --report "CPU usage"' + Start_date + " 00:00:00\"" + \ End_date + ' 23:59:00" --xls /usr/local/reports/cpuusage_monthly.xls > /dev/null' # print cmd_cpu os.popen(cmd_cpu) cmd_mem = 'nohup zabbix_api --report "Free Mem %"' + Start_date + " 00:00:00\"" + \ End_date + ' 23:59:00" --xls /usr/local/reports/Freemem_monthly.xls > /dev/null' # print cmd_mem os.popen(cmd_mem) cmd_disk = 'nohup zabbix_api --report "Free disk space on"' + Start_date + " 00:00:00\"" + \ End_date + ' 23:59:00" --xls /usr/local/reports/Freedisk_monthly.xls > /dev/null' print cmd_disk os.popen(cmd_disk)
cmd_icmp = 'nohup zabbix_api --report "ICMP loss"' + Start_date + " 00:00:00\"" + \ End_date + ' 23:59:00" --xls /usr/local/reports/ICMP_monthly.xls > /dev/null' #print cmd_icmp os.popen(cmd_icmp)
def send_mail(): os.chdir('/usr/local/reports/')    smtp_server = "邮箱服务器的SMTP地址" cur_date = datetime.datetime.now().strftime("%Y-%m-%d") # print cur_date subject = "Monthly performance of servers report " + cur_date # print subject Sender = '填写自己的邮箱'    to_receiver = ['发送的第一个邮箱','发送的第二个邮箱','发送的第三个邮箱']    to_CC = ['CC的第一个邮箱','CC的第二个邮箱'] Receiver = to_receiver + to_CC    username = '填写自己的邮箱'    password = '填写自己的密码'
#下面的to\cc\from最好写上,不然只在sendmail中,可以发送成功,但看不到发件人、收件人信息 msgroot = MIMEMultipart('related') msgroot['Subject'] = subject msgroot['To'] = ','.join(to_receiver) msgroot['Cc'] = ','.join(to_CC) msgroot['from'] = Sender
thebody = MIMEText(subject,'plain','utf-8') msgroot.attach(thebody)
xlsxpart = MIMEApplication(open('cpuusage_monthly.xls','rb').read()) xlsxpart.add_header('Content-Disposition', 'attachment', filename='cpuusage_monthly.xls') msgroot.attach(xlsxpart)
xlsxpart = MIMEApplication(open('Freemem_monthly.xls','rb').read()) xlsxpart.add_header('Content-Disposition', 'attachment', filename='Freemem_monthly.xls') msgroot.attach(xlsxpart)
xlsxpart = MIMEApplication(open('Freedisk_monthly.xls','rb').read()) xlsxpart.add_header('Content-Disposition', 'attachment', filename='Freedisk_monthly.xls') msgroot.attach(xlsxpart) xlsxpart = MIMEApplication(open('ICMP_monthly.xls','rb').read()) xlsxpart.add_header('Content-Disposition', 'attachment', filename='Freedisk_monthly.xls') msgroot.attach(xlsxpart)
try: client = smtplib.SMTP() client.connect(smtp_server) client.login(username, password) client.sendmail(Sender, Receiver, msgroot.as_string()) client.quit() print 'Report邮件发送成功!' except smtplib.SMTPRecipientsRefused: print 'Recipient refused' except smtplib.SMTPAuthenticationError: print 'Auth error' except smtplib.SMTPSenderRefused: print 'Sender refused' except smtplib.SMTPException, e: print e.message
if __name__ == '__main__': date_range = get_date_range() # print date_range print 'begin generating reports in /root/reports...' gen_report_files(date_range) send_mail()

注:脚本原理就不过多赘述,本脚本基于python2.7编写


  • 根据自己希望收取数据的时间设置定时任务导出所需数据:

[root@ZABBIX reports]# crontab -l0 2 * * 1 source ~/.bashrc && /usr/bin/python /usr/local/reports/auto_report.py0 3 1 * * source ~/.bashrc && /usr/bin/python  /usr/local/reports/Monthly-report.py

注:建议数据不要小于周单位,最好以月度为单位


  • 导出报告举例:

云成本优化 之 基于zabbix插件的VM费用优化


  • 数据分析

导出数据后,我们就可以根据导出的数据进行资源分析,那些是资源浪费的,是可以进行资源调整已达到资源合理使用的,例如导出数据中的10130这种,最大的资源利用率才8%左右,那些是平时利用率很低,但是有几天(例如月底导入数据或合账)利用率很高的,例如10122这种,最大使用98%左右,平均值不到1%,这种可能就需要看实际情况是否适合资源调整了。


总得来说,目前公有云的监控已经很完善了,但是可能有些用户会涉及到多云或者混合云的方式,这样选用统一监控是一个必然的选择,Zabbix作为老牌的监控系统,针对VM级别的监控还是很给力的,结合Zabbix自带的一些API进行二次开发可以完成被监控资源的全局利用率的展示,通过一些数据报表的展示,找出资源利用率低的资源,通过适当的调配,达到资源合理分配从而降低成本的目的,选用公有云自带的监控也会提供相关的API,经过二次开发也能达到相同的目的,但是这种方式也会有一些局限性,就是根据自己设定的数据区间会有一定的延时性,不能马上发现。


成本可以优化,而不是消灭成本,

怎么合理使用资源,才是最终目的。


鸣谢:感谢百度-王斌开发的Zabbix插件,个人主页如下:

https://github.com/meetbill



扫描二维码

获取更多精彩

FinOps中国