4

就我而言,这更像是一个开发问题而不是服务器问题,但它非常位于两者的边界上,所以如果这是共识,请随意迁移到 serverfault.com)。

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

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

在这之前,我有一个运行 Apache Traffic Server 的反向代理服务器。url重映射配置文件中有一个简单的映射规则

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 的本地域似乎是这里的方式。

4

2 回答 2

2

默认的 kubernetes 本地域是

default.svc.cluster.local

这意味着webkubernetes下服务的全称是web.default.svc.cluster.local

因此,在文件中的 trafficserver 配置部分下,我可以使用以下语法为asdocker-compose创建别名:webweb.default.svc.cluster.localdocker-compose.yml

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

并将 trafficserver 中的映射配置更新为:

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

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

于 2018-01-05T17:45:12.470 回答
1

经过大量痛苦的调试,我发现了同样的问题,但以另一种方式解决了它。

使用CONFIG proxy.config.dns.search_default_domains INT 1Apache Traffic Server 将search一个接一个地附加在 /etc/resolve.conf 中找到的名称,直到它被命中。

在我的例子中,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”,因为它
web.company.intra在 kubernetes
web.default.svc.local.cluster中的 docker.compose 中扩展为与两个环境都匹配的名称

于 2018-03-07T09:27:59.297 回答