Kubernetes和docker-compose之间的DNS一致性

t1rydlwq  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(2)|浏览(112)
  • 就我而言,这更像是一个开发问题,而不是服务器问题,但它位于两者的边界上,所以如果这是共识,请随时迁移到serverfault.com。

我有一个服务,我们称之为web,它在docker-compose.yml文件中声明如下:

web:
    image: webimage
    command: run start
    build:
      context: ./web
      dockerfile: Dockerfile

在此之前,我有一个运行Apache Traffic Server的反向代理服务器。url remapping config file中有一个简单的Map规则

map / http://web/

因此,所有传入的请求都Map到上述web服务。这在docker-compose中工作得很好,但是当我将服务移动到kubernetes时,服务描述如下:

apiVersion: v1
kind: Service
metadata:
  labels:
    io.kompose.service: web
  name: web
spec:
  clusterIP: None
  ports:
  - name: headless
    port: 55555
    targetPort: 0
  selector:
    io.kompose.service: web
status:
  loadBalancer: {}

.流量服务器抱怨,因为它无法解析DNS名称web
我可以通过以下配置更改稍微更改流量服务器的DNS行为来解决这个问题:

CONFIG proxy.config.dns.search_default_domains INT 1

(see https://docs.trafficserver.apache.org/en/7.1.x/admin-guide/files/records.config.en.html#dns)
此配置更改描述如下:
Traffic Server可以尝试通过扩展到本地域来解析不合格的主机名。例如,如果客户端向不合格的主机(例如,host_x),并且Traffic Server本地域为y.com,则Traffic Server将主机名扩展为host_x.y.com。
现在一切都在kubernetes中运行得很好。
但是,当在docker-compose中运行时,流量服务器会抱怨无法解析web
所以,我可以让事情在两个平台上工作,但这需要更改配置。我可以为traffic-server启动一个启动脚本,以确定我们是在kube还是docker中运行,并根据我们运行的位置编写上面的配置行,但理想情况下,我希望DNS在各个平台上保持一致。我对DNS(特别是DNS默认域/本地域)的理解是不完整的。
有什么建议吗?理想情况下,docker-compose的本地域似乎是这里的出路。

carvr3hs

carvr3hs1#

默认的Kubernetes本地域是

default.svc.cluster.local

这意味着kubernetes下web服务的完全限定名是web.default.svc.cluster.local
因此,在docker-compose文件中,在trafficserver config部分下,我可以使用以下docker-compose.yml语法为web创建别名web.default.svc.cluster.local

version: "3"
services:
  web:
    # ...
  trafficserver:
    # ...
    links:
      - "web:web.default.svc.cluster.local"

并更新trafficserver中的Map配置为:

map / http://web.default.svc.cluster.local/

并且现在web服务可以跨docker-composekubernetes使用相同的域名到达。

dgtucam1

dgtucam12#

我发现了同样的问题,但用另一种方式解决了它,经过了许多痛苦的调试。
对于CONFIG proxy.config.dns.search_default_domains INT 1,Apache Traffic Server将在/etc/resolve.conf中逐个追加在search下找到的名称,直到找到匹配。
在我的例子中,resolve.conf指向company.intra,这样我就可以根据这个来命名我的服务(所有来自Apache Traffic Server的服务

version: '3.2'
services:
   # this hack is ugly but we need to name this 
   # (and all other service called from ats), with 
   # the same name as found under search in /etc/resolve.conf)
   web.company.intra:
      image: web-image:1.0.0

有了这个更改,我根本不需要对remap.config进行任何更改,使用的URL仍然只能是“web”,因为它会扩展为一个与两个环境匹配的名称,
docker.compose中的web.company.intra
kubernetes中的web.default.svc.local.cluster

相关问题