云成本优化 之 基于zabbix插件的VM费用优化
云成本优化指南
—基于Zabbix插件的VM费用优化
目前大部分公司开始学习以及使用K8S来上线和发布自己的业务,但是目前还有很多公司还是继续在使用虚拟化的模式来部署业务,在使用虚拟机的方式一样会有资源浪费的问题,尤其是在云上,每增加一些计算或者内存就会增加很多成本,经过使用中会发现其实业务使用不到这么多资源,空闲的资源就被浪费了,需要根据实际情况来调整资源大小,今天就给大家带来一个云成本优化的小技巧,基于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,sys
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from 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 -l
0 2 * * 1 source ~/.bashrc && /usr/bin/python /usr/local/reports/auto_report.py
0 3 1 * * source ~/.bashrc && /usr/bin/python /usr/local/reports/Monthly-report.py
注:建议数据不要小于周单位,最好以月度为单位
导出报告举例:
数据分析
导出数据后,我们就可以根据导出的数据进行资源分析,那些是资源浪费的,是可以进行资源调整已达到资源合理使用的,例如导出数据中的10130这种,最大的资源利用率才8%左右,那些是平时利用率很低,但是有几天(例如月底导入数据或合账)利用率很高的,例如10122这种,最大使用98%左右,平均值不到1%,这种可能就需要看实际情况是否适合资源调整了。
总得来说,目前公有云的监控已经很完善了,但是可能有些用户会涉及到多云或者混合云的方式,这样选用统一监控是一个必然的选择,Zabbix作为老牌的监控系统,针对VM级别的监控还是很给力的,结合Zabbix自带的一些API进行二次开发可以完成被监控资源的全局利用率的展示,通过一些数据报表的展示,找出资源利用率低的资源,通过适当的调配,达到资源合理分配从而降低成本的目的,选用公有云自带的监控也会提供相关的API,经过二次开发也能达到相同的目的,但是这种方式也会有一些局限性,就是根据自己设定的数据区间会有一定的延时性,不能马上发现。
成本可以优化,而不是消灭成本,
怎么合理使用资源,才是最终目的。
鸣谢:感谢百度-王斌开发的Zabbix插件,个人主页如下:
https://github.com/meetbill
扫描二维码
获取更多精彩
FinOps中国