公司使用Dnsmasq作为内部DNS resolver,选择Dnsmasq主要是因为安装方便且配置简单,整个服务比较轻量级,还有就是我们的DNS服务器不是任何域的“Authoritative DNS server”,只起一个请求转发的作用。
写在前面
前一阵配置了两个上游DNS,一个是服务提供商的DNS,一个是阿里的公共DNS,但使用中有不少问题(这里不细说了),还有延时偶尔比较大。因为这个原因,将服务提供商的DNS换成了谷歌的公共DNS。这样配置后,消停了一段时间,昨天有同事反馈访问百度特别慢,赶紧排查下,发现Dnsmasq返回的IP地址是香港的:
![c6f8526a15459ae3397ae3e27d27d291.png](https://img-blog.csdnimg.cn/img_convert/c6f8526a15459ae3397ae3e27d27d291.png)
返回香港的IP
Dnsmasq上游配置了阿里和谷歌的公共DNS,大概率是谷歌公共DNS返回了香港的IP,测试后,真是这样:
......;; ANSWER SECTION:www.baidu.com.638INCNAMEwww.a.shifen.com.www.a.shifen.com.91INCNAMEwww.wshifen.com.www.wshifen.com.91INA103.235.46.39;; Query time: 24 msec;; SERVER: 8.8.8.8#53(8.8.8.8)......
要保证国外网站不被解析错误,还要保证国内网站不能解析出国外IP,这让我很犯难。为了早发现这个问题,先将几个重要网站监控起来。
监控方法
监控主要依赖“script_exporter”(github有源码),它的实现原理比较简单:自定义监控脚本,脚本返回非0或超时,监控结果就是失败,反之,就是成功。
为了方便在OpenShift 4集群上部署,将服务放在容器中运行,下面是Dockerfile文件:
FROM debian:busterCOPY ./script-exporter /bin //源码从github下载后,自行编译COPY ./dns-monitor/ /tmp //配置文件和检测脚本都放到/tmp目录下COPY ./sources.list /etc/apt/sources.list //用了清华的源,默认的太慢了RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*EXPOSE 9172ENTRYPOINT [ "/bin/script-exporter" ]CMD ["-config.file=/tmp/script-exporter.yml", "-config.shell=/bin/bash"]
容器“/tmp”目录下主要是两个文件,“script-exporter”的配置文件和监控脚本。
“script-exporter”配置文件:
scripts: - name: check-lagou script: /tmp/check-lagou.sh timeout: 3 //超过3秒,认为检测失败
监控脚本“check-lagou.sh”
#!/bin/bashfunction curl_check() {curl -I -L -s "$1" | egrep 'HTTP.*200' > /dev/null //加上“-L”选项,因为可能会发生重定向[ $? -eq 0 ] && return 0 || return 1}if curl_check "https://www.lagou.com"; then //访问lagou的首页 exit 0else exit 1fi
Prometheus配置
“script_exporter”访问链接“http://IP/probe?pattern=.*”得到全部metrics,因此配置Prometheus如下:
...... - job_name: 'zhaopin-website' scrape_interval: 2m //2分钟采集一次就够了,不用太频繁 metrics_path: '/probe' params: pattern: ['.*'] static_configs: - targets: - script-exporter.apps.okd-infra.example.com
Metrics显示如下:
![58fb4ee1621f2e5c40f725c9350c2d0f.png](https://img-blog.csdnimg.cn/img_convert/58fb4ee1621f2e5c40f725c9350c2d0f.png)
Metrics展示
监控脚本的执行结果和执行时间都有了,配置Grafana,效果如下:
![e621ca6ffe24bedbf249b2156ea6beca.png](https://img-blog.csdnimg.cn/img_convert/e621ca6ffe24bedbf249b2156ea6beca.png)
Grafana展示
配置了告警,如果出现问题会发通知出来,给我排查DNS问题留出时间。
希望这篇文章能帮到正在努力的你,欢迎点赞评论!