【问题标题】:Consistent DNS between Kubernetes and docker-composeKubernetes 和 docker-compose 之间的一致 DNS
【发布时间】:2018-01-05 15:14:11
【问题描述】:

就我而言,这更像是一个开发问题而不是服务器问题,但它非常位于两者的边界上,所以如果是这样,请随时迁移到 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: {}

...流量服务器抱怨,因为它无法解析 DNS 名称 web

我可以通过以下配置更改稍微更改流量服务器的 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

所以,我可以在两个平台上运行,但这需要更改配置。我可以为流量服务器启动一个启动脚本,以确定我们是在 kube 还是 docker 中运行,并根据我们运行的位置编写上面的配置行,但理想情况下,我希望 DNS 跨平台保持一致.我对 DNS(尤其是 DNS 默认域/本地域)的理解不完整。

有什么建议吗?理想情况下,docker-compose 的本地域似乎是这里的方式。

【问题讨论】:

    标签: docker dns kubernetes docker-compose apache-traffic-server


    【解决方案1】:

    默认的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"
    

    并将流量服务器中的映射配置更新为:

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

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

    【讨论】:

      【解决方案2】:

      我发现了同样的问题,但在经历了很多痛苦的调试之后,我以另一种方式解决了它。

      使用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”,因为它会扩展为与两种环境都匹配的名称,
      @987654325 @ 在 docker.compose
      web.default.svc.local.cluster 在 kubernetes 中

      【讨论】:

        猜你喜欢
        • 2019-02-01
        • 2018-04-01
        • 1970-01-01
        • 2018-12-05
        • 1970-01-01
        • 1970-01-01
        • 2018-01-01
        • 2016-03-22
        • 2018-05-12
        相关资源
        最近更新 更多