DNS 代理

    虽然 Kubernetes 为 Kubernetes Service 提供了一个开箱即用的 DNS 解析,但任何自定义的 ServiceEntry 都不会被识别。有了这个功能,ServiceEntry 地址可以被解析,而不需要自定义 DNS 服务配置。对于 Kubernetes Service 来说,一样的 DNS 响应,但减少了 kube-dns 的负载,并且提高了性能。

    该功能也适用于在 Kubernetes 外部运行的服务。这意味着所有的内部服务都可以被解析,而不需要再使用笨重的运行方法来暴露集群外的 Kubernetes DNS 条目。

    此功能默认情况下未启用。要启用该功能,请在安装 Istio 时使用以下设置:

    您也可以在每个 Pod 上启用该功能,通过proxy.istio.io/config 注解

    为了尝试 DNS 捕获,首先在外部服务启动一个 :

    如果不开启 DNS 代理功能,请求 address.internal 时可能解析失败。一旦启用,您将收到一个基于 address 配置的响应:

    在上面的示例中,对于发送请求的服务,您有一个预定义的IP地址。但是常规情况下,服务访问外部服务时一般没有一个相对固定的地址,因此需要通过 DNS 代理去访问外部服务。如果 DNS 代理没有足够的信息去返回一个响应的情况下,将需要向上游转发 DNS 请求。

    这在 TCP 通讯中是一个很严重的问题。它不像 HTTP 请求,基于 Host 头部去路由。TCP 携带的信息更少,只能在目标 IP 和端口号上路由。由于后端没有稳定的 IP,所以也不能基于其他信息进行路由,只剩下端口号,但是这会导致多个 ServiceEntry 使用 TCP 服务会共享同一端口而产生冲突。

    启用此特性后,DNS 响应将为每个 ServiceEntry 自动分配一个不同的独立地址。然后代理能匹配请求与 IP 地址,并将请求转发到相应的 ServiceEntry

    由于该特性修改了 DNS 响应,因此可能无法兼容所有应用程序。

    尝试配置另外一个 ServiceEntry

    现在,发送一个请求: