Kubernetes 和 docker-compose 之间的一致DNS

4
据我所知,这更像是一道开发问题而非服务器问题,但它非常接近两者的边界,如果大家认为需要,可以随意迁移到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 / http://web/

所以所有的传入请求都映射到上述描述的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: {}

...traffic server报错,因为无法解析DNS名称web

我可以通过以下配置更改轻微更改Traffic Server的DNS行为来解决此问题:

CONFIG proxy.config.dns.search_default_domains INT 1

(见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中运行时,traffic-server抱怨无法解析web
因此,我可以使两个平台上的事情正常工作,但这需要进行配置更改。 我可以启动traffic-server的启动脚本以确定我们是否在kube或docker中运行,并根据我们运行的位置编写上面的配置行,但理想情况下,我希望DNS跨平台保持一致。 我对DNS(特别是DNS默认域/本地域)的理解很有限。
任何提示吗?理想情况下,为docker-compose选择一个本地域名似乎是最好的选择。
2个回答

2
默认的 Kubernetes 本地域名为:
default.svc.cluster.local

这意味着在Kubernetes下,web服务的完全限定名称为web.default.svc.cluster.local
因此,在docker-compose文件中,在trafficserver配置部分,我可以使用以下docker-compose.yml语法将web创建为别名web.default.svc.cluster.local:
version: "3"
services:
  web:
    # ...
  trafficserver:
    # ...
    links:
      - "web:web.default.svc.cluster.local"

并更新Trafficserver中的映射配置为:

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

现在,通过相同的域名,在docker-composekubernetes中都可以访问web服务。


1
我遇到了同样的问题,但是通过痛苦的调试,用另一种方式解决了它。
使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接