Sidecar模式:Envoy代理与日志收集
Sidecar模式:Envoy代理与日志收集
Sidecar模式概念
Sidecar模式是将辅助功能部署为与主应用并行运行的进程,共享网络和存储。Sidecar处理日志、监控、安全、网络代理等横切关注点,使主应用专注于业务逻辑。在Kubernetes中,Sidecar通常以Init Container或额外容器的形式部署在Pod中。
# Kubernetes Pod Sidecar配置
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: myapp
image: myapp:latest
ports:
- containerPort: 8080
- name: envoy-sidecar
image: envoyproxy/envoy:v1.28
ports:
- containerPort: 9901
volumeMounts:
- name: envoy-config
mountPath: /etc/envoy
Envoy代理在Sidecar中的应用
Envoy是CNCF毕业项目,作为高性能L4/L7代理,在服务网格中承担流量管理、负载均衡、熔断、重试等职责。在Istio架构中,每个服务Pod都注入Envoy Sidecar,形成透明的代理层。
# Envoy配置示例 - 路由与熔断
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
route_config:
virtual_hosts:
- name: backend
routes:
- match: { prefix: "/" }
route:
cluster: upstream_service
retry_policy:
retry_on: "5xx"
num_retries: 3
http_filters:
- name: envoy.filters.http.fault
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.fault.v3.Fault
delay:
percentage: { value: 10 }
fixed_duration: { milliseconds: 5000 }
Fluentd日志收集Sidecar
Fluentd作为日志收集Sidecar,统一收集应用日志并转发到集中存储。每个Pod运行Fluentd Sidecar,通过共享Volume读取应用日志文件。
# Fluentd配置 - 收集容器日志
<source>
@type tail
path /var/log/app/*.log
pos_file /var/log/app.log.pos
tag app.log
format json
</source>
<filter app.log>
@type record_transformer
<record>
hostname "#{Socket.gethostname}"
pod_name "${ENV['POD_NAME']}"
namespace "${ENV['POD_NAMESPACE']}"
</record>
</filter>
<match app.log>
@type elasticsearch
host elasticsearch.logging.svc.cluster.local
port 9200
index_name app-logs
type_name _doc
</match>
Sidecar模式的优势与挑战
优势:语言无关性、关注点分离、独立部署升级、故障隔离。挑战:资源开销(每个Pod额外消耗CPU和内存)、网络延迟(额外跳转)、调试复杂度。建议在服务网格、多语言微服务、统一可观测性等场景使用Sidecar模式。