分享在阿里云经典网络里建立私有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问题再说吧)

​ 经过与阿里云沟通,发现他们官方没有什么建议可以实现,于是自己搞吧~

架构图

阿里云经典网络私有DNS服务方案

思路

  • PrivateZone绑定VPC后,该VPC内的主机都可以支持自定义解析
  • 通过在VPC里搭建BIND 代理到PrivateZone服务

搭建

购买硬件资源

  1. 创建一个专有网络(VPC)
  2. 创建一个DNS服务(PrivateZone)
  3. 创建阿里云服务器(ECS)搭建BIND服务,最低两台(主从架构)
  4. 创建一个负载均衡(SLB)监听UDP53
  5. 创建一台阿里云服务器(经典网络)(DNS 客户端)

Ansible安装BIND9 主从架构

以下为安装过程,具体见GITHUB

yum -y install ansible
git clone https://github.com/sungaomeng/ansible-dns.git
cd ansible-dns
ansible all -m ping
ansible-playbook deploy.yml

注意在执行playbook前要修改ansible/hosts 配置

  1. forwarder_list

    • 转发dns的地址列表

    • 将值修改为bind机器/etc/resolv.conf 中的nameserver地址

  1. internal_list

    • 内部网络地址列表,表示允许递归查询的客户端列表,一般为内部服务器ip所在的网段
    • 将值修改为客户端IP段
  2. masters/slaves

    • BIND主从IP地址
  3. ansible_ssh_port/user/pass

    • 如果没有配置SSH互信就指定SSH信息

压测

querperf安装

wget https://downloads.isc.org/isc/bind9/9.9.4/bind-9.9.4.tar.gz
tar zxvf bind-9.9.4.tar.gz
cd bind-9.9.4/contrib/queryperf
./configure
make

创建测试文件

vim ./querytest.txt
写入以下内容
www.baidu.com A
执行 :1,$y回车p
复制到1w行~

执行测试

./queryperf -q 20 -d ./querytest.txt -s 192.168.50.158 -l 100

结果

压测条件:
1. 时间: 100秒
2. 并发数: 120
3. 压测对象: SLB->单台2核4G DNS服务器
结果:
1. CPU 68%
2. Mem 1.5%
3. QPS 2.2W
4. RTT average: 0.003891 sec

压测条件:
1. 时间: 100秒
2. 并发数: 160
3. 压测对象: SLB->单台2核4G DNS服务器
结果:
1. CPU 75%
2. Mem 1.5%
3. QPS 3.1W
4. RTT average: 0.004834 sec

(生产环境共有3台服务通过SLB提供服务,以上结果需要*3才是线上的瓶颈)

切换

将经典网络ECS的/etc/resolv.conf nameserver地址改为负载均衡地址即可