如何解决使用 Envoy 进行服务发现
它如何与 Envoy 配合使用?
假设我已经像这样配置了一个上游集群:
clusters:
-
name: "service_a_cluster"
connect_timeout: "0.25s"
type: "strict_dns"
lb_policy: "ROUND_ROBIN"
hosts:
-
socket_address:
address: "service_a"
port_value: 8786
我的 Envoy 实例(ClusterManager?)将如何解析 service_a
?
它将向谁发送 DNS 查询?
解决方法
Envoy 有内部的解析机制,这些都可以通过配置获得。看起来您正在使用 Envoy v2 api,因此相关的高级配置位于 cluster object here 中。
如果您阅读该内容,您会注意到 hosts
字段引用了 type
字段。这个 type
字段告诉特使如何处理发现/解析。该机制的完整细节是 here。
默认的 kubernetes 安装内置了 DNS 和服务发现。您可以在 kube-system
命名空间中找到相应的 pod。
$ kubectl get pods -n kube-system
[...]
kube-dns-6c7b8dc9f9-ngdq2 4/4 Running 0 25h
kube-dns-6c7b8dc9f9-pctnl 4/4 Running 0 26h
kube-dns-autoscaler-844c9d9448-sswll 1/1 Running 0 27h
[...]
在 1.12 版本之前,kubernetes 使用 kube-dns
进行 DNS 解析和服务发现(因此 pod 的名称)。目前它使用 CoreDNS。
Note 关于命名:
注意:CoreDNS 服务在 kube-dns
字段中被命名为 metadata.name
。
这是为了与依赖于旧 kube-dns 服务名称来解析集群内部地址的工作负载有更好的互操作性。使用名为 kube-dns 的服务可以抽象出在该通用名称后面运行的 DNS 提供商的实现细节。
因此,所有 DNS 查询实际上都转到这些 Pod,并由这些 Pod 解析。
说到 Istio,事情要复杂一些。以上适用于默认的 kubernetes 服务,任何自定义 ServiceEntry
s(例如 Istio 添加的那些)都不会被识别。
除了捕获应用程序流量外,Istio 还可以捕获 DNS 请求以提高网格的性能和可用性。在代理 DNS 时,来自应用程序的所有 DNS 请求都将被重定向到 sidecar,它存储域名到 IP 地址的本地映射。如果 sidecar 可以处理请求,它会直接向应用程序返回响应,避免到上游 DNS 服务器的往返。否则,请求将按照标准 /etc/resolv.conf
DNS 配置向上游转发。
虽然 Kubernetes 为 Kubernetes Service
提供开箱即用的 DNS 解析,但不会识别任何自定义 ServiceEntry
。使用此功能,无需自定义配置 DNS 服务器即可解析 erviceEntry
地址。对于 Kubernetes Service
,DNS 响应将相同,但 kube-dns
上的负载减少并提高了性能。
此功能也可用于在 Kubernetes 之外运行的服务。这意味着可以解析所有内部服务,而无需笨拙的解决方法来在集群外部公开 Kubernetes DNS 条目。
Source
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。