求助:使用EnvoyFilter将Envoy访问日志发送至Kafka的可行方案
问题
我需要一个能将Envoy访问日志发送至Kafka的EnvoyFilter。目前我使用envoy.extensions.access_loggers.file.v3.FileAccessLog将日志输出到标准输出,但未找到将访问日志发送至Kafka的方法,尝试通过typed_config自动实现,编写了如下配置:
apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata: name: access-logs-to-kafka spec: workloadSelector: labels: app: my-app configPatches: - applyTo: ACCESS_LOG match: context: SIDECAR_INBOUND patch: operation: INSERT_BEFORE value: name: envoy.access_loggers.kafka typed_config: "@type": type.googleapis.com/envoy.extensions.access_loggers.kafka.v3.KafkaSink config: brokers: - broker.kafka.svc.cluster.local:9092 topic: access-logs message_format: "%START_TIME% %REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL% %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-REQUEST-ID)% %UPSTREAM_HOST%\n"
但似乎不存在KafkaSink组件,也未找到其他解决办法,请问各位有类似实践经验吗?
解决方案
Envoy官方并未内置Kafka访问日志插件,以下是两种可行的实现方案:
方式一:File Access Log + 日志采集工具(推荐)
- 保留现有
FileAccessLog配置,将日志输出到标准输出或指定文件 - 在Pod中部署日志采集sidecar(如Fluentd、Filebeat),或用DaemonSet做集群级部署
- 配置采集工具监听Envoy日志,格式化后发送至Kafka
这种方案兼容性强,无需修改Envoy核心配置,运维成本低。以Fluentd为例,核心配置示例如下:
<source> @type tail path /var/log/envoy/access.log # 若监听标准输出则用/dev/stdout tag envoy.access <parse> @type regexp expression /^(?<start_time>[^ ]*) (?<method>[^ ]*) (?<path>[^ ]*) (?<protocol>[^ ]*) (?<response_code>[^ ]*) (?<response_flags>[^ ]*) (?<bytes_received>[^ ]*) (?<bytes_sent>[^ ]*) (?<duration>[^ ]*) (?<request_id>[^ ]*) (?<upstream_host>[^ ]*)$/ </parse> </source> <match envoy.access> @type kafka2 brokers broker.kafka.svc.cluster.local:9092 topic access-logs <format> @type json </format> </match>
方式二:自定义Envoy访问日志插件(开发成本高)
- 基于Envoy Extension API开发自定义Kafka访问日志插件
- 编译包含该插件的自定义Envoy镜像,替换Istio默认Envoy镜像
- 通过EnvoyFilter配置启用自定义访问日志器
此方案需要具备Envoy插件开发能力,适合高度定制化场景,但运维维护成本较高。
内容的提问来源于stack exchange,提问作者amir.m ghazanfari
相关产品推荐
相关产品推荐

