分享在阿里云经典网络里建立私有DNS服务的整个历程和方法
因为在阿里云经典网络里是没有私有DNS服务的, 只有专有网络有, 但我们迁移至专有网络是一个漫长的过程, 所以临时通过这种方案解决DNS需求
现状
- 有内网Host需求的全部通过绑定Hosts访问(/etc/hosts)
痛点
- 需要手动修改hosts文件
- 维护麻烦易出错
- docker环境还需要单独给每个pod添加hosts适配,不能做到统一管理
目标
统一管理域名映射关系
最好是WEB界面管理
基础服务要保证稳定
支持”递归解析代理“
- 因为我们有相同域名内外网解析到不同IP的场景(最开始没有规划好)
- 比如api.aliyun.com
- 公网解析到的是1.1.1.1(公网负载均衡)
- 内网配置的hosts是10.1.1.1(内网负载均衡)
解决方案
起初想自建BIND提供DNS服务,不过简单测试了下BIND,发现BIND并不能满足我的需求:不支持递归解析代理功能, 因为BIND的Zone是由本地完全代理解析的,如果本地Zone配置里不存在对应的记录就会返回不存在,不会再去公网上去找结果并返回.(望大神指点)
举个栗子🌰:
例如,Zone名称为aliyun.com,在aliyun.com内配置了三条私有记录,如下表所示:
主机记录 | 类型 | TTL | 记录值 |
---|---|---|---|
host01 | A | 60 | 10.0.0.1 |
host02 | A | 60 | 10.0.0.2 |
host03 | A | 60 | 10.0.0.3 |
- 在VPC内查询
host01.aliyun.com
,host02.aliyun.com
或者host03.aliyun.com
时,分别返回私有记录10.0.0.1
,10.0.0.2
,10.0.0.3
。 - 在VPC内查询
www.aliyun.com
,api.aliyun.com
,rds.aliyun.com
等公共域名时,进行递归查询,以互联网实际域名解析结果为最终DNS解析结果。
现在各大云厂商都支持内网DNS解析,阿里云现在也出了PrivateZone
服务,不过是收费版
,但PrivateZone有一个限制就是只能专有网络(VPC)使用,这就比较坑了,不过综合看了下PrivateZone的功能,发现完全满足我的需求,于是想方设法让让它支持经典网络
(这里解释下为什么非得要支持经典网络: 我们最开始就是使用经典网络,90%业务都在上面,计划迁移到VPC但还没开始实施,所以先解决DNS问题再说吧)
经过与阿里云沟通,发现他们官方没有什么建议可以实现,于是自己搞吧~
架构图
思路
- PrivateZone绑定VPC后,该VPC内的主机都可以支持自定义解析
- 通过在VPC里搭建BIND 代理到PrivateZone服务
搭建
购买硬件资源
- 创建一个专有网络(VPC)
- 创建一个DNS服务(PrivateZone)
- 创建阿里云服务器(ECS)搭建BIND服务,最低两台(主从架构)
- 创建一个负载均衡(SLB)监听UDP53
- 创建一台阿里云服务器(经典网络)(DNS 客户端)
Ansible安装BIND9 主从架构
以下为安装过程,具体见GITHUB
yum -y install ansible |
注意在执行playbook前要修改ansible/hosts 配置
forwarder_list
转发dns的地址列表
将值修改为bind机器/etc/resolv.conf 中的nameserver地址
internal_list
- 内部网络地址列表,表示允许递归查询的客户端列表,一般为内部服务器ip所在的网段
- 将值修改为客户端IP段
masters/slaves
- BIND主从IP地址
ansible_ssh_port/user/pass
- 如果没有配置SSH互信就指定SSH信息
压测
querperf安装
wget https://downloads.isc.org/isc/bind9/9.9.4/bind-9.9.4.tar.gz |
创建测试文件
vim ./querytest.txt |
执行测试
./queryperf -q 20 -d ./querytest.txt -s 192.168.50.158 -l 100 |
结果
压测条件: |
(生产环境共有3台服务通过SLB提供服务,以上结果需要*3才是线上的瓶颈)
切换
将经典网络ECS的/etc/resolv.conf nameserver地址改为负载均衡地址即可