背景
当Linux集群中机器不断增多,集群内通过配置/hosts
实现域名内网访问。
目标
- 相同域名在集群之外通过公有DNS访问外网地址
- 相同域名在集群内通过DNS解析访问内网地址
步骤
搭建DNS服务器
DNS服务器可以通过jpillora/dnsmasq
容器实现
新增配置文件 dnsmasq.conf
# 完整配置文件参考以下地址
# http://oss.segetech.com/intra/srv/dnsmasq.conf
# 记录所有DNS查询请求
log-queries
# 不使用本地配置的域名解析器
no-resolv
# 不使用本地hosts
no-hosts
# 配置上游DNS服务器地址,用于解析国内域名
server=114.114.114.114
# 配置国际DNS服务器地址
server=8.8.8.8
strict-order
# 配置内网解析
address=/gitlab.fjy8018.top/192.168.1.11
配置docker-compose
文件,DNS服务器默认通过53 udp端口解析,不建议修改53端口的外部地址
version: "3.5"
services:
dnsmasq:
image: jpillora/dnsmasq:1.1.0
networks:
- dns-net
ports:
- 53:53/udp
- 5380:8080
volumes:
- ./dnsmasq.conf:/etc/dnsmasq.conf
environment:
- "HTTP_USER=admin"
- "HTTP_PASS=admin"
restart: always
networks:
dns-net:
启动服务即可
后续需要修改DNS解析只需要访问5380
的web UI界面即可动态调整
服务器指向新DNS服务器
将所有服务器/etc/resolv.conf
文件指向新DNS服务器地址
$ tee /etc/resolv.conf <<-'EOF'
# Generated by NetworkManager
nameserver 192.168.1.13
EOF
补充
对于kubernetes
集群,由于集群内使用了coredns
和nodelocaldns
缓存服务,还需要重启两个dns服务组件
$ kubectl -n kube-system rollout restart daemonset nodelocaldns
$ kubectl -n kube-system rollout restart deploy coredns