侧边栏壁纸
  • 累计撰写 28 篇文章
  • 累计创建 23 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Envoy 集群管理概述

zhanjie.me
2025-09-15 / 0 评论 / 0 点赞 / 8 阅读 / 0 字

一、 集群管理器(cluster manager)

Envoy中的集群管理器(Cluster Manager)是一个关键组件,用于管理和维护所有上游集群(upstream clusters)。它负责维护集群的健康状态、执行负载均衡策略、路由请求等。
image-lckwubsu.png
以下是集群管理器的主要作用和使用方法:

1.1 主要作用

1. 集群发现和维护
集群管理器负责发现和维护集群。这包括动态添加和删除集群,以及维护集群的健康状态。
2. 负载均衡
集群管理器实现多种负载均衡策略,如轮询、最小请求、随机等。它负责在多个上游节点之间分发请求,以实现高可用性和优化资源利用。
3. 健康检查
集群管理器定期对集群中的各个节点进行健康检查,以确保只有健康的节点参与流量处理。健康检查可以是主动的(如发送ping请求)或被动的(如根据请求失败率判断)。
4. 路由请求
根据配置,集群管理器将传入的请求路由到适当的上游集群。这通常结合Envoy的路由规则和负载均衡策略来实现。
5. 熔断器(Circuit Breakers)
集群管理器实现熔断器机制,当检测到某个集群或节点故障率过高时,临时停止向其发送请求,以防止系统过载和雪崩效应。

1.2 使用方法

要使用集群管理器,需要在Envoy的配置文件中定义上游集群。以下是一个简单的配置示例:

static_resources:
  clusters:
  - name: service_cluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: service_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: service1.example.com
                port_value: 80

关键配置项解释

  • name: 定义集群的名称。
  • connect_timeout: 连接超时时间。
  • type: 集群类型,可以是 STATICSTRICT_DNSLOGICAL_DNSEDSSTRICT_DNS表示通过DNS解析来动态发现集群成员。
  • lb_policy: 负载均衡策略,例如 ROUND_ROBIN(轮询)、LEAST_REQUEST(最小请求)、RANDOM(随机)等。
  • load_assignment: 定义集群成员的地址信息。对于 STRICT_DNS类型,这里通常是域名和端口。

1.3 动态集群管理

Envoy支持通过xDS API(如CDS,Cluster Discovery Service)进行动态集群管理。使用xDS API,可以在运行时动态添加、更新或删除集群,而无需重启Envoy实例。

dynamic_resources:
  cds_config:
    api_config_source:
      api_type: GRPC
      grpc_services:
        envoy_grpc:
          cluster_name: xds_cluster

static_resources:
  clusters:
  - name: xds_cluster
    type: STATIC
    connect_timeout: 0.25s
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: xds_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: xdsserver
                port_value: 18000

动态资源配置解释

  • cds_config: 配置CDS,用于动态管理集群。
  • api_config_source: 指定API类型(如 GRPC),以及用于与xDS服务通信的集群名称。
  • static_resources中的 clusters: 配置用于与xDS服务通信的集群。

通过这些配置,Envoy可以在运行时从xDS服务获取最新的集群信息,动态调整上游集群配置。

1.4 监控和调试

Envoy提供了一些工具和接口来监控和调试集群管理器的状态,例如:

  • Admin接口:可以通过/admin接口查看集群状态、健康检查结果等。
  • 统计数据:Envoy会生成丰富的统计数据(metrics),包括集群级别的请求数、失败率、健康状态等,可以通过Prometheus等监控系统进行收集和展示。

总的来说,Envoy的集群管理器通过灵活的配置和强大的动态管理能力,帮助用户实现高效、可靠的上游集群管理,从而提升整个服务网格的可用性和性能。


二、 集群预热

在Envoy中,集群预热(Cluster Warming)是指在将新集群或更新后的集群正式投入使用之前,确保它们已经成功建立连接并准备好接收流量的过程。集群预热的目的是避免将请求发送到尚未完全准备好的集群节点,从而提高服务的可靠性和稳定性。

2.1 集群预热的工作机制

当Envoy检测到新集群或集群配置更新时,它不会立即开始将流量路由到该集群,而是首先执行以下步骤:

  1. 连接建立:Envoy尝试与集群中的所有上游节点建立连接。这包括执行必要的DNS解析、TCP连接建立以及TLS握手等过程。
  2. 健康检查:如果配置了健康检查,Envoy会对新集群中的节点执行健康检查,确保它们处于健康状态。
  3. 等待足够的节点准备好:Envoy会等待一定数量的节点成功建立连接并通过健康检查,这个数量由配置中的 preconnect参数或默认策略决定。
  4. 预热完成:当上述条件满足后,Envoy会认为集群已经预热完成,并开始将流量路由到该集群。

2.2 配置示例

下面是一个包含集群预热配置的示例:

集群预热是Envoy提供的一个重要功能,帮助用户在动态和复杂的服务网格环境中,确保流量路由的稳定性和可靠性。

static_resources:
  clusters:
  - name: new_service_cluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: new_service_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: newservice.example.com
                port_value: 80
    health_checks:
    - timeout: 1s
      interval: 10s
      unhealthy_threshold: 2
      healthy_threshold: 3
      tcp_health_check: {}

在这个示例中,集群 new_service_cluster 配置了健康检查。在预热过程中,Envoy会尝试与 newservice.example.com 的节点建立连接并执行健康检查。在足够多的节点准备好之前,Envoy不会将流量路由到这个集群。
优势
集群预热的主要优势包括:

  • 避免请求失败:在集群节点尚未完全准备好之前不会接收请求,减少因节点未准备好导致的请求失败。
  • 提升服务可靠性:确保只有健康的节点参与流量处理,提高整体服务的可靠性和稳定性。
  • 平滑的配置更新:在动态集群管理中,预热可以确保配置更新不会立即影响流量,使得新配置逐步生效。

三、集群配置框架

单个集群配置,v3格式集群配置内容

在Envoy的v3配置中,集群配置框架涉及多个重要部分,包括集群的基本信息、负载均衡策略、健康检查、连接设置等。
下面是一个使用v3格式配置单个集群的完整示例,并解释了每个配置项的作用:

这个配置示例展示了如何使用Envoy的v3配置格式来定义一个集群的详细信息。通过调整这些配置项,可以实现对集群的精细管理和优化。

static_resources:
  clusters:
  - name: example_service_cluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: example_service_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: example.com
                port_value: 80
    health_checks:
    - timeout: 1s
      interval: 10s
      unhealthy_threshold: 2
      healthy_threshold: 3
      tcp_health_check: {}
    circuit_breakers:
      thresholds:
      - priority: DEFAULT
        max_connections: 100
        max_pending_requests: 1000
        max_requests: 1000
        max_retries: 3
    outlier_detection:
      consecutive_5xx: 5
      interval: 10s
      base_ejection_time: 30s
      max_ejection_percent: 50
    dns_refresh_rate: 5s
    dns_lookup_family: V4_ONLY
    http2_protocol_options: {}  # 如果使用HTTP/2,请配置此项

配置项解释

基本信息

  • name: 定义集群的名称。这里为 example_service_cluster
  • connect_timeout: 设置连接超时时间,例如 0.25s表示250毫秒。
  • type: 指定集群的类型,这里使用 STRICT_DNS,表示通过DNS解析来动态发现集群成员。
  • lb_policy: 定义负载均衡策略,例如 ROUND_ROBIN 表示轮询策略。

集群成员

  • load_assignment: 定义集群成员的地址信息。
    • cluster_name: 集群名称,应该与上面的 name 一致。
    • endpoints: 定义上游节点列表。
      • lb_endpoints: 每个负载均衡节点的配置。
        • endpoint: 定义单个节点的详细信息。
          • address: 节点的地址信息。
            • socket_address: 使用socket地址。
              • address: 上游节点的域名或IP地址,这里为 example.com
              • port_value: 上游节点的端口号,这里为 80。

