← 返回首页
🧩

Sidecar模式:Envoy代理与日志收集

📂 architecture ⏱ 1 min 140 words

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模式。