在HPC集群中通常有DNS和本地hosts提供解析服务,以便节点间通过主机名互相通信,而不是直接使用IP地址。但是如果在集群外有一个独立服务器中的容器需要与集群内的节点通过主机名通讯,就需要通过DNS来给容器提供解析服务。
通过自动化脚本将集群的hosts拷贝到独立服务器的一个目录下,如 /home/hpc/dns/hosts
自己做一个dnsmasq的容器:
[yaoge123]$ cat dnsmasq/Dockerfile
FROM alpine:latest
RUN apk update \
&& apk upgrade \
&& apk add --no-cache \
dnsmasq \
&& rm -rf /var/cache/apk/*
编写docker-compose.yml:
- dnsmasq提供了DNS服务,需要指定ip地址,以便在下面其它容器配置中指定dns ip
- /home/hpc/dns 是存储hosts的本机目录
- 生产环境用 –keep-in-foreground,调试时用–no-daemon和–log-queries
- –domain-needed 一定要加,防止dnsmasq将没有域的主机名(没有.的)转发给上游DNS
- –cache-size= 改的比hosts文件行数多一些
- abc是要解析集群内主机名的容器,添加的dns就是为了用dnsmasq来提供解析服务
- 不要解析的就不要加dns
services:
dnsmasq:
build: ./dnsmasq
image: dnsmasq
container_name: dnsmasq
networks:
default:
ipv4_address: 192.168.100.200
volumes:
- /home/hpc/dns:/etc/dns:ro
command:
- dnsmasq
- --keep-in-foreground
#- --no-daemon
#- --log-queries
- --domain-needed
- --no-hosts
- --cache-size=3000
- --hostsdir=/etc/dns
abc:
image: abc
container_name: abc
dns:
- 192.168.100.200
…………
networks:
default:
driver: bridge
ipam:
driver: default
config:
- subnet: 192.168.100.0/24
测试解析和查看 dnsmasq 缓存情况,evictions为0最好
[yaoge123]# run --rm -it --network=docker_default --dns=192.168.100.200 alpine sh
/ # apk add bind-tools
/ # dig +short node_name
/ # for i in "cachesize.bind insertions.bind evictions.bind misses.bind hits.bind auth.bind servers.bind";do dig +short chaos txt $i;done