LightObs V1
March 5, 2026 · View on GitHub
LiteObs 初始版本定位于一个轻量级的 Kubernetes 流量观测系统,采用经典的 Agent-Server-Client 三层架构。 核心组件与职责
- Agent ( cmd/agent ) :
- 职责 : 部署在 K8s 节点上(DaemonSet),负责捕获网络流量。
- 技术栈 : 基于 gopacket/pcap 实现底层抓包。
- 功能 : 监听指定网卡,解析 HTTP 协议(Method, URL, Status, Latency),并将日志聚合后上报给 Server。
- Server ( cmd/server ) :
- 职责 : 集中式存储与查询服务。
- 存储 : 初始集成 DuckDB ( internal/server/storage/duckdb ),利用其 OLAP 特性处理日志分析。
- 接口 : 提供 HTTP REST API ( POST /upload 接收日志, GET /query 查询日志)。
- Client ( cmd/client ) :
- 职责 : 开发者使用的命令行工具。
- 功能 : 通过 CLI 参数构建查询请求,格式化展示流量表格。 初始数据模型
- TrafficLog ( pkg/model/traffic.go ): 包含源/目的 IP、端口、HTTP 方法、路径、状态码、耗时和响应体大小。
LightObs V2 迭代升级
新增需求1: 引入 eBPF 实现agent支持进程采集收发http报文的事件并上报
为了解决“流量归属于哪个进程”的问题,Agent 引入了 eBPF 技术栈。
- 新增模块 : internal/agent/pidmap
- 技术实现 :
- Kernel Space : 使用 cilium/ebpf 编写和加载 BPF 程序,挂载到 tracepoint/sock/inet_sock_set_state 。
- Map 机制 : 维护一个 BPF_MAP_TYPE_HASH ,记录 (SrcIP, DstIP, SrcPort, DstPort) -> PID 的映射关系。
- 多字节序支持 : 实现了对 Big Endian (Network Order) 和 Little Endian (Host Order) 的兼容处理,确保在不同架构下 Key 的一致性。
- 端口过滤 : 在汇编层增加了对常用开发端口(如 8080)的捕获支持。
- 考虑到该项目为轻量级可观测应用,因此使用依赖更少,开销更少的纯go方案实现而没有使用C
- 架构变更 : Agent 在捕获到 HTTP 流量后,会查询 PID Map,将流量日志补充 PID 字段后再上报。
新增需求 2: 存储层重构与 SQLite 支持(同时支持SQLite和DuckDB)
为了增强在不同环境下的兼容性(特别是去 CGO 依赖),Server 端重构了存储层。
- 接口抽象 : 定义了 Store 接口 ( internal/server/storage/store.go ),包含 Insert , QueryByIP , QueryByPID 等方法。
- 新增实现 : internal/server/storage/sqlite
- Pure Go : 引入 modernc.org/sqlite ,实现了无 CGO 依赖的嵌入式数据库支持。
- 双模式切换 : 支持通过 Server 启动参数 -db-type 在 DuckDB 和 SQLite 之间切换。
新增需求 3: Client端支持PID关联的ip流向查询
- Server : 新增 QueryByPID 查询逻辑,支持按进程 ID 过滤流量日志。
- Client : 命令行工具新增 -pid 参数,支持开发者直接追踪特定进程的流量。
- 测试 : 完善了 internal/server/api 的单元测试,通过 fakeStore 覆盖了所有查询路径。
LightObs V3 引入 Operator 架构升级
在之前的版本中,Agent 以 DaemonSet 形式全局部署,缺乏针对性和动态管理能力。V3 版本引入了 Kubernetes Operator 模式与自定义资源(CRD),实现了完全声明式的观测目标管理。具体内容可参考README_Operator.md
核心功能与优势
- 声明式目标管理 (CRD):引入
PodObservationCRD。用户只需提交一份 YAML 声明需要观测哪个应用(通过 Label Selector)、哪个端口,无需关心底层 Agent 的生命周期。 - 动态自动发现与扩缩容感知 (Auto-Discovery):Operator 实时监听 K8s 集群。当目标业务 Pod 扩容或缩容时,Operator 会自动发现新 Pod 的 IP,并动态更新 Agent 的抓包白名单,做到配置零干预。
- 精准按需观测 (Targeted Observation):废弃了全局 DaemonSet 抓包。Operator 会精确计算目标业务 Pod 所在的节点,并仅在这些节点上按需拉起专属的 Agent Pod,大幅降低集群性能开销。
- 故障自愈与状态对账 (Self-Healing):如果底层 Agent Pod 意外崩溃或被误删,Operator 的 Reconcile 循环会在秒级内发现实际状态与期望状态的差异,并瞬间重建 Agent。
- 配置热更新 (Dynamic Config):通过
kubectl patch修改 CRD(例如更改观测端口),Operator 会自动感知并更新 Agent 配置,全程无需 SSH 登录节点。
新增文件结构与功能
- cmd/operator/main.go: Operator 的入口程序,负责初始化 Manager 并注册 Controller。
- internal/operator/api/v1alpha1/types.go: 定义
PodObservationCRD 的 Go 结构体(Spec 与 Status)。 - internal/operator/controller/podobservation_controller.go: 核心控制器逻辑:执行对账循环 (Reconcile),计算目标节点并动态管理 Agent Pod 的生命周期。
- deploy/crds/podobservation.yaml:
PodObservation的 Kubernetes CustomResourceDefinition 资源注册文件。 - deploy/operator/operator.yaml: Operator 控制器本身的 K8s 部署清单 (包含 Deployment, ClusterRole 等 RBAC 权限声明, ServiceAccount)。
- scripts/start_with_operator.sh: 一键构建并启动包含 Operator 的完整集群与 Demo 业务环境的自动化脚本。
- scripts/demo_operator_magic.sh: Operator 核心优势交互式演示脚本 (带你一步步体验扩容感知、故障自愈、配置热更新的 Magic 效果)。
控制流向 (Operator Control Flow)
- Apply CRD: 用户向 K8s 提交
PodObservation资源,声明期望观测的目标(如打有app: web标签的 Pod)。 - Watch/Event: Operator 监听到
PodObservation的创建/更新事件,以及业务 Pod 的生命周期变动。 - Calculate: Operator 提取所有匹配业务 Pod 的 IP,并归纳它们当前分布在哪些宿主机节点上。
- Reconcile (对账): Operator 检查对应节点上是否已存在服务于该 CR 的 Agent Pod;若缺失则动态拉起,若存在但过期参数(如目标 IP 增减)则进行更新/重建,抹平期望与实际状态的差异。
- Targeted Capture: 动态创建出的 Agent 进程被精准注入了
-target-ips参数,仅对指定 IP 开启 eBPF 或 Pcap 抓包,极大降低系统开销。
完整项目结构
LiteObs/
├── build/ # Dockerfile (Server, Agent, Operator)
├── cmd/ # 各个组件的入口程序
│ ├── agent/
│ ├── server/
│ ├── client/
│ └── operator/ # Operator 启动入口
├── pkg/
│ └── model/ # 共享数据模型 (TrafficLog)
├── internal/
│ ├── agent/ # Agent 核心抓包侧逻辑 (eBPF pidmap, pcap parser, report)
│ ├── server/ # Server 核心存储侧逻辑 (API Handler, SQLite/DuckDB Storage)
│ ├── client/ # CLI 客户端逻辑
│ └── operator/ # Operator 核心控制面逻辑
│ ├── api/ # CRD 结构体定义 (v1alpha1)
│ └── controller/ # Reconcile 状态对账控制器
├── deploy/ # K8s 部署清单集合
│ ├── crds/ # 自定义资源定义
│ ├── operator/ # Operator 本身部署文件
│ ├── k8s-lightobs.yaml # Server 部署文件
│ └── k8s-demo.yaml # 用于供用户演示的 demo 空间应用
└── scripts/ # 自动化脚本工具
├── start_with_operator.sh # 包含 Operator 架构的一键建站/部署测试脚本
└── demo_operator_magic.sh # 交互式 Operator 优势演示脚本
使用方法
启动带有 Operator 完整能力的演示集群:
# 自动部署 Kind 集群、打包镜像、拉起 Server + Operator + Demo 应用并进行完整连通性测试
bash scripts/start_with_operator.sh full
# Operator 的动态自愈/发现机制 demo
bash scripts/demo_operator_magic.sh
(附:旧版本全局 DaemonSet 启动方式 )
bash scripts/start.sh full