DNS 即服务指南
将 DNS 管理与红帽 OpenStack 平台集成
摘要
第 1 章 DNSaaS 概述 复制链接链接已复制到粘贴板!
Red Hat OpenStack Platform 8 包括 DNSaaS (也称为设计)的技术预览。DNSaaS 包括用于域和记录管理的 REST API,是多租户的,并与 OpenStack Identity Service (keystone)集成以进行身份验证。DNSaaS 包含与计算(nova)和 OpenStack 网络(neutron)通知集成的框架,允许自动生成的 DNS 记录。此外,DNSaaS 包含对 Bind9 的集成支持。
本发行版本中提供了 DNS 即服务(DNSaaS) (也称为 Designate)作为 技术预览 提供,因此不受红帽完全支持。它只应用于测试,不应部署在生产环境中。有关技术预览功能的更多信息,请参阅覆盖范围详细信息。
1.1. 本指南涵盖的主题 复制链接链接已复制到粘贴板!
- 手动 DNSaaS 安装步骤,因为 Director 部署中目前不包含 DNSaaS。
- 使用命令行界面管理和配置 DNSaaS.
- 与 Bind9, 集成,包括自动创建实例记录。
1.2. DNSaaS 先决条件 复制链接链接已复制到粘贴板!
- 完全正常工作的基于 OpenStack 网络、非 HA OpenStack 环境。
- 加载的 OpenStack 镜像服务(glance)镜像,用于测试自动创建。
1.3. DNSaaS 服务 复制链接链接已复制到粘贴板!
DNSaaS 部署包括以下组件:
| designate-api | 提供 OpenStack 原生 REST API。 |
| designate-central | 处理 mysql 数据库中的请求和协调存储。 |
| designate-mdns | 小 MiniDNS 服务器仅用于通过标准 DNS 协议与其他 DNS 服务器进行通信。 |
| designate-pool-manager | 管理 DNSaaS 管理的 DNS 服务器的状态。确保后端 DNS 服务器与 DNSaaS 同步。 |
| designate-sink | 用于侦听 nova 和 neutron 通知事件的可选服务,用于触发自动记录创建/提取。 |
| designate-agent | 用于无法接受区域传送的 DNS 服务器(AXFR)。BIND 后端不需要。 |
应该在下一个主发行版本中添加 zone-manager 服务。它将在区域上运行定期任务,以提供识别丢失的事件的机制。
1.4. DNSaaS 与计算和 OpenStack 网络集成 复制链接链接已复制到粘贴板!
当 designate-sink 服务向 designate-central 发送消息时,DNSaaS 记录管理开始,然后触发以下描述的工作流:
1. designate-sink 从 Compute 接收 实例引导/删除 事件,或者从 OpenStack 网络接收浮动 IP add/remove 事件。这些事件使用 OpenStack 消息总线发送。
2. designate-sink 从虚拟机名称和配置的域 ID 构造主机的 FQDN (请参阅以下)。
3. designate-sink 告知 designate-central 使用给定名称和 IP 地址添加/删除记录。
4. designate-central 添加/删除 DNSaaS 数据库中的记录(在 designate-central 和 designate-mdns之间共享)。
5. designate-central 告知 designate-pool-manager 将 DNS NOTIFY 发送到此域的后端 DNS 服务器(BIND9)。
6.后端 DNS 服务器接收 DNS NOTIFY,并将 AXFR (区传输)请求发送到 designate-mdns。
7. designate-mdns 从数据库读取更改,并将它们发送到 AXFR 响应中的后端 DNS 服务器。
第 2 章 手动 DNSaaS 安装 复制链接链接已复制到粘贴板!
必须注册您的服务器才能接收 OpenStack 软件包。如需更多信息,请参阅 https://access.redhat.com/documentation/zh-cn/red_hat_openstack_platform/8/html-single/director_installation_and_usage/#sect-Registering_your_System
1.在控制器节点上安装 DNSaaS 软件包:
yum install openstack-designate-api openstack-designate-central openstack-designate-sink openstack-designate-pool-manager openstack-designate-mdns openstack-designate-common python-designate python-designateclient openstack-designate-agent
# yum install openstack-designate-api openstack-designate-central openstack-designate-sink openstack-designate-pool-manager openstack-designate-mdns openstack-designate-common python-designate python-designateclient openstack-designate-agent
2.创建 DNSaaS 和池管理器数据库。更新 IDENTIFIED BY 'ComplexAlphanumericPassword' 值,以适应您的环境。
3.在 OpenStack Identity (keystone)中创建 DNSaaS 服务帐户和端点:本例使用 DNSaaS 主机 IP 地址 192.168.100.20。您可能需要更新这些步骤以适合您的环境。
openstack user create designate --password ComplexAlphanumericPassword --email designate@localhost openstack role add --project service --user designate admin openstack service create dns --name designate --description "Designate DNS Service" openstack endpoint create --region RegionOne --publicurl http://192.168.100.20:9001 --internalurl http://192.168.100.20:9001 --adminurl http://192.168.100.20:9001 designate
$ openstack user create designate --password ComplexAlphanumericPassword --email designate@localhost
$ openstack role add --project service --user designate admin
$ openstack service create dns --name designate --description "Designate DNS Service"
$ openstack endpoint create --region RegionOne --publicurl http://192.168.100.20:9001 --internalurl http://192.168.100.20:9001 --adminurl http://192.168.100.20:9001 designate
4.为 DNSaaS 添加防火墙规则:
sudo iptables -I INPUT -p tcp -m multiport --dports 9001 -m comment --comment "designate incoming" -j ACCEPT sudo iptables -I INPUT -p tcp -m multiport --dports 5354 -m comment --comment "Designate mdns incoming" -j ACCEPT
$ sudo iptables -I INPUT -p tcp -m multiport --dports 9001 -m comment --comment "designate incoming" -j ACCEPT
$ sudo iptables -I INPUT -p tcp -m multiport --dports 5354 -m comment --comment "Designate mdns incoming" -j ACCEPT
如果在本地托管 DNS,请检查所需端口是否已打开:
sudo iptables -I INPUT -p tcp -m multiport --dports 953 -m comment --comment "rndc incoming - bind only" -j ACCEPT sudo service iptables save; sudo service iptables restart
$ sudo iptables -I INPUT -p tcp -m multiport --dports 953 -m comment --comment "rndc incoming - bind only" -j ACCEPT
$ sudo service iptables save; sudo service iptables restart
5.配置 DNSaaS 数据库连接 :请确保在以下步骤中正确输入 DNSaaS 主机 IP 地址;将 ComplexAlphanumericPassword 替换为与您环境保持一致的值。
crudini --set /etc/designate/designate.conf storage:sqlalchemy connection mysql://designate:ComplexAlphanumericPassword@192.168.100.20/designate crudini --set /etc/designate/designate.conf storage:sqlalchemy max_retries -1 crudini --set /etc/designate/designate.conf pool_manager_cache:sqlalchemy connection mysql://designate:ComplexAlphanumericPassword@192.168.100.20/designate_pool_manager crudini --set /etc/designate/designate.conf pool_manager_cache:sqlalchemy max_retries -1
$ crudini --set /etc/designate/designate.conf storage:sqlalchemy connection mysql://designate:ComplexAlphanumericPassword@192.168.100.20/designate
$ crudini --set /etc/designate/designate.conf storage:sqlalchemy max_retries -1
$ crudini --set /etc/designate/designate.conf pool_manager_cache:sqlalchemy connection mysql://designate:ComplexAlphanumericPassword@192.168.100.20/designate_pool_manager
$ crudini --set /etc/designate/designate.conf pool_manager_cache:sqlalchemy max_retries -1
6.配置对 Identity Service 的身份验证(keystone):确保 admin_password 选项与您的环境一致。
crudini --set /etc/designate/designate.conf keystone_authtoken auth_uri http://192.168.100.20:5000/v2.0 crudini --set /etc/designate/designate.conf keystone_authtoken identity_uri http://192.168.100.20:35357/ crudini --set /etc/designate/designate.conf keystone_authtoken admin_tenant_name service crudini --set /etc/designate/designate.conf keystone_authtoken admin_user designate crudini --set /etc/designate/designate.conf keystone_authtoken admin_password ComplexAlphanumericPassword
$ crudini --set /etc/designate/designate.conf keystone_authtoken auth_uri http://192.168.100.20:5000/v2.0
$ crudini --set /etc/designate/designate.conf keystone_authtoken identity_uri http://192.168.100.20:35357/
$ crudini --set /etc/designate/designate.conf keystone_authtoken admin_tenant_name service
$ crudini --set /etc/designate/designate.conf keystone_authtoken admin_user designate
$ crudini --set /etc/designate/designate.conf keystone_authtoken admin_password ComplexAlphanumericPassword
7.配置 DNSaaS 与 RabbitMQ 的连接:
使某些 rabbit_userid 和 rabbit_password 选项与您的环境一致。
8.添加初始 DNSaaS 配置:
9.配置池管理器:
目前,您尚未配置池目标,因为您尚未选择后端。这个过程稍后会发生这种情况。
pool_id 被硬编码,因此请使用如下所示的 UUID :
10.配置 DNSaaS Sink:
现在,您不会配置 sink 使用的域(因为还没有存在)。
11.配置计算和 OpenStack 网络以发送通知
Ceilometer 的代理也侦听和消耗通知。创建特定的 指定 通知队列(如下所示),使它们不会冲突。
Kilo 发行版本中的 OpenStack Compute 切换到 messaging 作为其通知驱动程序;之前,它是 nova.openstack.common.notifier.rpc_notifier
12.手动验证 nova.conf 中的 notification_driver :
由于 nova.conf 中多个 notification_drivers 的可能性,crudini 命令可能会导致问题。在 DEFAULT 部分中检查以确保您有两个条目:
notification_driver=ceilometer.compute.nova_notifier notification_driver=messaging
notification_driver=ceilometer.compute.nova_notifier
notification_driver=messaging
如果使用单独的 Compute 节点,则需要 nova.conf 中的以下设置:
notification_driver =nova.openstack.common.notifier.rabbit_notifier,ceilometer.compute.nova_notifier notification_driver =messaging notification_topics=notifications,notifications_designate
notification_driver =nova.openstack.common.notifier.rabbit_notifier,ceilometer.compute.nova_notifier
notification_driver =messaging
notification_topics=notifications,notifications_designate
13.同步 DNSaaS 和池管理器缓存:
designate-manage database sync designate-manage pool-manager-cache sync
# designate-manage database sync
# designate-manage pool-manager-cache sync
14.启用并启动 DNSaaS 服务:
此时您尚未为您的池创建 DNS 目标,因此还没有预期正常运行的 DNSaaS 部署。
第 3 章 安装和配置 Bind9 复制链接链接已复制到粘贴板!
这些步骤将安装 Bind9,然后配置与 DNSaaS 的集成。
3.1. 基本 BIND 安装 复制链接链接已复制到粘贴板!
1.安装 BIND 软件包:
yum install bind bind-utils
# yum install bind bind-utils
2.将 named 配置为侦听传入连接:
cp /etc/named.conf /etc/named.conf.orig
sed -i -e "s/listen-on port.*/listen-on port 53 { 127.0.0.1; 192.168.100.20; };/" /etc/named.conf
# cp /etc/named.conf /etc/named.conf.orig
# sed -i -e "s/listen-on port.*/listen-on port 53 { 127.0.0.1; 192.168.100.20; };/" /etc/named.conf
3.2. 配置 BIND 复制链接链接已复制到粘贴板!
1.写入 /etc/rndc.key :
rndc-confgen -a
# rndc-confgen -a
2.在 选项前添加以下内容
sed -i '/^options.*/i \
include "/etc/rndc.key"; \
controls { \
inet 127.0.0.1 allow { localhost; } keys { "rndc-key"; }; \
};' /etc/named.conf
# sed -i '/^options.*/i \
include "/etc/rndc.key"; \
controls { \
inet 127.0.0.1 allow { localhost; } keys { "rndc-key"; }; \
};' /etc/named.conf
3.删除几个现有选项,稍后您要重写:
sed -i '/allow-query.*/d' /etc/named.conf sed -i '/recursion.*/d' /etc/named.conf
# sed -i '/allow-query.*/d' /etc/named.conf
# sed -i '/recursion.*/d' /etc/named.conf
4.在选项后添加以下内容:
sed -i '/^options.*/a \
allow-new-zones yes; \
allow-query { any; }; \
recursion no;' /etc/named.conf
# sed -i '/^options.*/a \
allow-new-zones yes; \
allow-query { any; }; \
recursion no;' /etc/named.conf
5.创建 rndc 配置。对于 Compute 节点,rndc 配置必须指向 DNS 服务器。例如:
6.查看 指定的配置 :
named-checkconf /etc/named.conf
# named-checkconf /etc/named.conf
7.更正文件权限:
setsebool -P named_write_master_zones on chmod g+w /var/named chown named:named /etc/rndc.conf chown named:named /etc/rndc.key chmod 600 /etc/rndc.key
# setsebool -P named_write_master_zones on
# chmod g+w /var/named
# chown named:named /etc/rndc.conf
# chown named:named /etc/rndc.key
# chmod 600 /etc/rndc.key
8.启用并启动 named 服务:
systemctl enable named systemctl start named
# systemctl enable named
# systemctl start named
9.验证 named 和 rndc:
dig @localhost localhost rndc status
# dig @localhost localhost
# rndc status
3.3. 为 BIND 配置 DNSaaS 池目标 复制链接链接已复制到粘贴板!
1.设置池目标配置:
crudini --set /etc/designate/designate.conf pool_target:$target_id type bind9 crudini --set /etc/designate/designate.conf pool_target:$target_id options "rndc_host: 192.168.100.20, rndc_port: 953, rndc_config_file: /etc/rndc.conf, rndc_key_file: /etc/rndc.key" crudini --set /etc/designate/designate.conf pool_target:$target_id masters 192.168.100.20:5354
$ crudini --set /etc/designate/designate.conf pool_target:$target_id type bind9
$ crudini --set /etc/designate/designate.conf pool_target:$target_id options "rndc_host: 192.168.100.20, rndc_port: 953, rndc_config_file: /etc/rndc.conf, rndc_key_file: /etc/rndc.key"
$ crudini --set /etc/designate/designate.conf pool_target:$target_id masters 192.168.100.20:5354
2.重启 DNSaaS 以应用您的池更改:
systemctl restart designate-api systemctl restart designate-central systemctl restart designate-mdns systemctl restart designate-pool-manager systemctl restart designate-sink
# systemctl restart designate-api
# systemctl restart designate-central
# systemctl restart designate-mdns
# systemctl restart designate-pool-manager
# systemctl restart designate-sink
3.4. 测试 BIND 复制链接链接已复制到粘贴板!
1.执行以下诊断命令:
netstat -tap | grep named netstat -tulpn | grep 53 dig @192.168.100.20
# netstat -tap | grep named
# netstat -tulpn | grep 53
# dig @192.168.100.20
2.检查 DNSaaS 日志中的错误。忽略 Sink 中的错误,因为您还没有修改其配置。
3.5. 测试 DNSaaS 与 BIND9 的集成 复制链接链接已复制到粘贴板!
1.为您的服务器创建一个条目:
designate server-create --name $(hostname).
# designate server-create --name $(hostname).
2.验证您的 DNS 服务器记录之前是否已创建:
designate server-list
# designate server-list
3.创建一个域(不要忘记 . 在- name 选项 的末尾)
designate domain-list
designate domain-create --name example.com. --email root@example.com
DOMAINID=$(designate domain-list | grep example.com | awk '{print $2}')
# designate domain-list
# designate domain-create --name example.com. --email root@example.com
# DOMAINID=$(designate domain-list | grep example.com | awk '{print $2}')
从 BIND 指定创建域时,它基本上运行熟悉这个命令的命令:
rndc -s 192.168.122.41 -p 953 -c /etc/rndc.conf -k /etc/rndc.key addzone example.com '{ type slave; masters { 192.168.122.41 port 5354; }; file "slave.example.com.ff532e15-55a9-4966-8f1e-b3eddb2891ba"; };'
# rndc -s 192.168.122.41 -p 953 -c /etc/rndc.conf -k /etc/rndc.key addzone example.com '{ type slave; masters { 192.168.122.41 port 5354; }; file "slave.example.com.ff532e15-55a9-4966-8f1e-b3eddb2891ba"; };'
4.创建记录和测试查找(不要忘记 . 在- name 选项的末尾)
designate record-create --name server1.example.com. --type A --data 1.2.3.4 $DOMAINID dig +short -p 53 @192.168.100.20 server1.example.com A
# designate record-create --name server1.example.com. --type A --data 1.2.3.4 $DOMAINID
# dig +short -p 53 @192.168.100.20 server1.example.com A
3.6. 配置自动生成的 DNS 记录(创新固定和 neutron 浮动) 复制链接链接已复制到粘贴板!
1.修改 example 域的 DNSaaS 配置:
2.测试 OpenStack Compute (nova)记录创建:
glance image-list neutron net-list nova boot testserver --flavor m1.tiny --image cirros-0.3.4-x86_64 --key-name yourkey --security-groups default --nic net-id=<Private Net ID>
# glance image-list
# neutron net-list
# nova boot testserver --flavor m1.tiny --image cirros-0.3.4-x86_64 --key-name yourkey --security-groups default --nic net-id=<Private Net ID>
3.检查 Sink 日志:
实例启动后,如果正确获取了通知,您应该会看到 create_record 条目:
tail /var/log/designate/sink.log
# tail /var/log/designate/sink.log
在 BIND 中检查
dig +short @192.168.100.20 testserver.example.com
# dig +short @192.168.100.20 testserver.example.com
如果这不起作用,您也可以检查 /var/named 中的文件。
3.7. 测试 OpenStack 网络浮动 IP 记录创建 复制链接链接已复制到粘贴板!
1.执行下面的诊断命令(用适合您环境的名称替换 swig 1 ):
FLOATINGIP=$(neutron floatingip-create pubnet1 | grep floating_ip_address | awk '{print $4}')
nova add-floating-ip testserver $FLOATINGIP
DNSRESULT=$(echo $FLOATINGIP |sed 's/\./-/g').example.com
dig +short @192.168.100.20 $DNSRESULT
# FLOATINGIP=$(neutron floatingip-create pubnet1 | grep floating_ip_address | awk '{print $4}')
# nova add-floating-ip testserver $FLOATINGIP
# DNSRESULT=$(echo $FLOATINGIP |sed 's/\./-/g').example.com
# dig +short @192.168.100.20 $DNSRESULT
2.您应该在日志文件中看到 create_record 事件:
tail /var/log/designate/sink.log
# tail /var/log/designate/sink.log
3.8. 清理 OpenStack 网络和计算 DNS 条目 复制链接链接已复制到粘贴板!
1.删除之前创建的测试浮动 IP:
nova remove-floating-ip testserver $FLOATINGIP
# nova remove-floating-ip testserver $FLOATINGIP
2.您应该在日志文件中看到 delete_record 事件:
tail /var/log/designate/sink.log
# tail /var/log/designate/sink.log
现在应删除记录。
3.删除之前创建的 testserver :
designate record-list $DOMAINID nova delete testserver
# designate record-list $DOMAINID
# nova delete testserver
您应该在日志文件中看到另一个 delete_record 条目:
tail /var/log/designate/sink.log
# tail /var/log/designate/sink.log