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
:
现在,发送一个请求: