监控:DNS服务发现监控
HertzBeat 集成 DNS 服务,通过 DNS 记录自动发现服务实例并为发现的实例创建监控任务。
概述
DNS 服务发现允许 HertzBeat 通过查询 DNS 记录来发现服务实例。这是一种简单可靠的服务发现方法,利用标准 DNS 基础设施来查找服务实例。特别适用于使用 DNS SRV 记录或需要通过 DNS 发现服务的环境。
监控前操作
配置 DNS 记录
确保您的 DNS 服务器已正确配置服务发现记录。不同的记录类型有不同的格式:
- SRV 记录:用于服务发现,包含服务主机和端口信息
- A 记录:返回 IPv4 地址
- AAAA 记录:返回 IPv6 地址
- MX 记录:邮件服务器记录
- NS 记录:名称服务器记录
配置参数
| 参数名称 | 参数帮助描述 |
|---|---|
| 任务名称 | 标识此监控的名称,名称需要保证唯一性 |
| DNS地址 | DNS 服务器地址。示例:8.8.8.8 或 192.168.1.1 |
| DNS端口 | DNS 服务器端口,默认为 53 |
| 记录类型 | 要查询的 DNS 记录类型。选项:SRV、A、AAAA、MX、NS |
| 记录名称 | 要查询的 DNS 记录名称。示例:SRV 记录为 _http._tcp.example.com |
| 采集间隔 | 监控周期性采集数据间隔时间,单位秒,可设置的最小间隔为30秒 |
| 描述备注 | 更多标识和描述此监控的备注信息,用户可以在这里备注信息 |
使用步骤
创建服务发现监控
- 在 HertzBeat Web 界面中,导航到 监控 → 新增监控
- 选择监控类型:DNS服务发现
- 填写基本配置参数
配置监控模板
- 创建服务发现监控后,需要指定一个监控模板
- 模板定义了为发现的服务实例创建什么类型的监控
- 对于 SRV 记录,常用的模板包括端口、HTTP 等
- 对于 A/AAAA 记录,可以使用 Ping 或端口监控
自动发现
- HertzBeat 会根据采集间隔定期查询 DNS 服务器
- 为新发现的服务实例自动创建监控任务
- 自动删除已消失服务实例的监控任务
查看发现的实例
- 在监控列表中,您可以看到所有自动创建的子监控任务
- 每个子监控任务对应一个发现的服务实例
使用示例
示例 1:SRV 记录发现
假设您的 Web 服务有一个 SRV 记录:
- SRV 记录:
_http._tcp.example.com - DNS 服务器:
8.8.8.8 - 预期发现:自动发现所有 HTTP 服务实例
配置示例:
- 任务名称:
DNS-SRV-Discovery - DNS地址:
8.8.8.8 - DNS端口:
53 - 记录类型:选择
SRV - 记录名称:
_http._tcp.example.com - 采集间隔:
60秒 - 监控模板:选择
端口监控(使用 SRV 记录中的端口)
配置完成后:
- HertzBeat 查询
_http._tcp.example.com的 SRV 记录 - 从 SRV 记录响应中提取主机和端口信息
- 为每个服务实例自动创建端口监控
示例 2:A 记录发现
通过 A 记录发现服务实例:
- A 记录:
services.example.com - 该域名可能解析到多个 IP 地址
配置示例:
- DNS地址:
192.168.1.1(内部 DNS 服务器) - DNS端口:
53 - 记录类型:选择
A - 记录名称:
services.example.com - 监控模板:选择
Ping或端口监控
示例 3:MX 记录发现
通过 MX 记录发现邮件服务器:
- DNS地址:
8.8.8.8 - 记录类型:选择
MX - 记录名称:
example.com - 监控模板:选择
端口监控(端口 25)
DNS 记录类型
SRV 记录(推荐)
SRV 记录是最常用的服务发现记录类型,包含服务名称、端口号和优先级信息。
格式:_service._protocol.example.com
示例:_http._tcp.example.com
典型的 SRV 记录响应包含:
- 目标域名
- 端口号
- 优先级和权重
A 记录
A 记录将域名映射到 IPv4 地址。如果一个域名解析到多个 IP,则可以发现所有 IP。
示例:services.example.com → 192.168.1.10、192.168.1.11、192.168.1.12
AAAA 记录
AAAA 记录将域名映射到 IPv6 地址。
示例:services.example.com → 2001:db8::1
MX 记录
MX 记录指定域的邮件服务器,包含优先级信息。
示例:example.com → mail.example.com
NS 记录
NS 记录指定域的名称服务器。
示例:example.com → ns1.example.com
注意事项
- DNS 服务器:确保指定的 DNS 服务器可访问且包含服务发现记录
- 记录名称:记录名称必须准确,SRV 记录需要包含服务和协议前缀
- 端口信息:
- SRV 记录包含端口信息
- A/AAAA 记录不包含端口信息,需要在监控模板中指定默认端口
- 监控模板:服务发现仅发现服务实例地址,您需要配置合适的监控模板来实际监控这些实例
- 采集间隔:建议最小间隔为 60 秒,避免过多的 DNS 查询
- DNS 缓存:DNS 响应可能被缓存,实际更新频率取决于 DNS 记录的 TTL 值
- 网络连通性:确保 HertzBeat 可以访问指定的 DNS 服务器和端口(默认:53)
- 防火墙:确保防火墙允许 DNS 查询流量(UDP/TCP 53)
采集指标
指标集合:监控目标
| 指标名称 | 指标单位 | 指标帮助描述 |
|---|---|---|
| 目标 | 无 | 发现的服务实例目标 |
| 主机 | 无 | 服务实例主机地址 |
| 端口 | 无 | 服务实例端口号 |
适用场景
- Kubernetes Headless 服务:通过 DNS 发现 Kubernetes Pod 实例
- 云服务:从云服务发现实例(AWS Route53、Azure DNS、GCP Cloud DNS)
- 传统 DNS:使用现有 DNS 基础设施进行服务发现
- 负载均衡:发现所有后端服务器实例
- 邮件服务器:通过 MX 记录发现邮件服务器实例
- 多环境:使用不同 DNS 记录在不同环境中进行服务发现
常见 SRV 记录格式
不同服务使用不同的 SRV 记录格式:
- HTTP:
_http._tcp.example.com - HTTPS:
_https._tcp.example.com - LDAP:
_ldap._tcp.example.com - FTP:
_ftp._tcp.example.com - MySQL:
_mysql._tcp.example.com - PostgreSQL:
_postgresql._tcp.example.com
Kubernetes 集成
在 Kubernetes 集群中,可以使用 DNS 服务发现来发现 Pod 实例:
- Headless 服务:Kubernetes 为 headless 服务的每个 Pod 创建 DNS A 记录
- 服务发现:使用 DNS 服务发现监控特定服务的所有 Pod
示例:
- DNS地址:Kubernetes 集群 DNS 服务 IP(通常是
10.96.0.10) - 记录类型:
A - 记录名称:
my-service.default.svc.cluster.local - 监控模板:
端口监控
DNS 服务器示例
常用的 DNS 服务器:
- Google Public DNS:
8.8.8.8、8.8.4.4 - Cloudflare DNS:
1.1.1.1、1.0.0.1 - Quad9 DNS:
9.9.9.9 - OpenDNS:
208.67.222.222、208.67.220.220 - 内部 DNS:通常是企业内部 DNS 服务器地址
最佳实践
- 使用 SRV 记录:SRV 记录是推荐的服务发现方法,因为它包含完整的主机和端口信息
- 设置合理的 TTL:设置适当的 DNS 记录 TTL 以平衡实时性能和 DNS 服务器负载
- 冗余配置:配置多个 DNS 服务器以确保高可用性
- 监控:定期检查 DNS 记录的有效性和可用性
- 安全性:确保 DNS 查询安全,考虑使用 DNS over HTTPS (DoH) 或 DNS over TLS (DoT)