当前位置: > > > Docker - 去除容器的搜索域dns-search(解决K8S环境下自动添加搜索域问题)

Docker - 去除容器的搜索域dns-search(解决K8S环境下自动添加搜索域问题)

1,问题描述

(1)最近通过 Docker Compose 启动 EdgeX Foundry 平台时,发现许多容器启动起来后过了一会就自动停止退出。访问 EdgeXConsul 页面可以看到其它的容器都是 failing

(2)查看 Consul 的日志可以发现,它无法通过容器名访问其它容器。

2,问题原因

(1)由于 EdgeX Foundry 各个容器都是使用同一个自定义的 bridge 网络,理论上借助 docker daemon 内嵌的 DNS server,它们之间是可以通过容器名访问的。

(2)后来想起这台服务器是 K8S 集群中的一个 Node 节点,会不会是 K8S 的网络对其造成影响(虽然 EdgeX 并不是通过 K8S 部署,但毕竟都是在 Docker 运行。)

(3)进入 Consul 容器,执行如下命令查看 DNS 信息:
cat /etc/resolv.conf

(4)结果如下,最上面有一行 search xxxxx,这个是设置了 DNS 搜索域(而非 K8S 节点主机上运行的容器是不会有这一行的)。因为 Docker 会默认会用主机上的 /etc/resolv.conf 来配置容器,因此容器也使用了和主机一样的搜索域,从而造成 docker 自定义网络内部容器 dns 解析出问题。 
search default.svc.cluster.local svc.cluster.loacl
nameserver 127.0.0.11
options ndots:2 timeout:2 attempts:2

3,解决办法

(1)我们目的是将所有容器的 search xxx 都去掉即可。编辑 EdgeXdocker-compose.yml 文件,对所有容器添加 dns_search: . 配置。
--dns-search=DOMAIN 可以设定容器的搜索域。如果不想设置搜索域,则使用 --dns-search=.

(2)编程保存退出后,重新启动 EdgeX 平台,可以看到各个容器已经能够成功相互通信了。

(3)查看任意一个容器的 /etc/resolv.conf 文件,可以发现也不会有 search xxxx 相关内容。
nameserver 127.0.0.11
options ndots:2 timeout:2 attempts:2
评论0