拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Calico Goldmane 网络流量聚合服务:架构、gRPC API 与实战接入指南

Calico Goldmane 网络流量聚合服务:架构、gRPC API 与实战接入指南 网络云原生网络安全【免费下载链接】calicoCloud native networking and network security项目地址https://gitcode.com/gh_mirrors/cal/calico点击查看免费下载Goldmane 是 Calico 项目中的网络流量Flow聚合服务为 Kubernetes 集群提供集中式的网络活动视图。本文以 goldmane/README.md 为主线结合 goldmane/DESIGN.md、goldmane/CLAUDE.md 及源码实现系统讲解 Goldmane 的组件构成、gRPC 服务定义、聚合引擎内部机制、环境变量配置、可观测性指标并给出从生产集群中获取证书、端口转发到编写客户端代码的完整接入流程帮助你快速理解并上手这个面向 Kubernetes 的流式聚合与查询系统。Goldmane 是什么Goldmane 是一个流聚合服务flow aggregation service它为 Kubernetes 集群中的网络流量提供一个中央聚合视图。集群中每个节点的 FelixCalico 数据面组件负责采集本节点上的连接级流量数据通过 gRPC 流式上报给 GoldmaneGoldmane 将来自所有节点的流量按节点维度与时间维度进行聚合形成集群级别的网络活动全貌并对外提供查询能力。从 goldmane/DESIGN.md 可以看出Goldmane 承担了三类职责采集Collect通过 gRPC 接收来自各节点 Felix 的流数据聚合与存储Aggregate Store跨节点、跨时间聚合流量并在内存中维护一段可查询的历史窗口服务与转发Serve Emit为 Whisker UI 等消费方提供流量查询 API并可选地将聚合结果推送到上游 HTTP 端点。关键代码包一览goldmane/README.md 中列出了构成 Goldmane 的核心包结合仓库目录结构可以确认它们各自的分工包职责goldmane/proto定义 Flow 数据结构与 Goldmane 提供的 gRPC 服务goldmane/pkg/aggregator收集集群各节点上报的流信息并跨节点聚合构建集群级网络活动视图goldmane/pkg/clientGoldmane gRPC 客户端的 Go 封装goldmane/pkg/serverGoldmane gRPC 服务端的 Go 封装goldmane/pkg/emitter周期性地将时间聚合后的流信息推送到已配置的上游端点goldmane/pkg/typesGoldmane 内部使用的类型定义此外goldmane/DESIGN.md 还补充了更多工程性组件cmd/是主入口调用daemon.Run()并基于环境变量加载配置cmd/stream/是连接 Goldmane 打印实时流的调试 CLIcmd/flowgen/是生成模拟流量数据的测试工具cmd/health/是健康检查二进制pkg/daemon/负责 gRPC 服务器、TLS、健康检查、emitter 与 sink 的装配pkg/goldmane/是核心聚合引擎单主循环串行化流摄入、rollover、查询、流回填、sink 变更等全部操作pkg/storage/提供BucketRing环形缓冲区与DiachronicFlow时序数据结构fv/目录则包含使用原生go test而非 Ginkgo编写的功能验证测试。整体数据流goldmane/DESIGN.md 用一张数据流图清晰地描述了信息的走向Felix (per-node) --gRPC-- FlowCollector -- Goldmane main loop -- BucketRing | | | -- Flows/Statistics gRPC queries | -- Stream subscriptions | -- (on rollover) -- Emitter -- upstream HTTP endpoint可以将其理解为三段式流水线摄入端每个节点上的 Felix 通过FlowCollector.Connect双向流式 RPC 上报FlowUpdateGoldmane 将流量按上报节点打上标签节点来源取自对端 IP且重连后仍然保留聚合端Goldmane 主循环将流写入BucketRing按固定时间桶聚合并在 rollover 时推送给 sink、通知流订阅者消费端Flows服务响应查询列表、实时流、过滤提示Statistics服务提供按策略/规则统计的时序数据emitter 则把聚合结果推送到上游 HTTP 端点。gRPC 服务与 Proto 定义Goldmane 在单个启用 TLS 的端口默认443Kubernetes 集群中通常通过 Service 以7443暴露上暴露三个服务全部定义在 goldmane/proto/api.proto 中FlowCollector接收来自每个节点 Felix 的流式流量更新ConnectRPC双向流式。客户端每次连接或重连后应重放此前已发送的FlowUpdate副本以便服务器重建缓存同时发送尚未传输过的新更新服务器负责必要的去重。每个FlowUpdate都会收到一个FlowReceipt作为回执。Flows面向消费者Whisker UI、调试工具提供流量查询包含三个 RPCList(FlowListRequest) returns (FlowListResult)分页查询一个或多个 FlowStream(FlowStreamRequest) returns (stream FlowResult)返回长连接实时流持续推送新生成的 FlowFilterHints(FilterHintsRequest) returns (FilterHintsResult)发现可用的过滤条件如命名空间、源/目的名称支持基于其他过滤条件逐步收窄供 UI 实现自动补全式筛选。FlowListRequest是查询的核心参数值得逐字段理解start_time_gte/start_time_lt时间窗口边界三种取值语义——0表示服务器侧最旧可用时间start_time_lt为 0 则代表现在正数表示 Unix 时间戳秒负数表示相对现在的秒数page/page_size分页参数注意页面会随数据新增或过期而变化同一页在不同时刻查询结果可能不同sort_by排序方式SortBy枚举Time、DestName、DestNamespace、DestType、SourceName、SourceNamespace、SourceType目前仅支持单个排序项filter过滤条件见下文aggregation_interval生成返回 Flow 时的聚合时间窗口宽度秒必须是 15 的倍数。Filter消息支持按源名称、源命名空间、目的名称、目的命名空间、协议均为StringMatch可精确匹配Exact或模糊匹配Fuzzy同字段多条取 OR、目的端口PortMatch、动作ActionAllow/Deny/Pass、策略PolicyMatch、reporterSrc/Dst以及 pending 动作进行组合过滤。FlowStreamRequest中的aggregation_interval必须恒为 15s它同时决定每个 Flow 流式更新的频率和每条FlowResult覆盖的时间宽度对于持续有流量的 Flow服务器会推送覆盖[now-2*interval, now-interval]区间的数据以保证数据尽可能完整。Statistics按策略Policy/策略规则PolicyRule粒度提供统计可选返回时序数据。StatisticsRequest支持StatisticTypePacketCount、ByteCount、LiveConnectionCount、StatisticsGroupBy按策略或按规则分组、PolicyMatch过滤以及time_series开关——为 true 时返回时间窗口内的多个数据点为 false 时整个窗口聚合为单个数据点。StatisticsResult按 ingress/egress 方向给出 allowed/denied/passed 三类计数的重复数组x数组承载时序数据的横轴时间戳。Flow 与 FlowKey 的数据模型Flow是聚合后的统计消息包含标识字段FlowKey、起止时间end_time恒比start_time至少晚一个聚合窗口、源/目的标签交集以及统计字段packets_in/out、bytes_in/out、num_connections_started窗口内发起的连接尝试数、num_connections_completed完成的 TCP 连接数、num_connections_live在end_time时刻仍活跃的连接数。FlowKey定义了一条流的身份源/目的的名称、命名空间与端点类型EndpointTypeWorkloadEndpoint/HostEndpoint/NetworkSet/Network目的端口与服务信息dest_service_name等L4 协议TCP、UDP、SCTP、ICMPreporter在连接发起端src或终止端dst测量最终动作Action以及策略轨迹PolicyTrace。PolicyTrace同时包含已生效的enforced_policies与预期的pending_policies含 staged 策略PolicyHit携带策略的 kind、namespace、name、tier、action、policy/rule 索引其中kindEndOfTier时trigger指向触发 tier 末尾动作的首个策略。核心概念BucketRing、Rollover、Emission Claims 与 Sinkgoldmane/DESIGN.md 定义了五个关键概念它们是 Goldmane 协议级契约的基石BucketRing由AggregationBucket组成的环形缓冲区每个桶覆盖固定时间间隔默认 15s。rollover 时回收最旧的桶。默认保留242 个桶——1 个正在填充的当前桶 1 个为容忍时间偏差而预留的未来桶 240 个历史桶在默认设置下可提供约1 小时的内存历史常量numBuckets 242定义于 goldmane/pkg/goldmane/goldmane.go。DiachronicFlow跟踪单一 flow key 在所有时间桶上的统计数据是存储每条流时序数据的核心结构实现在 goldmane/pkg/storage/diachronic_flow.go。Emission claims每个桶记录各节点已向该桶上报了哪些流以流、起始时间、结束时间、节点为键。客户端在连接重置后会重放最多五分钟的流统计因此会累加claim 的作用就是防止重放导致重复计数当某个桶回退到客户端无法重放的深度时rollover 会清除其 claims。Rollover每隔一个AggregationWindow15s主循环推进环形缓冲区。rollover 时旧桶被推送到 sink若已配置同时流订阅者收到更新。Sink聚合流的下游消费方即 emitter可通过文件监听FileConfigPath在运行期动态启用/禁用无需重启进程。单主循环架构goldmane/pkg/goldmane/goldmane.go 中的Goldmane结构是聚合引擎的核心它通过一个单主循环串行化处理所有操作recvChan接收的流批次、rollover 定时器、listRequests/filterHintsRequests/statisticsRequests查询请求、streams.Backfills()流回填请求以及sinkChan上的 sink 变更请求。这种设计保证了并发安全与数据一致性但也意味着任何不能在循环内快速完成的新操作都需要显式设计例如长耗时查询不能简单go一个协程绕过。流管理器则运行在独立 goroutine 上异步处理流的创建与关闭。Receive方法向recvChan写入FlowFromNode缓冲深度channelDepth 5000批处理上限batchSize 1000写入超时5s时递增goldmane_aggr_dropped_flows_total并丢弃该流。BucketRing 的工程细节goldmane/pkg/storage/bucket_ring.go 展示了BucketRing的实现环形数组 headIndex头指针diachronicsmap 提供 flow key 到DiachronicFlow的快速查找为支持排序查询维护了按DestName、DestNamespace、SourceName、SourceNamespace构建的索引默认索引是基于时间的RingIndex。初始化时会向未来扩展一个 interval 的桶以容纳时钟略微超前节点的流量避免漏采。设计评审注记来自 goldmane/DESIGN.md强调桶布局、rollover 节奏、emit 语义、sink 重载协议这五者任何一项的变更都属于协议级变更会影响到 Felix 的流上报方、Whisker 以及 emitter 的上游消费者修改BucketRing容量或AggregationWindow默认值会直接影响内存占用变更前应做基准测试。环境变量配置Goldmane全部配置均通过环境变量注入在 goldmane/pkg/daemon/config.go 的Config结构中定义使用envconfig解析并由 goldmane/pkg/daemon/daemon.go 的Run()消费。完整参数表如下环境变量默认值说明LOG_LEVELinfo日志级别PORT443gRPC 监听端口PUSH_URL空流量发射emission的 HTTP 端点为空则不启用 emitterFILE_CONFIG_PATH空Goldmane 运行期配置文件的路径用于监听并热更新不需要重启的配置子集当前支持 sink 开关AGGREGATION_WINDOW15s每个聚合桶的时长EMIT_AFTER_SECONDS30从流到达算起、允许被推送到 emitter 前的等待秒数必须为聚合窗口的整数倍。增大此值会提高发射延迟减小则可能发射不完整数据EMITTER_AGGREGATION_WINDOW5m每次发射所聚合的时间窗口宽度必须为聚合窗口的整数倍。发射的流聚合范围是[now-EmitAfterSeconds-EmitterAggregationWindow, now-EmitAfterSeconds]SERVER_CERT_PATH/SERVER_KEY_PATH空服务端 gRPC 的 TLS 证书与私钥CLIENT_CERT_PATH/CLIENT_KEY_PATH/CA_CERT_PATH空连接上游 HTTP 端点emitter时使用的客户端 mTLS 证书、私钥与 CASERVER_NAMEtigera-linseed.tigera-elasticsearch.svc上游端点 TLS 校验用的 ServerNameHEALTH_ENABLED/HEALTH_HOST/HEALTH_PORTtrue/ 空 /8080健康检查开关、监听地址与端口PROFILE_PORT0禁用pprof 性能分析端口PROMETHEUS_PORT0禁用Prometheus 指标端口配置与代码的对应关系在 goldmane/pkg/daemon/daemon.go 的Run()中可以看到这些参数的落点AGGREGATION_WINDOW、EMITTER_AGGREGATION_WINDOW、EMIT_AFTER_SECONDS被转换为goldmane的三个选项WithRolloverTime、WithBucketsToCombine默认 20 个 15s 桶 5 分钟聚合窗口与WithPushIndex默认 30即约30 * 15s 7.5 分钟的发射延迟——发射延迟大致等于pushIndex * rolloverTimePUSH_URL非空时创建 emitteremitter.NewEmitter配置 K8s 客户端、URL、mTLS 证书路径与 ServerName并后台运行若同时设置了FILE_CONFIG_PATH则由sinkManager监听文件、动态切换 sink否则直接gm.SetSink(logEmitter)SERVER_CERT_PATH/SERVER_KEY_PATH非空时通过calicotls.NewMutualTLSConfig构造双向 TLS 配置并装配到 gRPC 服务器PROFILE_PORT非 0 时启动 pprof 调试服务PROMETHEUS_PORT非 0 时在/metrics上暴露 Prometheus 指标健康检查通过libcalico-go的health.NewHealthAggregator()实现聚合器在每个 rollover 上报一次状态超时阈值设为 4 倍桶时长。关于 sink 的动态开关goldmane/pkg/daemon/config.go 的sinkManager每 30s 轮询一次FileConfigPath指向的文件内含 JSON 字段emitFlows文件不存在或解析失败视为禁用状态变化时通过gm.SetSink(...)热切换。这解释了 goldmane/DESIGN.md 中emitter 可通过文件监听在运行期启用/禁用的说法。同时需要留意 goldmane/DESIGN.md 的评审约定新增环境变量必须提供保持现有行为的默认值默认 opt-in 或 no-op修改既有变量的默认值属于可观测行为变更至少应按 semver-minor 对待TLS 相关变量与 operator 的 secret 挂载相互关联改动默认值或新增证书输入时需与 operator CR 协调。在 Calico 集群上连接 Goldmanegoldmane/README.md 给出了从本地机器访问生产 Calico 集群中 Goldmane gRPC API 的完整路径这是最实用的一节。前提mTLS 凭证Goldmane 强制要求客户端使用mTLS因此你需要三样东西客户端证书与私钥Goldmane 强制客户端提供 mTLSCA 证书用于校验服务器 TLS。可以从典型的 Calico 集群中获取以下命令收集calico/node的客户端凭证kubectl get secret -n calico-system node-certs --template{{index .data tls.key}} | base64 -d tls.key kubectl get secret -n calico-system node-certs --template{{index .data tls.crt}} | base64 -d tls.crt kubectl get secret -n calico-system goldmane-key-pair --template{{index .data tls.crt}} | base64 -d ca.crt这三条命令分别将node-certssecret 中的私钥与证书、以及goldmane-key-pairsecret 中的证书作为 CA解码写入本地文件。端口转发Goldmane 本身通过端口转发暴露kubectl port-forward -n calico-system svc/goldmane 7443:7443转发完成后Goldmane 的 gRPC 服务就监听在localhost:7443。编写客户端代码现在可以使用 goldmane/proto/api.proto 中定义的 API 编写代码直接访问localhost:7443上的 Goldmane API。仓库提供了现成的客户端封装作为起点goldmane/pkg/client/flowservice.go。FlowsClient接口包含三个方法type FlowsClient interface { List(context.Context, *proto.FlowListRequest) (*proto.ListMetadata, []*proto.FlowResult, error) Stream(ctx context.Context, request *proto.FlowStreamRequest) (proto.Flows_StreamClient, error) FilterHints(ctx context.Context, req *proto.FilterHintsRequest) (*proto.ListMetadata, []*proto.FilterHint, error) }通过NewFlowsAPIClient(host, opts...)创建客户端。mTLS 凭证的装配可以借助 goldmane/pkg/client/tls.go 的ClientCredentials(cert, key, ca)函数——它加载客户端证书/私钥对、将 CA 证书加入根证书池并基于crypto/pkg/tls的NewTLSConfig()生成credentials.TransportCredentials随后作为grpc.WithTransportCredentials(...)传入。也就是说从tls.crt、tls.key、ca.crt三个文件到可用的 gRPC 拨号选项仓库已经封装好了。命令行调试grpcurl 与 stream 工具goldmane/CLAUDE.md 记录了无需写代码即可调试 Goldmane 的方式。由于Goldmane 不支持 gRPC reflection使用grpcurl时必须显式传入 proto 文件并通过-authority覆盖 TLS 服务器名称证书签发给goldmane.calico-system.svc而非localhostgo install github.com/fullstorydev/grpcurl/cmd/grpcurllatest GRPCgrpcurl -cert tls.crt -key tls.key -cacert ca.crt -authority goldmane.calico-system.svc -import-path /path/to/calico/goldmane/proto -proto api.proto # 列出全部服务 $GRPC localhost:7443 list # 列出最近 5 分钟的流量 $GRPC -d {start_time_gte: -300, start_time_lt: 0} localhost:7443 goldmane.Flows/List # 实时流start_time_gte 为 0 表示现在负值表示相对秒数 $GRPC -d {start_time_gte: -60} localhost:7443 goldmane.Flows/Stream # 获取过滤提示例如可用的目的名称 $GRPC -d {type: FilterTypeDestName} localhost:7443 goldmane.Flows/FilterHints # 查询统计包计数 时序数据 $GRPC -d {start_time_gte: -300, start_time_lt: 0, type: PacketCount, time_series: true} localhost:7443 goldmane.Statistics/List仓库还内置了专门的流调试客户端goldmane/cmd/streammake build ./bin/stream-$(ARCH) -start-300 # 从 5 分钟前开始流式输出流量该工具要求当前目录存在tls.crt、tls.key、ca.crt并默认连接goldmane:7443可通过/etc/hosts或端口转发配合。排障时还可以直接查看日志# Goldmane 自身日志 kubectl logs -n calico-system -l k8s-appgoldmane -f # 摄入侧Felix 流日志默认 debug 级别关注 goldmane/flow 关键字 kubectl logs -n calico-system -l k8s-appcalico-node -c calico-node | grep -iE goldmane|flow可观测性Prometheus 指标goldmane/DESIGN.md 完整记录了 Goldmane 的可观测性面指标命名空间为goldmane_*。指标定义可在 goldmane/pkg/goldmane/goldmane.go 中逐一对应到 Prometheus 注册代码。聚合器指标goldmane_aggr_*goldmane_aggr_received_flows_total聚合器摄入的流总数goldmane_aggr_dropped_flows_total因缓冲区满而被丢弃的流数goldmane_aggr_duplicate_flows_total上报节点已将该流发送进该桶而跳过的流数即重连重放被去重的数量goldmane_aggr_num_unique_flows当前唯一流键数量goldmane_aggr_flow_index_buffer_size当前摄入缓冲深度goldmane_aggr_flow_index_batch_size每批处理的流数goldmane_aggr_flow_index_latency_ms索引单条流耗时goldmane_aggr_rollover_duration_ms桶 rollover 耗时goldmane_aggr_rollover_latency_ms两次 rollover 的间隔应约 15sgoldmane_aggr_backfill_latency_ms为新流订阅回填历史数据耗时。采集器指标goldmane_collector_*goldmane_collector_received_flowslabelsource每个 Felix 节点上报的流数goldmane_collector_flow_process_latencylabelsource按节点统计的摄入延迟直方图goldmane_collector_num_clients已连接的 Felix 客户端数应与节点数一致。流指标goldmane_num_streams活跃 gRPC 流订阅数。需要留意 goldmane/DESIGN.md 的指标治理约定新指标必须落入上述命名空间并在文档登记删除指标属于破坏仪表盘/告警的变更需在提交中说明原因与迁移路径标签基数必须受控——按节点的source标签在集群规模内可接受而按流键的标签将无限增长、被明确禁止。延伸模拟流量与 FV 测试如果你想在本地快速体验 Goldmane 的接入仓库提供了配套的测试工具goldmane/cmd/flowgen伪造流量数据的生成器配合 goldmane/config/testserver-daemonset.yaml 中的 DaemonSet 清单可以在集群中以 DaemonSet 形态跑在每个节点上hostNetwork: true通过SERVERgoldmane.calico-system:443指向 Goldmane持续向 FlowCollector 灌入模拟流数据goldmane/fv功能验证测试目录使用原生go test启动带 TLS 的真实 Goldmane 守护进程验证完整的 gRPC 链路含backpressure_test.go、dedup_test.go、flow_collector_test.go等。构建与测试的常用命令来自 goldmane/CLAUDE.mdmake build # 构建二进制 make ut # 运行单元测试 go test ./... # 直接运行单元测试迭代更快无需 Docker make benchmark # 运行基准测试 make protobuf # 重新生成 protobuf 代码 make gen-mocks # 重新生成 mock小结Goldmane 是 Calico 生态中连接数据面采集与上层消费的关键服务Felix 上报、聚合引擎去重与时间桶化、Flows/Statistics查询 API、以及可热切换的 emitter 推送构成了一个完整且可观测的集群流量视图闭环。接入时把握三个要点即可快速上手其一mTLS 凭证node-certsgoldmane-key-pair两个 secret与kubectl port-forward是本地访问的前提其二所有时间参数遵循0 边界语义、正数 Unix 秒、负数 相对秒的统一约定聚合窗口必须是 15s 的倍数其三配置完全通过环境变量驱动调参如EMIT_AFTER_SECONDS时需权衡发射延迟与数据完整性。更深入的架构评审约束、协议变更纪律与全部指标清单可继续阅读 goldmane/DESIGN.md操作性指南则以 goldmane/CLAUDE.md 为准。赞分享网络云原生网络安全【免费下载链接】calicoCloud native networking and network security项目地址https://gitcode.com/gh_mirrors/cal/calico点击查看免费下载相关推荐Calico API servercalico-apiserver深度解析基于 Kubernetes 聚合 API 的 Calico 控制面服务Calico API servercalico apiserver深度解析基于 Kubernetes 聚合 API 的 Calico 控制面服务 导读 C网络云原生网络安全HookLib²工作原理深度剖析从跳转指令到上下文修复HookLib²工作原理深度剖析从跳转指令到上下文修复 HookLib²是一款功能强大的函数拦截库采用纯C语言和NativeAPI编写同时支持用户模式U5个关键实践掌握Docker官方PostgreSQL镜像的安全部署5个关键实践掌握Docker官方PostgreSQL镜像的安全部署 PostgreSQL作为开源数据库的标杆在容器化部署中面临着安全、性能与维护的多重挑战。数据库云原生上一篇一条命令实现STL转STEPstltostp如何把3D打印网格变成CAD可编辑实体下一篇Django应用部署去哪儿PaaS vs IaaS选型指南与Awesome Django托管平台推荐创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表