EKS 中的 DNS 故障?真正的瓶颈是 AWS 网络限制
Source: Dev.to
DNS 调查概览
在 DNS 调查期间,我最初关注 CoreDNS 和 NodeLocal DNS 指标。
真正的突破出现在我开始将 DNS 失败与 AWS 实例级网络限制关联起来时。
最有价值的信号来自 EC2 ENA 驱动通过 ethtool 暴露的网络配额指标。
EC2 ENA 配额指标
| 指标 | 描述 |
|---|---|
ethtool_linklocal_allowance_exceeded | 因对链路本地服务的流量超过每秒数据包数(PPS)限制而被丢弃的包。此限制直接影响 DNS、IMDS 和 Amazon Time Sync。 |
ethtool_conntrack_allowance_available | 在达到实例的连接跟踪限制之前,仍可跟踪的剩余连接数。(仅在 Nitro 系列实例上受支持。) |
ethtool_conntrack_allowance_exceeded | 因连接跟踪限制被超出而导致新连接无法建立,进而被丢弃的包。 |
ethtool_bw_in_allowance_exceeded | 因入站聚合带宽超过实例限制而被排队或丢弃的包。 |
ethtool_bw_out_allowance_exceeded | 因出站聚合带宽超过实例限制而被排队或丢弃的包。 |
ethtool_pps_allowance_exceeded | 因双向每秒数据包数(PPS)限制被超出而被排队或丢弃的包。 |
所有 *_allowance_exceeded 指标理想情况下应保持为零。
任何持续的非零值都表明实例层面的网络瓶颈。
收集指标
这些指标由 EC2 ENA 驱动通过 ethtool 暴露,由 node exporter 收集,Prometheus 抓取,并在 Grafana 中可视化。
在 Amazon Linux EKS 节点上,ethtool 默认已安装。要收集这些指标,需要在 node exporter 容器中启用 ethtool 收集器:
# node exporter container configuration
containers:
- args:
- --collector.ethtool
- --collector.ethtool.device-include=(eth|em|eno|ens|enp)[0-9s]+
- --collector.ethtool.metrics-include=.*
应用此更改后,指标将在 Prometheus 和 Grafana 中可用。
Prometheus 指标
-
当前可用配额
node_ethtool_conntrack_allowance_available{job="node-exporter"} -
配额超出计数器(转换为速率)
sum by (instance) ( rate( node_ethtool_conntrack_allowance_exceeded{job="node-exporter"}[1m] ) )其他配额超出指标也可以创建类似面板:
node_ethtool_bw_in_allowance_exceedednode_ethtool_bw_out_allowance_exceedednode_ethtool_pps_allowance_exceedednode_ethtool_linklocal_allowance_exceeded
每个面板显示每秒每节点丢弃的包数。
Grafana 仪表盘
完整的 Grafana 仪表盘 JSON(名为 Network limits dashboard)可视化每个节点的所有配额超出指标。所有面板都是基于节点的时间序列面板,帮助将网络饱和度与 DNS 错误或延迟关联起来。
关键要点
- 所有配额超出指标都与 EC2 实例规格相关,唯一例外是链路本地流量,其固定限制为 每秒 1024 包,不随实例大小变化。
- 这一固定限制解释了即使 CPU、内存和 Pod 级别指标看起来健康,DNS 仍可能失败的原因。
- 瓶颈存在于 Kubernetes 之下,即 EC2 网络层。
- 在排查 EKS 上间歇性 DNS 失败时,不要仅停留在 CoreDNS 指标——务必检查实例级网络配额。
如需了解 DNS 配置错误的更多背景,请参阅文章 The Hidden DNS Misconfiguration That Was Killing Performance in Our EKS Cluster (and How We Fixed it)。