如何部署Envoy EDS/SDS

155次阅读
没有评论

问题描述

有一个关于微服务部署的问题。他想知道如何部署Envoy SDS(服务发现服务),以便其他Envoy代理可以找到SDS服务器主机,以便发现其他服务并构建服务网格。他想知道是否应该将其放在带有DNS名称的负载均衡器后面(单点故障),还是在每台机器上本地运行SDS,以便其他微服务可以访问它?或者是否有更好的部署方式,可以在没有单点故障的情况下动态添加SDS集群到Envoy配置中?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

将SDS放在带有DNS名称的负载均衡器后面是一个不错的选择,可以提供合理的可用性。如果SDS宕机,Envoy将不会得到更新,因此这通常不是最关键的故障 – 新的主机和服务只是不会被添加到Envoy的集群/端点模型中。
如果您想要更高的可用性,可以设置多个集群。如果在启动配置中添加多个条目,Envoy将在它们之间进行故障转移。您可以指定多个DNS名称或多个IP地址。
以下是一个示例配置:

static_resources:
  clusters:
    - name: sds_cluster
      connect_timeout: 0.25s
      type: STRICT_DNS
      lb_policy: ROUND_ROBIN
      load_assignment:
        cluster_name: sds_cluster
        endpoints:
          - lb_endpoints:
              - endpoint:
                  address:
                    socket_address:
                      address: sds.example.com
                      port_value: 8080
          - lb_endpoints:
              - endpoint:
                  address:
                    socket_address:
                      address: sds.example.com
                      port_value: 8081

在上面的示例中,我们定义了一个名为sds_cluster的集群,并指定了两个SDS服务器的DNS名称和端口。Envoy将使用轮询策略在这两个服务器之间进行负载均衡。

方案2

另一种方法是将SDS/EDS直接列在私有DNS区域下。但这意味着需要在放置SDS的每个主机上设置一个静态端口,并且每个其他服务都必须将其作为已知常量传递。因此,后端微服务将获得一组可用的SDS服务器的IP地址,以检索应用程序服务的端点信息。这种方法不包括负载均衡器,但可以使用DNS支持的负载均衡功能。SDS使用脚本向DNS发送心跳。在AWS中实施时,SDS在ECS容器中运行,由ECS集群管理服务自动放置,SDS服务器中的心跳脚本使用AWS元数据服务获取和报告其IP地址给DNS。这种方法意味着几乎没有停机时间,因为DNS服务器几乎不会发生故障。但我们无法获得高级负载均衡功能。这种方法比在每个EC2主机上都有一个SDS要好,因为它将消耗更少的资源,并且不会遇到所有特定主机中的所有微服务失败的可能性,因为其本地SDS服务器失败。

方案3

还有一种方法是使用第三方服务发现工具,如Consul或etcd。这些工具提供了更高级的服务发现和负载均衡功能,并且可以与Envoy集成。您可以将SDS服务器配置为使用这些工具进行服务发现,并将Envoy配置为使用SDS服务器获取服务和端点信息。
请注意,这些解决方案都有其优缺点,具体取决于您的需求和环境。您可以根据自己的情况选择最适合的解决方案。

正文完