健康检查

  • health_checks: 定义健康检查配置。
    • timeout: 健康检查的超时时间。
    • interval: 健康检查的间隔时间。
    • unhealthy_threshold: 节点被标记为不健康前的失败次数。
    • healthy_threshold: 节点被标记为健康前的成功次数。
    • tcp_health_check: 使用TCP进行健康检查。

熔断器(Circuit Breakers)

  • circuit_breakers: 定义熔断器配置。
    • thresholds: 配置阈值。
      • priority: 优先级,这里为 DEFAULT
      • max_connections: 最大连接数。
      • max_pending_requests: 最大挂起请求数。
      • max_requests: 最大请求数。
      • max_retries: 最大重试次数。

异常检测(Outlier Detection)

  • outlier_detection: 定义异常检测配置。
    • consecutive_5xx: 触发驱逐操作前连续的5xx错误次数。
    • interval: 检查间隔时间。
    • base_ejection_time: 节点被驱逐的基础时间。
    • max_ejection_percent: 最大驱逐百分比。

DNS配置

  • dns_refresh_rate: DNS刷新频率。
  • dns_lookup_family: DNS查找的IP协议类型,这里为 V4_ONLY

HTTP/2协议配置

  • http2_protocol_options: 配置HTTP/2协议选项,如果需要支持HTTP/2,可以配置此项。

四、 服务发现机制

在Envoy中,服务发现机制是指Envoy如何找到和维护上游服务实例的信息。服务发现机制允许Envoy自动发现和更新上游服务的地址信息,以便进行负载均衡和路由。Envoy支持多种服务发现机制,包括静态配置、DNS服务发现、EDS(Endpoint Discovery Service)等。以下是几种主要的服务发现机制及其工作原理:

4.1 静态服务发现

静态服务发现是通过在Envoy配置文件中直接指定上游服务的地址信息。这种方式适用于上游服务的地址相对固定的情况。

static_resources:
  clusters:
  - name: static_service_cluster
    connect_timeout: 0.25s
    type: STATIC
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: static_service_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 10.0.0.1
                port_value: 80
        - endpoint:
            address:
              socket_address:
                address: 10.0.0.2
                port_value: 80

4.2 DNS服务发现

DNS服务发现通过DNS解析来获取上游服务的地址信息,适用于动态变化的服务环境。Envoy可以定期刷新DNS记录以更新上游服务的地址。

static_resources:
  clusters:
  - name: dns_service_cluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: dns_service_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: service.example.com
                port_value: 80
    dns_refresh_rate: 5s
    dns_lookup_family: V4_ONLY

在 Envoy 中,STRICT_DNSLOGICAL_DNS 是两种截然不同的 DNS 服务发现类型,用于配置集群(Cluster)如何通过 DNS 找到上游(upstream)服务。

4.2.1 STRICT_DNS(严格DNS)

STRICT_DNS(严格 DNS)是最直接、最传统的方式。

  • 工作原理:Envoy 会对 DNS 记录执行一次完整的查询,并获取所有返回的 IP 地址。然后,它将这些 IP 地址列表视为集群中所有可用的、健康的端点。Envoy 会定期(基于 DNS 记录的 TTL)刷新这个列表,以应对 IP 地址的变化。
  • 适用场景
    • 静态 DNS 记录:当上游服务的 IP 地址相对稳定,或者由传统的 DNS 负载均衡器(DNS-based Load Balancing)管理时。
    • 已知端点列表:例如,一个 DNS 记录(A 记录)返回多个 IP 地址,每个 IP 都是一个独立的后端服务器。Envoy 会将流量均匀地分发给这些 IP。
  • 特点:Envoy 知道集群中的所有端点,并可以基于其负载均衡策略(如轮询、最少请求等)将流量分发给它们。
  • 示例配置:
static_resources:
  clusters:
  - name: strict_dns_cluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: strict_dns_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: service.example.com
                port_value: 80
    dns_refresh_rate: 5s
    dns_lookup_family: V4_ONLY

在这个示例中,service.example.com 会每5秒解析一次,以获取最新的IP地址列表。

4.2.2 LOGICAL_DNS(逻辑DNS)

