AWS EC2监控

一、项目背景

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-1
图6-1
图7-2
图6-2

     

图7-3
图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提供的邮件服务功能,发送邮件告警。

Python监控程序工程目录结构
Eclipse PyDev插件创建的工程目录结构

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='<html><body><h1><font color=\'red\'> %s </font></h1></body></html>' %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)

看到上面日志,代表定时任务配置成功。以上监控程序成功部署。

猜你喜欢

转载自blog.csdn.net/QFYJ_TL/article/details/82760276