Vector 在 Kubernetes 中的聚合器横向扩展与负载均衡:基于 HAProxy 的架构方案解析

发布时间:2026/9/13 1:35:02
Vector 在 Kubernetes 中的聚合器横向扩展与负载均衡:基于 HAProxy 的架构方案解析 Vector 在 Kubernetes 中的聚合器横向扩展与负载均衡基于 HAProxy 的架构方案解析【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector导读本文以 Vector 官方 RFC 74692021-05-17《Scaling and load balancing for Vector aggregators in Kubernetes》为主体系统讲解 Vector 作为聚合器Aggregator在 Kubernetes 中横向扩展时面临的负载均衡问题、HAProxy 反向代理方案的动机与取舍并结合当前仓库中 vector-aggregator 的 Helm 生成的 Kubernetes 清单StatefulSet、headless Service、ConfigMap与vectorsink 的load_balance路由策略源码帮助读者掌握在 Kubernetes 中部署多副本 Vector 聚合器并接入 HAProxy 动态服务发现的完整思路与落地配置。背景与动机为什么聚合器需要负载均衡在 Vector 的典型部署架构中聚合器Aggregator承担着接收来自大量 Agent 的数据、执行聚合/处理、再转发到下游目的地如 Datadog、S3、Elasticsearch的角色。RFC 指出在方案提出之前Vector 聚合器仅能以单实例形态工作横向扩展增加副本数完全依赖人工操作这带来了两个核心问题可靠性单实例是明显的单点故障single point of failure任何一个节点或进程故障都会导致整个数据管线中断性能上限单实例的吞吐能力受限于可分配给它的资源CPU、内存、网络且存在尚未探明的上限。Vector 的定位是厂商中立vendor neutral因此它需要提供一种与环境、与上游事件采集器无关的横向扩展与负载均衡能力让用户无需替换已有基础设施即可可靠地以聚合器形态采用 Vector。RFC 将讨论范围聚焦到 Kubernetes 场景下的三个具体接入场景Vector Agent → Vector 聚合器Vector 内部组件间通信使用vectorsource/sinkDatadog Agent → Vector 聚合器datadog_agentsourceSyslogTCPAgent → Vector 聚合器syslogsource。同时明确排除的范围包括Kafkasource的扩展以及 Kubernetes 之外的平台上的扩展与负载均衡——后者意味着本方案以 Kubernetes 的服务发现能力DNS / headless Service为前提。内部提案随 vector-aggregator Helm Chart 内置专用反向代理RFC 的核心提案是在 vector-aggregator Helm Chart 中内置一个专用反向代理dedicated reverse proxy的配置开箱即用地提供基础但可用的配置让用户能够一键将 Vector 部署为可水平扩展的聚合器。代理需要动态解析下游 Vector 实例能够根据 Kubernetes 的服务发现动态获取所有聚合器副本允许用户调整负载均衡策略在需要一致目标如聚合类 transform的场景下提供更一致的命中目标如source亲和策略。候选代理选型上RFC 明确首选HAProxy其次考虑NGINX或Envoy。选型理由是对比维度HAProxyNGINX可观测性暴露更丰富的指标JSON 或 Prometheus 格式指标能力相对有限服务发现原生支持可动态填充配置需借助 Lua 脚本如 nginx-ingress-controller 的做法UDP 支持支持有限2.3 起可转发 syslog但不支持动态后端—HAProxy 动态服务发现配置示例RFC 给出了一个利用 Kubernetes 集群 DNS 做服务发现的基础 HAProxy 配置resolvers coredns nameserver dns1 kube-dns.kube-system.svc.cluster.local:53 hold timeout 600s hold refused 600s frontend vector bind *:9000 default_backend vector_template backend vector_template balance roundrobin option tcp-check server-template srv 10 _vector._tcp.vector-aggregator-headless.vector.svc.cluster.local resolvers coredns check逐段解读这段配置的工程含义resolvers coredns定义 DNS 解析器指向 Kubernetes 集群内的 CoreDNSkube-dns.kube-system.svc.cluster.local:53这是 HAProxy 动态服务发现的数据源hold timeout/hold refusedDNS 解析结果的有效期与拒绝缓存时长600 秒控制服务发现更新的节奏frontend vector监听*:9000与聚合器syslogsource 的默认端口对齐default_backend指向后端模板backend vector_templatebalance roundrobin指定轮询策略option tcp-check启用 TCP 健康检查server-template srv 10 _vector._tcp.vector-aggregator-headless.vector.svc.cluster.local关键的一行——通过 Kubernetes 的headless Servicevector-aggregator-headless暴露的 SRV 记录_vector._tcp动态发现最多 10 个后端实例并持续用resolvers coredns刷新、用check做健康探测。这里的 SRV 记录依赖正是仓库中 service-headless.yaml 所定义的clusterIP: None的 headless Service。当前仓库中该 Service 暴露了聚合器接收数据的全部端口均为 TCP端口名称对应 source8282datadog-agentdatadog_agent24224fluentfluent5044logstashlogstash8080splunk-hecsplunk_hec8125statsdstatsd9000syslogsyslog6000vectorvectorv29090prom-exporterprometheus_exporter内部指标这些端口的 source 定义可以在 configmap.yaml 中的aggregator.yaml里看到完整对应关系——例如syslog使用mode: tcp监听0.0.0.0:9000vector使用version: 2监听0.0.0.0:6000。这也印证了 RFC 中每个 source 需要独立端口的设定。与当前仓库的落地形态对照虽然 RFC 中规划的 HAProxy 部署并未出现在仓库的 vector-aggregator 清单目录中该目录由helm template生成包含 configmap、service-headless、service、serviceaccount、statefulset但从现有清单可以清晰看到支撑负载均衡的底层基础设施已经就位StatefulSet 形态statefulset.yaml 使用StatefulSetpodManagementPolicy: OrderedReadyserviceName: vector-headless副本以稳定、有序的方式扩容适合作为动态后端headless Serviceservice-headless.yaml 设置clusterIP: None使每个 Pod 拥有独立 DNS 记录并可通过 SRV 记录_vector._tcp被 HAProxy 的server-template发现就绪探针StatefulSet 配置了/health的readinessProbe端口 8686即 Vector API 端口代理层可据此将流量只导向就绪副本Agent 侧对称清单vector-agent 的 service-headless.yaml 暴露同样的端口集合说明 Agent 与 Aggregator 之间的vectorv2 通信端口6000在两侧保持一致。方案论证选择外部反向代理的 RationaleRFC 为外部反向代理方案给出了明确的论证理由与上游 Agent 解耦无论上游是什么采集器Vector Agent、Datadog Agent、syslog 等只要流量先经过代理负载均衡就对上游透明覆盖面广、工程成本低一个专用反向代理可以支持绝大多数source类型相比为每个 source 单独实现均衡逻辑是覆盖面与成本的平衡点不绑定 Vector 生态方案位于 Vector 之外用户可以在不替换现有基础设施的前提下可靠地采用 Vector 聚合器运维认知友好大多数组织对某种反向代理的运维都很熟悉关注点分离专用反向代理专注于其任务Vector 专注数据管道各司其职。权衡与缺点为方案付出的代价RFC 同样如实记录了该方案的缺点第三方组件维护负担团队需要维护一个第三方应用的配置并持续跟进其安全漏洞与版本更新集成测试成本需要将反向代理纳入新的或现有的集成测试防止提供的配置与代理版本之间出现回归部署复杂度上升端到端部署会多出一个应用调试时可能造成误导也增加运维负担UDP 支持受限HAProxy 对 UDP 代理支持有限因此初始实现无法为 UDP 类型的source提供负载均衡syslog over UDP 明确不支持HAProxy 的 syslog 转发不支持动态后端服务器因此初始实现仅覆盖 syslog over TCP。这一点与 RFC 开篇的 Scope 完全呼应——三个初始用例Vector Agent、Datadog Agent、Syslog TCP全部基于 TCP 协议。仓库中聚合器清单的syslogsource 也明确使用mode: tcp见 configmap.yaml与 RFC 的取舍一致。备选方案对比为什么最终不选它们RFC 系统评估了四类备选方案并说明了各自的不足什么都不做Do Nothing聚合器可以继续单实例运行、垂直扩展。这固然降低了复杂度但会导致单点故障并给吞吐量带来上限——这正是 Motivation 中要解决的问题本身。仅客户端侧负载均衡Only Client-side Load Balancing驱动 v2 Vectorsink/source的库本身具备客户端负载均衡能力但这只覆盖单一 sink → source配对。对于 Beats、Logstash 这类客户端虽然可以实现 Elasticsearch 兼容 API 来利用它们原生的负载均衡但这类做法一般是按 source 逐个实现无法覆盖所有 source。值得注意的是RFC 在Outstanding Questions中也确认内置负载均衡能力尤其vectorsink 侧更适合放在另一份 RFC 或按组件逐个推进——而这一方向已在当前仓库中落地详见下文。强制要求 Service MeshRequire a Service Mesh已采用 Service Mesh 的用户可以把负载均衡下放到网格但把 Service Mesh 作为运行和扩展 Vector 聚合器的前置条件是巨大的采用门槛。分布式哈希环Distributed hashringThanos、Loki 等项目用哈希环实现多租户可以确保事件被转发到正确的聚合器但 RFC 明确表态没有人想把 Vector 变成一个分布式系统——这超出了 Vector 的产品定位。内置负载均衡的后续演进vectorsink 的load_balance策略RFC 的 Outstanding Questions 中确认了是否要探索内置负载均衡能力这一问题结论是内置方案更适合单独推进。这一方向在仓库源码中已经实现当前 src/sinks/vector/config.rs 中定义了EndpointStrategy枚举为vectorsink 提供三种跨端点路由策略LoadBalance默认使用 Vector 的 Tower distributed service 在健康端点间分发请求端点健康状态由routing.health跟踪不健康的端点按配置退避backoff并重新探测。该模式不保活单个活动端点也不偏好第一个配置的端点Failover同一时刻只使用一个端点活动端点失败后按顺序切换到下一个端点直到成功请求被串行化以保证单一活动端点语义FailoverPrimary与Failover类似但活动端点失败后从配置顺序的头部重试从而在接收端如设置了max_connection_age_secs连接回收可用时收敛回第一个配置的主端点。其中LoadBalance模式在配置上依赖routing.healthconfig.rs健康检查在启动时对所有配置的端点执行见测试用例load_balancing_healthchecks_all_configured_endpoints_even_with_override_uriconfig.rs。这正是 RFC 设想中内置负载均衡能力where possible的落地当 Vector 集群内部组件间使用vectorsink 时客户端侧即可完成均衡而外部 AgentDatadog、syslog仍需依赖 RFC 主推的 HAProxy 方案。与高可用部署实践的衔接RFC 的负载均衡方案并非孤立存在它与仓库中 high-availability.md 描述的高可用策略相互配合节点/进程故障由负载均衡器 平台级自愈如 Kubernetes controller共同兜底——负载均衡器在某个 Vector 进程不可达时自动故障转移负载均衡器自身故障通过服务发现或 DNS 故障转移到备用负载均衡器这正是 RFC 中resolvers corednsserver-template动态发现机制的价值所在聚合器整体故障同样依赖服务发现与 DNS 完成故障转移。从 aggregator.md 的生产部署建议也能看到一致的导向在每个网络边界内部署多个聚合器使用 DNS 或服务发现将 Agent 流量路由到聚合器尽量使用基于 HTTP 的协议使用vectorsource 与 sink 做 Vector 间通信。这与 RFC 的 HAProxy headless Service 方案形成了架构层面的一致闭环。规划中的实施路径Plan Of AttackRFC 为方案落地列出了明确的实施清单可视为该能力从设计到交付的路线图手工验证 Vector Agent、Datadog Agent、syslog 三类流量经过代理后的功能正确性将可选的代理部署纳入 vector-aggregator Chart加入 Kubernetes e2e 测试套件并补充文档提供 Datadog Agent 在多个 Vector 聚合器间负载均衡的开箱即用配置加入 e2e 测试与文档提供开箱即用的代理可观测性数据采集与处理配置Datadog Agent 与 Vector 双通道让用户可以像路由其他数据一样路由代理的日志与指标并补充文档。这条路线体现了 RFC 的一个设计原则负载均衡能力必须开箱即用同时把可观测性代理自身的日志、指标、健康也纳入统一的数据管道——这也解释了 HAProxy 被选为首选代理的原因之一原生 Prometheus / JSON 指标输出。总结RFC 7469 为 Vector 聚合器在 Kubernetes 中的水平扩展给出了清晰、务实的答案用一个随 Chart 交付、支持 DNS 动态服务发现的 HAProxy 反向代理把来自 Vector Agent、Datadog Agent 与 syslogTCP的流量均衡到 headless Service 背后的一组 StatefulSet 副本上。它通过外部代理 Kubernetes 原生服务发现的组合兼顾了协议覆盖面、运维友好度与厂商中立性同时明确划定了 UDP 支持的边界而内置负载均衡的演进方向则在后续版本中以vectorsink 的LoadBalance策略在源码层面得到了实现。对于希望在 Kubernetes 中以高可用、可水平扩展方式运行 Vector 聚合器的用户本文的配置与权衡分析可直接作为架构决策与落地参考。【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考