作为一只有很多服务器的萌新,实时掌握服务器的状态是非常必须的。
前段时间,由于NodeQuery出问题了,于是就想着换一个监控平台。当然在移除nq-agent的时候就手抖给/etc删除了。
那么今天就来记录一下如何搭建一个中心化的监控平台。
一些概念的明确
既然要监控服务器,那么必然要有一个程序运行在服务器上,这个我们一般称作agent,在我们这里就是telegraf;另外一个负责解析,存储,展示数据的,在我们这里就是InfluxDB存储,grafana展示解析数据。
如果使用zabbix的话,那么zabbix-agent就充当了采集器,zabbix-server和zabbix-frontend就充当了解析展示数据的。(zabbix太丑了,模板不会配……)
架构的设计
由于需要监控多台服务器,那么架构的设计也是一个问题,对于需要跨公网而不是全内网的情况来说,有这样两种思路:
- 被动模式:采集器收集数据,发送给server,这种架构要求server必须有公网IP
- 主动模式:采集器只是运行,由server主动访问采集器获得数据,这就需要所有的agent必须有公网IP
对于被动模式,使用Telegraf+InfluxDB+Grafana是比较好的选择,只需要将InfluxDB部署在具有公网IP的服务器上就可以了,其他服务器是否具有公网IP并不重要。
对于主动模式,使用node exporter+Prometheus+Grafana是比较合适的。
对于两种都想要的呢!zabbix啊,主动被动都支持,就是有点丑(′д` )…彡…彡
所以总体的架构就是:
Telegraf --> InfluxDB <--> Grafana
安全性的考虑
由于数据需要跨公网传输,那么安全性上的考虑就是必不可少的了。那么这个问题怎么解决呢?
加密,认证,授权
在我们这种情景下,与InfluxDB之间的通信至少也要实现加密、认证的。
加密意味着与InfluxDB之间的通信是安全的,其他人无法解密,这一点在跨公网传输的时候是必不可少的;
认证意味着只有特定身份的用户才可以访问数据,比如输入了正确的用户名和密码才可以访问;
授权意味着,你这个用户可以干什么事情,是只能查询还是什么都能干。
为了实现加密,我们可以使用TLS那一套,这一点就很好理解了,TLS就是天生干这事的嘛。
为了实现认证与授权,我们可以使用HTTP Basic Auth,创建一套用户名密码。
防火墙的保护
除了以上操作之外,使用防火墙限制访问数据库的源IP也是一种补充方法。当然了加密是必不可少的。除此之外,还有一些方法,比如TLS客户端证书等等。
大内网
有些时候配置上面这些太麻烦了,那么还有一个思路就是组建大内网!可以考虑用WireGuard、OpenVPN甚至是SSH隧道试试看。
不过也有缺点,一是如果服务器是海外的,那么由于GFW的存在,可能有点不太友好;二是可能不太好配,尤其是OpenVPN,一不小心就全局了。
部署与配置
下面就简单说说如何安全的配置这么一套平台
InfluxDB
https://portal.influxdata.com/downloads/
从页面上选择适合你的操作系统的版本,对于我使用的Ubuntu来说,使用这个就可以了
wget https://dl.influxdata.com/influxdb/releases/influxdb_1.7.7_amd64.deb sudo dpkg -i influxdb_1.7.7_amd64.deb
配置SSL
这一步我们可以使用openssl自签名的证书,也可以使用Let’s Encrypt申请一个真正的证书(这就需要弄个域名啦)
以自签名证书来说
sudo openssl req -x509 -nodes -newkey rsa:2048 -keyout /etc/ssl/influxdb-selfsigned.key -out /etc/ssl/influxdb-selfsigned.crt -days 3650 chown influxdb:influxdb /etc/ssl/influxdb-selfsigned.*
修改配置文件 /etc/influxdb/influxdb.conf
,需要更改三处
https-enabled = true https-certificate = "/etc/ssl/influxdb-selfsigned.crt" https-private-key = "/etc/ssl/influxdb-selfsigned.key"
如果使用Let’s Encrypt的话,https-certificate
改为fullchain.pem
的路径,https-private-key
改为privkey.key
的路径,注意下权限就可以了。
然后重启
sudo systemctl restart influxdb
验证
influx -ssl -unsafeSsl -host <domain_name>.com
配置认证与授权
创建一个管理员用户
使用上述influx -ssl -unsafeSsl -host <domain_name>.com
登录到服务器
CREATE USER paul WITH PASSWORD 'timeseries4days' WITH ALL PRIVILEGES
开启认证
修改配置文件/etc/influxdb/influxdb.conf
auth-enabled = true
重启进程
sudo systemctl restart influxdb
此时再使用influx -ssl -unsafeSsl -host <domain_name>.com
登录到服务器,show databases
就会报错,只有auth之后才可以
Telegraf
https://github.com/influxdata/telegraf/releases
https://portal.influxdata.com/downloads/
从以上网址下载对应你的操作系统版本的Telegraf,然后安装(armhf对应树莓派)
配置数据库服务器
编辑/etc/telegraf/telegraf.conf
,找到urls=...,改成https就好了
urls = ["https://<domain_name>.com:8086"] database = "telegraf"
需要注意的是,如果使用的是自签名证书,那么insecure_skip_verify = true
也要配置
配置认证
编辑/etc/telegraf/telegraf.conf
根据上面配置的进行适当更改
timeout = "5s" username = "telegraf" #? password = "metricsmetricsmetricsmetrics" #?
配置采集内容
把这些追加到telegraf.conf末尾就可以了
[[inputs.cpu]] percpu = true totalcpu = true collect_cpu_time = false report_active = false [[inputs.disk]] ignore_fs = ["tmpfs", "devtmpfs", "devfs"] [[inputs.io]] [[inputs.mem]] [[inputs.net]] [[inputs.system]] [[inputs.swap]] [[inputs.netstat]] [[inputs.processes]] [[inputs.kernel]]
Grafana
https://grafana.com/grafana/download
同样下载安装适合自己平台的程序
然后http://ip:3000
默认的用户名密码是admin、admin
Add datasource选择influxdb,按照如下图所示配置
导入dashboard
导入这个dashboard
https://grafana.com/dashboards/5955
之后保存就可以看到结果啦!
其他优化
配置防火墙
只允许某个IP访问8086
ufw allow from xx.xx.xx.xx to any port 8086
参考资料
https://docs.influxdata.com/influxdb/v1.7/administration/https_setup/
https://docs.influxdata.com/influxdb/v1.7/administration/authentication_and_authorization/
https://grafana.com/dashboards/5955
https://www.jianshu.com/p/dfd329d30891
https://grafana.com/docs/installation/behind_proxy/