|
公司内网DNS这事儿,说大不大,说小能让你半夜爬起来查日志。上个月我们运维老张就栽了跟头——新上线的内部系统,测试环境一切正常,一上生产就间歇性白屏。查了三天,最后发现是内网DNS缓存了旧IP,A记录TTL设了24小时,负载均衡器都切换两轮了,解析还指着那台已经下线的服务器。 内网DNS软件,说白了就是给公司内部域名做“翻译官”。但跟公网DNS不一样,它得处理一堆奇葩需求:开发环境要解析到测试机,测试环境要解析到预发机,预发环境还得能一键切到生产。光靠系统自带的DNS服务根本不够用,于是就有了各种方案。 我们用的方案是CoreDNS加etcd。当初选它就是因为配置简单,一个Corefile文件就能搞定所有逻辑。比如研发说“我要把api.internal解析到10.0.3.21”,直接改etcd里的记录,CoreDNS自动加载,不用重启服务。这比老掉牙的BIND强多了,BIND改个zone文件还得reload,遇到并发访问高峰期reload一次能把整个内网解析卡顿几秒。 但CoreDNS也有坑。有次我们给一个服务配了通配符域名,结果把另一个服务的精确匹配给覆盖了,流量全打到一个不存在的Pod上。排查的时候发现是CoreDNS的插件顺序问题——通配符规则写在了精确规则前面,匹配优先级就乱了。最后只能把规则拆成两个独立域名段,才解决。 如果你公司规模不大,二三十台服务器,其实用dnsmasq就够了。轻量,内存占用小,还能做DHCP。我见过有家创业公司连内网DNS都懒得配,直接改/etc/hosts,后来人多了,新同事入职第一件事就是问“那个XX系统的IP是多少”,效率低到爆炸。后来他们换成了dnsmasq,配置了alias,总算不用天天发IP表了。 规模再大点的,比如几百个微服务,就得考虑智能DNS了。按机房、按网络环境返回不同IP,这功能dnsmasq做不了,CoreDNS得写插件,费劲。这时候可以看看PowerDNS,它的管道设计允许你写自定义逻辑,还能从数据库动态读取记录。我们隔壁组就用它,配合MySQL存服务注册信息,服务上线自动写DNS记录,下线自动删,全程不用人工干预。 不过说句实在话,工具选型只是第一步。内网DNS真正难的是治理。你得有清晰的域名命名规范,比如service.environment.region.internal,不然一年后你自己都看不懂那些记录是干嘛的。还得监控解析量,突然暴增的QPS往往意味着某个服务在疯狂重试。我们曾经有个Java应用,配置错了连接池,每秒钟解析几千次同一个域名,直接把CoreDNS打出了5%的丢包率。 最后提醒一句:内网DNS一定要做高可用,至少两台节点,用keepalived做VIP漂移。别笑,真有人图省事只部署一台。上个月朋友公司断电重启,DNS服务没设开机自启,整个办公室的办公系统全部瘫痪,行政小姐姐打印不了快递单,销售开不了发票,那画面太美我不敢看。 |