LOGICAL_DNS(逻辑 DNS)则是一种更动态、更灵活的方式,专门为那些 IP 地址经常变化的云环境设计。

  • 工作原理:当 Envoy 需要为新的连接查找上游服务时,它会执行一次 DNS 查询,但只使用查询结果中的一个 IP 地址(通常是第一个)。Envoy 会将这个 IP 地址视为一个临时的“逻辑主机”,并向其发送请求。对于每个新的连接,Envoy 可能会再次执行 DNS 查询,这意味着它永远不会缓存完整的 IP 列表,而是动态地、按需地解析 IP。
  • 适用场景
    • 云负载均衡器:这是最典型的应用场景,例如 AWS 的弹性负载均衡器(ELB)或阿里云的 SLB。这些服务的 DNS 记录(CNAME)背后所对应的 IP 地址会频繁变动。
    • 动态 IP 服务:当你的上游服务没有固定的 IP 地址,或者 IP 地址可能随时被回收和重新分配时。
  • 特点:Envoy 并不维护一个完整的端点列表,因此它的负载均衡策略会受到限制,通常只会向最近解析的 IP 发送请求。它牺牲了负载均衡的粒度,换来了对动态 IP 环境的完美适应。
  • 示例配置:
static_resources:
  clusters:
  - name: logical_dns_cluster
    connect_timeout: 0.25s
    type: LOGICAL_DNS
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: logical_dns_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: service.example.com
                port_value: 80
    dns_lookup_family: V4_ONLY

主要区别总结

特性STRICT_DNSLOGICAL_DNS
解析方式解析所有 IP 地址,并维护一个端点列表。每次连接时按需解析,只使用一个 IP。
端点管理缓存并维护集群中所有端点的完整列表。不缓存端点列表,动态生成“逻辑主机”。
负载均衡支持各种负载均衡算法(轮询、最少请求等)。简单地向解析的单个 IP 发送请求。
适用场景静态 IP 列表、传统 DNS 负载均衡。动态 IP 环境、云负载均衡器(AWS ELB)。
主要目标保持对所有可用端点的全面认知。保证总是能连接到最新的、正确的 IP。

简而言之,如果你知道所有的后端服务器,就用 STRICT_DNS;如果你只知道一个动态的域名,而其背后的 IP 地址可能会随时变化,那就用 LOGICAL_DNS

4.2.3 EDS(Endpoint Discovery Service)

EDS是xDS API的一部分,通过控制平面动态管理和下发上游服务的地址信息。EDS适用于需要灵活和动态服务发现的大规模微服务架构。
控制平面配置(假设使用xDS Server)

dynamic_resources:
  cds_config:
    api_config_source:
      api_type: GRPC
      grpc_services:
        envoy_grpc:
          cluster_name: xds_cluster

static_resources:
  clusters:
  - name: xds_cluster
    type: STATIC
    connect_timeout: 0.25s
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: xds_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: xds-server.example.com
                port_value: 443

EDS配置示例

dynamic_resources:
  lds_config:
    ads: {}
  cds_config:
    ads: {}
  ads_config:
    api_type: GRPC
    grpc_services:
      envoy_grpc:
        cluster_name: xds_cluster

在EDS配置中,Envoy通过xDS API与控制平面通信,动态获取集群和端点信息。lds_configcds_config 使用ADS(Aggregated Discovery Service)配置,通过 ads_config 与xDS Server通信。

4.2.4 自定义服务发现

Envoy还可以通过文件系统、HTTP服务、GRPC服务等方式进行自定义服务发现。以下是通过文件系统进行服务发现的示例:

static_resources:
  clusters:
  - name: file_service_cluster
    connect_timeout: 0.25s
    type: STATIC
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: file_service_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 127.0.0.1
                port_value: 8080

dynamic_resources:
  cds_config:
    api_config_source:
      api_type: REST
      cluster_names:
      - file_service_cluster
      refresh_delay: 30s
      refresh_rate: 5s
      file_config_source:
        path: /etc/envoy/cds.yaml

在这个示例中,Envoy通过读取文件系统中的配置文件来更新服务发现信息。

0

评论区