【问题标题】:Service Discovery with Envoy使用 Envoy 进行服务发现
【发布时间】:2021-07-23 07:37:12
【问题描述】:

它如何与 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 查询?

【问题讨论】:

    标签: microservices istio envoyproxy


    【解决方案1】:

    Envoy 有内部解析机制,这些都可以通过配置获得。看起来您正在使用 Envoy v2 api,因此相关的高级配置位于 cluster object here

    如果您阅读该内容,您会注意到 hosts 字段引用了 type 字段。这个type 字段告诉特使如何处理发现/解决。该机制的完整细节是here

    【讨论】:

    • 感谢您的链接。我已经检查过了,但没有示例,非常简洁,仅提及 DNS 策略。你有例子吗?
    • 哦,当然;您可以使用的值只是这些值的大写字符串文字:STATICSTRICT_DNSLOGICAL_DNSEDSORIGINAL_DST another link
    • 我想问的是如何解析DNS查询?与谁交谈? 严格的 DNS 使用严格的 DNS 服务发现时,Envoy 会持续异步地解析指定的 DNS 目标。 DNS 结果中返回的每个 IP 地址都将被视为上游集群中的显式主机。这意味着如果查询返回三个 IP 地址,Envoy 将假定集群有三个主机,并且所有三个主机都应该负载均衡。 文档没有说明如何做。
    【解决方案2】:

    默认的 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 服务在metadata.name 字段中被命名为kube-dns
    这样可以与依赖传统 kube-dns 服务名称来解析集群内部地址的工作负载具有更大的互操作性。使用名为 kube-dns 的服务可以抽象出哪个 DNS 提供商在该通用名称后面运行的实现细节。

    所以,所有的 DNS 查询实际上都发往这些 pod,并由这些 pod 解析。


    说到 Istio,事情就有点复杂了。以上适用于默认的 kubernetes 服务,任何自定义的ServiceEntrys(例如 Istio 添加的)都不会被识别。

    除了捕获应用程序流量之外,Istio 还可以捕获 DNS 请求,以提高网格的性能和可用性。在代理 DNS 时,来自应用程序的所有 DNS 请求都将被重定向到 sidecar,其中存储了本地域名到 IP 地址的映射。如果请求可以被 Sidecar 处理,它将直接向应用程序返回响应,避免往返上游 DNS 服务器。否则,请求将按照标准/etc/resolv.conf DNS 配置向上游转发。

    虽然 Kubernetes 为 Kubernetes Services 提供了开箱即用的 DNS 解析,但任何自定义的 ServiceEntrys 都不会被识别。使用此功能,无需自定义配置 DNS 服务器即可解析erviceEntry 地址。对于 Kubernetes Services,DNS 响应将相同,但减少了 kube-dns 上的负载并提高了性能。

    此功能也可用于在 Kubernetes 之外运行的服务。这意味着可以解析所有内部服务,而无需采用笨拙的变通方法将 Kubernetes DNS 条目暴露在集群之外。
    Source

    【讨论】:

    • 香草特使怎么样?周围没有 k8。
    • 在我的回答中添加了有关 DNS 解析如何与 Istio 配合使用的更多信息。请记住 - Istio 使用 Envoy 进行代理,至少可以说,在没有 K8s 的情况下运行 Istio 是不切实际的,因此没有 K8s 就没有 Envoy。
    • 我了解它是如何与 k8 一起工作的。感谢您的回答,但我对准系统 Envoy 部署感到好奇,因为 Envoy 支持开箱即用的服务发现。
    • 好吧,你说的“准系统特使”是什么意思?
    • 我的意思是说,只有 Envoy,没有 k8 或 Istio。
    猜你喜欢
    • 2020-08-14
    • 1970-01-01
    • 2019-05-30
    • 2018-10-31
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多