Kubernetes Envoy
介绍
Envoy 是一个高性能的开源代理,专为云原生应用设计。它由 Lyft 开发,现已成为服务网格(Service Mesh)中的核心组件之一。Envoy 的主要功能包括负载均衡、服务发现、TLS 终止、健康检查、流量控制和可观测性。
在 Kubernetes 中,Envoy 通常作为服务网格的数据平面(Data Plane)使用,与 Istio、Linkerd 等服务网格控制平面(Control Plane)配合工作。Envoy 通过拦截和管理服务之间的通信,帮助开发者实现更复杂的流量管理、安全性和可观测性需求。
Envoy 的核心功能
Envoy 提供了以下核心功能:
- 负载均衡:Envoy 支持多种负载均衡算法,如轮询、加权轮询和最少连接数。
- 服务发现:Envoy 可以动态发现服务实例,并自动更新路由规则。
- TLS 终止:Envoy 可以处理 TLS 加密和解密,减轻后端服务的负担。
- 健康检查:Envoy 可以定期检查后端服务的健康状态,并自动剔除不健康的实例。
- 流量控制:Envoy 支持基于权重的流量拆分、速率限制和熔断机制。
- 可观测性:Envoy 提供了丰富的指标、日志和跟踪功能,帮助开发者监控和调试服务。
Envoy 在 Kubernetes 中的部署
在 Kubernetes 中,Envoy 通常以 Sidecar 模式部署。这意味着每个 Pod 都会运行一个 Envoy 容器,负责拦截和管理该 Pod 的所有进出流量。
以下是一个简单的 Envoy 配置文件示例:
yaml
static_resources:
listeners:
- name: listener_0
address:
socket_address:
address: 0.0.0.0
port_value: 8080
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: backend
domains: ["*"]
routes:
- match:
prefix: "/"
route:
cluster: backend_service
http_filters:
- name: envoy.filters.http.router
clusters:
- name: backend_service
connect_timeout: 0.25s
type: STRICT_DNS
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: backend_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: backend
port_value: 80
在这个配置中,Envoy 监听 8080 端口,并将所有流量转发到名为 backend_service
的后端服务。
实际应用场景
流量拆分
假设你有一个新版本的服务,希望逐步将流量从旧版本迁移到新版本。Envoy 可以通过配置实现基于权重的流量拆分。例如,将 90% 的流量路由到旧版本,10% 的流量路由到新版本。
yaml
routes:
- match:
prefix: "/"
route:
weighted_clusters:
clusters:
- name: old_version
weight: 90
- name: new_version
weight: 10
熔断机制
Envoy 支持熔断机制,当后端服务出现故障时,Envoy 可以自动停止向该服务发送请求,防止故障扩散。
yaml
clusters:
- name: backend_service
connect_timeout: 0.25s
type: STRICT_DNS
lb_policy: ROUND_ROBIN
circuit_breakers:
thresholds:
max_connections: 100
max_pending_requests: 1000
max_requests: 500
max_retries: 3
总结
Envoy 是 Kubernetes 服务网格中的关键组件,提供了强大的流量管理、安全性和可观测性功能。通过将 Envoy 部署为 Sidecar,开发者可以轻松实现复杂的服务间通信需求。
附加资源
练习
- 在 Kubernetes 集群中部署 Envoy,并配置一个简单的 HTTP 路由。
- 尝试使用 Envoy 实现基于权重的流量拆分。
- 配置 Envoy 的熔断机制,并测试其效果。
提示
Envoy 的配置非常灵活,建议从简单的配置开始,逐步增加复杂性。