跳到主要内容

Kubernetes Envoy

介绍

Envoy 是一个高性能的开源代理,专为云原生应用设计。它由 Lyft 开发,现已成为服务网格(Service Mesh)中的核心组件之一。Envoy 的主要功能包括负载均衡、服务发现、TLS 终止、健康检查、流量控制和可观测性。

在 Kubernetes 中,Envoy 通常作为服务网格的数据平面(Data Plane)使用,与 Istio、Linkerd 等服务网格控制平面(Control Plane)配合工作。Envoy 通过拦截和管理服务之间的通信,帮助开发者实现更复杂的流量管理、安全性和可观测性需求。

Envoy 的核心功能

Envoy 提供了以下核心功能:

  1. 负载均衡:Envoy 支持多种负载均衡算法,如轮询、加权轮询和最少连接数。
  2. 服务发现:Envoy 可以动态发现服务实例,并自动更新路由规则。
  3. TLS 终止:Envoy 可以处理 TLS 加密和解密,减轻后端服务的负担。
  4. 健康检查:Envoy 可以定期检查后端服务的健康状态,并自动剔除不健康的实例。
  5. 流量控制:Envoy 支持基于权重的流量拆分、速率限制和熔断机制。
  6. 可观测性: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,开发者可以轻松实现复杂的服务间通信需求。

附加资源

练习

  1. 在 Kubernetes 集群中部署 Envoy,并配置一个简单的 HTTP 路由。
  2. 尝试使用 Envoy 实现基于权重的流量拆分。
  3. 配置 Envoy 的熔断机制,并测试其效果。
提示

Envoy 的配置非常灵活,建议从简单的配置开始,逐步增加复杂性。