Kubernetes与Docker Compose间DNS一致性问题求助
实现Docker Compose与Kubernetes下Apache Traffic Server DNS解析一致性
问题根源
Docker Compose和Kubernetes的DNS解析逻辑存在核心差异:
- 在Docker Compose中,服务名(比如
web)是直接可解析的短域名,容器默认的DNS搜索域不会干扰短域名的解析。 - 在Kubernetes中,服务的完整域名(FQDN)格式是
服务名.命名空间.svc.cluster.local,短域名web能被解析是因为K8s默认的DNS搜索域包含了当前命名空间的域。
你之前修改的proxy.config.dns.search_default_domains INT 1让TS自动搜索默认DNS域,这在K8s中能自动补全web的后缀,但在Docker Compose中,TS会去搜索主机默认的DNS域,反而找不到web这个短域名。
理想解决方案:对齐两边的DNS搜索域
我们可以给Docker Compose配置与Kubernetes一致的DNS搜索域,这样TS的配置可以完全统一,不用根据环境切换。
步骤1:统一Apache Traffic Server配置
保持proxy.config.dns.search_default_domains INT 1的配置不变,让TS在两个环境下都自动搜索默认DNS域。
步骤2:给Docker Compose配置自定义DNS搜索域
你有两种灵活的配置方式:
方式1:给单个服务添加DNS搜索域
在docker-compose.yml中,给web服务和运行TS的服务添加dns_search字段:
services: web: image: webimage command: run start build: context: ./web dockerfile: Dockerfile dns_search: default.svc.cluster.local # 假设你的Apache Traffic Server服务名为traffic-server traffic-server: image: your-traffic-server-image dns_search: default.svc.cluster.local # 其他端口、挂载等配置...
方式2:给整个Docker网络配置默认DNS搜索域
如果所有服务都需要这个配置,可以直接给默认网络设置,避免重复配置:
version: '3.8' services: web: image: webimage command: run start build: context: ./web dockerfile: Dockerfile traffic-server: image: your-traffic-server-image # 其他配置... networks: default: dns_search: default.svc.cluster.local
为什么这样有效?
- 在Kubernetes中,
web的FQDN是web.default.svc.cluster.local,TS开启搜索默认域后,会自动补全后缀完成解析。 - 在Docker Compose中,我们手动设置了DNS搜索域为
default.svc.cluster.local,TS解析web时会尝试web.default.svc.cluster.local,而Docker Compose的内部DNS会识别这个带后缀的域名,正确指向web服务;同时短域名web本身依然可以直接解析,不会影响原有逻辑。
验证方法
启动服务后,进入TS容器执行以下命令,确保两种域名都能正常解析:
nslookup web nslookup web.default.svc.cluster.local
两边环境下都能返回web服务的IP,就说明配置生效了。
内容的提问来源于stack exchange,提问作者spender
相关产品推荐
相关产品推荐

