一、前言
众所周知,由于云平台网络架构的安全限制,用户自2020年5月20日之前购买的Elasticsearch集群包括白金版均不能使用 Alert Watcher邮件告警功能。2020年5月20日开始,随着腾讯云平台网络架构的升级优化-------集群双网卡功能的推出,ES集群邮件告警功能也逐步得以实现。
腾讯云ES集群双网卡功能的推出,使得新购的ES集群的节点能直接访问同VPC下的网络,但是不能直接访问同VPC以外的外部网络,如果要实现正常的外部邮件的转发,则必须能访问到对端SMTP邮件服务器,才能实现邮件的发送。因此,本文将通过CVM配置Nginx反向代理的方式实现腾讯云Elasticsearch集群的邮件告警功能。
二、前提条件
- ES集群必须是2020年5月20日以后新购买的白金版集群;
- 腾讯云内部客户通过云梯购买的Elasticsearch集群暂不支持该功能;
三、本次方案拓扑架构、基础条件
ES集群: Elasticsearch 7.10.1 白金版 3个节点 CVM: OS : 7.2 仅具备内网,不能上外网;
CVM: 与ES集群同VPC Nginx 1.14.2 Kibana 7.10.1 具备外网功能;
四、腾讯云Elasticsearch配置邮件告警功能实践
步骤如下:
首先,需要在ES集群的节点配置发送消息邮箱,集群有几个节点,就需要配置多少个节点,这里需要修改elasticserach.yml的配置文件,这里以一台节点为例,配置QQ发送邮箱,配置如下:
代码语言:javascript复制xpack.notification.email.account:
mail_account: # 发件箱配置名称,可以随意指定,但是一定要记住这个,后面需要调用;
profile: standard # 采用默认的邮件模板,如果不是outlook或者gmail,就填这个即可。
email_defaults: # 设置默认发件箱
from: 541180694@qq.com # 发件箱跟下面的user要保持一致。
smtp:
auth: true # 开启账号验证
starttls.enable: true # 开启ssl
host: 10.0.2.47 # smtp地址 //这里写同VPC下的内网的代理服务器的地址
port: 28 # 邮件代理服务器的端口
user: 541180694@qq.com # 用来认证的SMTP服务器的账号,与上面的from账号保持一致。
其次,设置发件箱密码 说明,使用QQ邮箱,163邮箱的话,需要注意,在配置发件箱中使用的密码不是登陆这个邮箱使用的密码,而是使用这个邮箱的邮箱授权码,也就是说,接下来要设置的密码是QQ或者163官方授予的密码,不能随意指定创建,否则后面会认证失败。一般QQ、163邮件服务器都会提供这样的授权码。
执行如下命令,设置发件箱密码,有几个节点,执行几个节点;
代码语言:javascript复制bin/elasticsearch-keystore add xpack.notification.email.account.mail_account.smtp.secure_password
说明,这个mail_account名字必须与上面确定的发件箱配置名字保持一致。
执行完后,检查一下是否有如下结果:
代码语言:javascript复制[elastic@s1 elasticsearch-7.10.1]$ bin/elasticsearch-keystore list
keystore.seed //系统自带的
xpack.notification.email.account.mail_account.smtp.secure_password //确保每台机器都要有这个。
再次,重启ES集群,每个节点都重启一下;
接下来,配置CVM侧,Nginx反向代理;
Ngix1.9.11开始增加加载动态模块支持,从此不再需要替换nginx文件即可增加第三方扩展。目前官方只有几个模块支持动态加载,第三方模块需要升级支持才可编译成模块。我们测试下通过nginx动态加载模块,添加stream模块实现tcp反向代理功能。
- 下载一个Nginx, 可以在这里下载:http://nginx.org/en/download.html
- 安装配置Nginx,步骤如下:执行如下命令:
第一、yum install gcc-c
第二、yum install -y pcre pcre-devel
第三、yum install -y zlib zlib-devel
第四、yum install -y openssl openssl-devel
第五、 编译安装,重点关注 --prefix=/usr/local/nginx --with-stream=dynamic
第六、make & make install
第七:启动nginx 、并验证
附上Nginx TCP 反向代理文件
代码语言:javascript复制load_module "/usr/local/nginx/modules/ngx_stream_module.so";
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
include ext/*;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 8000;
server_name 127.0.0.1;
location / {
root /usr/local/nginx/html;
index index.php;
}
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
}
include ext/*;
}
stream {
#虚拟服务
upstream mailstream {
#设置真实的邮件服务器地址,其中ip和port替换成真实地址和端口
server smtp.qq.com:25;
}
server {
#监听端口,此端口为代理服务器的端口
listen 10.0.2.47:28; #本机内网IP
proxy_connect_timeout 5s;
proxy_timeout 5s;
#设置代理转发到哪里
proxy_pass mailstream;
}
}
那么以上,我们整个配置过程就已经全部操作完毕。
五、验证 Kibana中设置Watcher 邮件告警
1,在Kibana > Management > Stack Management > Wathcer中,设置如下:
在下面的页面配置中,选择如下:
设置完后,点击"立即试发送邮件"告警,如下:
邮件发送成功,链路测试成功;
当然,我的邮箱也收到了相关的邮件告示。
那么,这样,我们就能实现 Alert 邮件告警功能的设置。以上就是整个过程,完毕。
六、配置邮件过程中可能遇到的问题、分析
问题一,Nginx 安装配置中需要编译安装stream模块实现tcp反向代理功能;
问题二,日志中报这样的IP超时错误提示,如下图所示:
这个时候需要检查CVM nginx配置的代理的IP地址是否与ES集群配置的IP一致。一般是IP不一致或者网络不通造成。可以telnet 测试。
问题三,IP网络没问题,还是有如下报错:
这个样子大致是smtp配置的代理服务器的端口无法将请求转发到25口,导致链接失败。由于用户这里测试用的是腾讯QQ企业邮箱。经过查阅可以知道:smtp.qq.com的587端口是开启了ssl之后对外提供的链接端口,而不是25.修改如下:
使用starttls协议,smtq.qq.com的587端口,默认的25端口没有使用starttls。
参考链接:https://www.haiyun.me/archives/1242.html
问题四、Caused by: com.sun.mail.util.MailConnectException: Couldn't connect to host, port: 10.16.0.17, 25; timeout 120000
如有这个问题,应该是ES后台额配置没有下发成功。
原因:架平侧有bug,代理端口是28,但是这个配置项没有下发下去,需要后台再重新下发一下配置。
问题五、有些用户自己购买的云服务IAAS企业邮箱,并没有发件箱密码,如果不设置,会有如下报错:
由于用户用的是微软的Office 365企业邮箱,确认无发件箱邮件的授权码后,我们设置了该用户的发件箱邮件密码,然后验证成功。附上其NG关键配置。
代码语言:javascript复制stream {
#虚拟服务
upstream mailstream {
#设置真实的邮件服务器地址,其中ip和port替换成真实地址和端口
# server smtp.qq.com:25;
server partner.outlook.cn:587;
}
server {
#监听端口,此端口为代理服务器的端口
listen 192.168.XXX.XXX:587; #本机内网IP
proxy_connect_timeout 5s;
proxy_timeout 5s;
#设置代理转发到哪里
proxy_pass mailstream;
}
}
所有这些问题最多的都是smtp对外提供的端口问题,NG配置问题,邮件授权码问题。具体情况还需具体分析。
七、外网环境下的邮件告警设置
如果直接在外网,就不需要设置邮件反向代理,直接ES.yml如下设置邮箱信息即可。配置简单如下,其他配置同上:
代码语言:javascript复制XXXXXXXXXXX:
smtp:
auth: true # 开启账号验证
starttls.enable: true # 开启ssl
host: smtp.qq.com # smtp地址
port: 25 # 端口
user: 541180694@qq.com # 发件箱
更多官方关于邮件告警的设置,参考:
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/actions-email.html
https://www.elastic.co/guide/en/kibana/7.10/watcher-ui.html
八、常见问题:
1,发送邮件时,日志提示邮件认证失败,这个主要是发件箱密码设置错误导致。
2,Nginx配置反向代理时,转发错误。需要详细排查NG的配置。
九、本节总结
今天发了点时间整理了这个Watcher邮件告警功能设置,主体是验证实现了整体的流程。具体告警细节需要用户根据自己的场景特定的有针对性的设置以满足实际需求。好的,本文就讲到这里,这里一致鸣谢本文实践过程中参考的文章链接:
https://cloud.tencent.com/developer/article/1457384
https://www.cnblogs.com/sanduzxcvbnm/p/12021538.html
https://www.cnblogs.com/langkyeSir/p/13268289.html
https://www.cnblogs.com/godfather007/p/10806020.html
https://www.linuxba.com/archives/7931
https://cloud.tencent.com/developer/article/1678768
https://www.elastic.co/guide/en/elasticsearch/reference/6.4/actions-email.html#configuring-email
https://www.kafan.cn/A/43y8mw1jnr.html outlook登陆的企业邮箱怎么开通授权码