一、项目背景
1、项目背景
由于项目采用微服架构,从云服务定制化程度来看,利用AWS提供的基础性架构EC2比较合适。AWS自带了CloudWatch具有监听EC2功能,但是出现宕机或者达到预警阀值,需要提供发邮件或短信报警功能,需要购买CloudWatch收费项目。项目采用Docker Swarm架构,曾经自己搭建过通过Haproxy+Keepalived方式,通过反向代理来实现负载均衡功能。实际测试,发现在AWS VPC环境下,跟利用AWS ELB负载均衡器,网络吞吐量相比,AWS ELB性能更优。所以用AWS ELB作为微服的负载均衡器。
服务虽然部署了,对服务的监控也很重要,对Docker Swarm管理,可以利用portainer管理工具。具体怎么安装使用参照其官网安装说明:https://portainer.io/install.html。
对Docker Swarm服务监控,可以采用swarmprom。swarmprom利用Grafana开源版本制作的Docker镜像,能够实现Docker Swarm集群机器大部分功能。如节点CPU,内存,IOPS,容器内存占用使用情况等。
但是,swarmprom并没有提供针对单个节点,挂载的磁盘使用空间情况的监控。所以针对这种情况,自己写了一个Python脚本程序来监控每个节点,挂载的磁盘使用空间情况,挂载的磁盘超过设定的阀值,就会发送告警邮件通知。
二、Docker Swarm集群节点服务监控
1、安装swarmprom
$ git clone https://github.com/stefanprodan/swarmprom.git
2、配置通过Email发送告警信息
$ vi docker-compose.yml
在第60行左右,配置SMTP邮件信息,具体修改grafana服务参照如下:
grafana:
image: stefanprodan/swarmprom-grafana:5.0.1
networks:
- net
environment:
- GF_SECURITY_ADMIN_USER=${ADMIN_USER:-admin}
- GF_SECURITY_ADMIN_PASSWORD=${ADMIN_PASSWORD:-admin}
- GF_USERS_ALLOW_SIGN_UP=false
#- GF_SERVER_ROOT_URL=${GF_SERVER_ROOT_URL:-localhost}
- GF_SMTP_ENABLED=${GF_SMTP_ENABLED:-false}
- GF_SMTP_FROM_ADDRESS=${GF_SMTP_FROM_ADDRESS:[email protected]}
- GF_SMTP_FROM_NAME=${GF_SMTP_FROM_NAME:-Grafana}
- GF_SMTP_HOST=${GF_SMTP_HOST:-smtp:25}
- GF_SMTP_USER=${GF_SMTP_USER}
- GF_SMTP_PASSWORD=${GF_SMTP_PASSWORD}
volumes:
- grafana:/var/lib/grafana
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
resources:
limits:
memory: 128M
reservations:
memory: 64M
3、编辑swarm.sh脚本
$ vi swarmprom.sh
我这里配置的是GMail邮箱,具体修改内容如下:
$ cat swarmprom.sh
#!/bin/bash
ADMIN_USER=abcMonitor123
ADMIN_PASSWORD=abc123Monitor
SLACK_URL=https://hooks.slack.com/services/TOKEN \
SLACK_CHANNEL=bosma-devops-alerts \
SLACK_USER=bosma-alertmanager \
GF_SMTP_ENABLED=true \
GF_SMTP_FROM_NAME=Monitor \
[email protected] \
GF_SMTP_HOST=smtp.gmail.com:587 \
[email protected] \
GF_SMTP_PASSWORD=xxxx \
docker stack deploy -c docker-compose.yml mon
4、配置安全组
在AWS安全组里面,添加访问端口9090-9093
5、访问swarmpro
浏览器访问:http://212.236.11.X:9000
第一次登录输入用户名admin 密码:admin,由于对外访问,为了安全起见新建一个安全级别高的用户名和密码,如下图所示:
6、添加内存使用率监控
如图6-1,点击添加图表,添加图表,在Metric输入:100 - sum(((node_memory_MemFree + node_memory_Cached + node_memory_Buffers ) / node_memory_MemTotal) * on(instance) group_left(node_name) node_meta * 100) by (node_name)
,Legend format填入{{node_name}} ,如图6-2所示。
添加告警,点击Alert标签页,创建Alert,如图6-3所示。
7、添加CPU使用率监控图
同上操作,创建一个CPU使用率监控图表,也可以在原理CPU监控的图的基础上修改成CPU使用率监控图。只要修改Metric内容即可。Metric内容如下:
sum(irate(container_cpu_usage_seconds_total{container_label_com_docker_swarm_node_id=~".+", id=~"/docker/.*"}[1m])) by (container_label_com_docker_swarm_service_name) * 100
同理创建一个Alert告警,跟上面内存使用率监控创建过程一样。
三、EC2实例挂载磁盘使用空间监控
在项目背景已经介绍过,由于Granafa没有针对单个EC2实例挂载磁盘空间的监控,所以决定通过Centos的定时任务,定时执行脚本文件。由于Python作为监控脚本更灵活更具有优势,这里我采用Python脚本来监控挂载磁盘的使用空间。
1、安装Python相关环境
在AWS EC2 Centos7.0系统上面,默认预装了Python脚本,Python版本是2.7版本,这里我就利用Python2.7作为运行脚本运行环境。
安装pip:wget https://bootstrap.pypa.io/get-pip.py -O - | python
2、安装监控程序依赖库
这里主要利用psutil开源库,来监测磁盘空间使用率,psutil库强大,还能支持监控内存,CPU,负载等信息。
sudo yum install -y gcc python-devel python-pip
pip install psutil
3、编写Python脚本
利用Eclipse Pydev Project 插件开发Python项目。如下图所示,这里主要创建Mail.py用于封装发送邮件功能,Main.py用于监控磁盘空间,发现磁盘空间使用率达到预警阀值,调用Mail.py提供的邮件服务功能,发送邮件告警。
4、编写发邮件服务类Mail.py
代码如下:
# -*- coding: UTF-8 -*-
'''
Created on 2018年9月18日
@author: bosma_tl
'''
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
class Mail(object):
def __init__(self,fromAddr,fromPwd,smtpServer,smtpPort):
self.fromAddr=fromAddr
self.fromPwd=fromPwd
self.smtpServer=smtpServer
self.smtpPort=smtpPort
def sendEmail(self,title,content,toAddr=[]):
sContent=' %s
' %content
msg=MIMEText(sContent,'html','utf-8')
msg['From'] = _format_addr('%s <%s>' % (title.encode('utf-8'),self.fromAddr))
msg['To'] = _format_addr('管理员 <%s>' % toAddr)
msg['Subject'] = Header(title, 'utf-8').encode()
server = smtplib.SMTP(self.smtpServer, self.smtpPort)
server.set_debuglevel(0)
server.login(self.fromAddr, self.fromPwd)
try:
server.sendmail(self.fromAddr, toAddr, msg.as_string())
return True
except OSError as e:
print('except:', e)
return False
finally:
server.quit()
5、编写监控程序类Main.py
代码如下:
# -*- coding: UTF-8 -*-
'''
Created on 2018年9月17日
监控磁盘空间
@author: bosma_tl
'''
#pyton2.7 打开下面三行注释,解决运行中文编码问题
#import sys
#reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入
#sys.setdefaultencoding('utf-8')
import psutil
import os
from monitor.Mail import Mail
DISK_USAGE_PERCERNT=70
SMTP_SERVER='smtp.gmail.com'
SMTP_SERVER_PROT=587
SMTP_SERVER_USERNAME='[email protected]'
SMTP_SERVER_PASSWORD='******abc'
SMTP_SERVER_TO=['[email protected]','[email protected]','[email protected]']
def disk_monitor():
hostname=os.environ.get('HOSTNAME', '-1')
if hostname=='-1':
import socket
hostname=socket.gethostname()
print('Start monitor machine:%s disk usage...' % hostname)
global DISK_USAGE_PERCERNT
disks=psutil.disk_partitions()
for i in range(len(disks)):
mountPoint=disks[i].mountpoint
rate=psutil.disk_usage(mountPoint).percent
tmpStr='Scaning device[%s] mountPoint[%s],current used %s%%.' %(disks[i].device,mountPoint,rate)
print(tmpStr)
print
if rate > DISK_USAGE_PERCERNT :
content='******device[%s] mountPoint[%s] has exceed %s%% ,current used %s%%******' %(disks[i].device,mountPoint,DISK_USAGE_PERCERNT,rate)
print(content)
mail=Mail(SMTP_SERVER_USERNAME,SMTP_SERVER_PASSWORD,SMTP_SERVER,SMTP_SERVER_PROT)
title='主机:'+hostname+'磁盘空间使用率告警'
result=mail.sendEmail(title, content,SMTP_SERVER_TO)
if result :
print('Send monitor result successfully!')
else:
print('Send monitor result faild!,please check stmp server addr!')
print('End moinotr machine:%s' % hostname)
disk_monitor()
6、打包上传代码到EC2上。
tar -cvf monitor.tar.gz -C monitor
scp -i ~/aws.pem monitor.tar.gz centos@xxxx:/home/centos
7、安装监控程序
$ mkdir -p /home/centos/scripts
$ cd /home/centos/scripts
$ mv /home/centos/monitor.tar.gz .
$ tar -xvf monitor.tar.gz
$ cd monitor/src
$ vi Main.py
由于我的EC2上的Pyton环境是2.7的版本,发送邮件内容为中文的时候,会有编码问题,所以需要把Main.py注释部分打开,如下几句代码,打开注释:
#import sys
#reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入
#sys.setdefaultencoding('utf-8')
8、设置监控阀值和邮件相关配置。
$ vi Main.py
DISK_USAGE_PERCERNT=70 #监控阀值,70%
SMTP_SERVER='smtp.gmail.com' #SMTP邮件发送服务器
SMTP_SERVER_PROT=587 #SMTP发送端口
SMTP_SERVER_USERNAME='register@gmail.com' # 发送的邮件用户名
SMTP_SERVER_PASSWORD='****abc' # 发送邮件的用户密码
SMTP_SERVER_TO=['[email protected]','[email protected],'[email protected]'] #待接收邮件的用户列表
9、测试运行程序
看到下面执行结果,代表监控程序成功部署。
$ python Main.py
Start monitor machine:master disk usage...
Scaning mountPoint[/],current used 12.9%.
Scaning mountPoint[/app],current used 44.1%.
End moinotr machine:master
9、配置定时执行脚本
$ crontab -e
$ */5 * * * * /usr/bin/python /home/centos/scripts/monitor/src/Main.py
$ crontab -l
*/5 * * * * /usr/bin/python /home/centos/scripts/monitor/src/Main.py
10、开机启动crontab
systemctl enable crond.service
systemctl start crond.service
查看当前crond运行状态
systemctl status crond.service
11、查看定时任务执行日志
$ tail -f /var/log/cron
Sep 18 12:00:01 master2 CROND[16344]: (root) CMD (/usr/bin/python /home/centos/scripts/monitor/src/Main.py)
Sep 18 12:01:01 master2 CROND[16442]: (root) CMD (run-parts /etc/cron.hourly)
Sep 18 12:01:01 master2 run-parts(/etc/cron.hourly)[16442]: starting 0anacron
Sep 18 12:01:01 master2 run-parts(/etc/cron.hourly)[16451]: finished 0anacron
Sep 18 12:05:01 master2 CROND[16812]: (root) CMD (/usr/bin/python /home/centos/scripts/monitor/src/Main.py)
看到上面日志,代表定时任务配置成功。以上监控程序成功部署。