一、 集群管理器(cluster manager)
Envoy中的集群管理器(Cluster Manager)是一个关键组件,用于管理和维护所有上游集群(upstream clusters)。它负责维护集群的健康状态、执行负载均衡策略、路由请求等。

以下是集群管理器的主要作用和使用方法:
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: 集群类型,可以是STATIC、STRICT_DNS、LOGICAL_DNS或EDS。STRICT_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检测到新集群或集群配置更新时,它不会立即开始将流量路由到该集群,而是首先执行以下步骤:
- 连接建立:Envoy尝试与集群中的所有上游节点建立连接。这包括执行必要的DNS解析、TCP连接建立以及TLS握手等过程。
- 健康检查:如果配置了健康检查,Envoy会对新集群中的节点执行健康检查,确保它们处于健康状态。
- 等待足够的节点准备好:Envoy会等待一定数量的节点成功建立连接并通过健康检查,这个数量由配置中的 preconnect参数或默认策略决定。
- 预热完成:当上述条件满足后,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_DNS 和 LOGICAL_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_DNS | LOGICAL_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_config 和 cds_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通过读取文件系统中的配置文件来更新服务发现信息。
评论区