cilium 编码初识

23 阅读9分钟

说明

下面所有内容都是中文文档描述,你可以直接复制为多篇文档(例如 01-架构概览.md02-主CNI-网络.md 等),或者放在一个总文档里。
我会按你要求的两个维度来组织:

  • 架构维度:主 CNI / Chaining
  • 功能维度:网络 / 安全 / 可观测性

并且都聚焦在「代码学习视角」——告诉你:看哪个目录、哪个模块、用什么顺序读。


文档 1:整体视角——按架构与功能的学习地图

1.1 架构维度总览

1.2 功能维度总览

  • 网络(Networking)
    • 控制面:端点、IPAM、服务/LB、节点、ClusterMesh
    • 数据面:各类 BPF 程序、maps、WireGuard/IPsec
  • 安全(Security)
    • 身份:标签、identity、kvstore
    • 策略:CiliumNetworkPolicy 转换、L3/L4/L7 策略
    • L7/认证:Envoy、代理、mTLS、DNS/FQDN
  • 可观测性(Observability)
    • Hubble:流日志、Hubble Relay、api/v1/flow
    • 监控与指标:Prometheus metrics、监控事件管线
    • 健康与调试:cilium-healthbugtoolcilium-dbg

文档 2:主 CNI 架构下的网络功能

2.1 推荐阅读顺序

  1. 从 CNI 调用到 agent:主线调用链
  2. 控制面网络模型
    • 端点与端点管理:pkg/endpointpkg/endpointmanager
    • IPAM:pkg/ipampkg/ipallocpkg/ippkg/cidr
    • 服务和负载均衡:pkg/loadbalancer + pkg/k8s
    • 节点与集群:pkg/nodepkg/nodediscoverypkg/clustermeshclustermesh-apiserver
  3. 数据面 eBPF
    • Pod 侧:bpf/bpf_lxc.c
    • Node 侧:bpf/bpf_host.cbpf/bpf_network.c
    • XDP:bpf/bpf_xdp.c
    • socket LB / WireGuard:bpf/bpf_sock.cbpf/bpf_wireguard.c
    • 管理 BPF maps 与加载逻辑:pkg/mapspkg/datapathpkg/ebpf

2.2 关键包与代码要点


文档 3:主 CNI 架构下的安全功能

3.1 推荐阅读顺序

  1. 身份与标签体系
    • pkg/labelspkg/identitypkg/kvstore
  2. 策略引擎
    • pkg/policy(策略模型与计算)
    • pkg/k8s 中 CNP / NP 控制器
  3. L7 安全与认证
    • pkg/proxypkg/envoypkg/ciliumenvoyconfig
    • pkg/authpkg/fqdn
  4. 数据面中的策略执行
    • bpf/lib 中关于策略 map 和权限判断的部分

3.2 身份与策略

  • 标签与 identity

    • pkg/labels:定义 key/value 标签及操作(合并、过滤、比较)。
    • pkg/labelsfilter:标签过滤规则。
    • pkg/identity:把一组标签映射到一个整数 security identity。
    • pkg/idpool:分配 identity ID。
    • pkg/kvstore:把 identity、policy 等在集群中分布式存储与同步。
  • 策略引擎(Policy)

    • pkg/policy
      • 策略对象:规则、选择器、Ingress/Egress 规则等。
      • 策略计算:给定 source/destination identity、端口、协议,判断是否允许。
    • pkg/k8s
      • 监听 CiliumNetworkPolicyNetworkPolicy 等 CRD/资源。
      • 把 K8s 对象翻译为内部 policy 模型,并触发 BPF map 更新。

3.3 L7、安全代理与认证

  • L7 / Envoy 集成

  • 认证与 DNS/FQDN 策略

    • pkg/auth
      • 处理集群内流量认证(如 SPIFFE、mTLS)相关逻辑。
    • pkg/fqdn
      • DNS 解析结果缓存与更新。
      • 支持基于域名的策略(如允许访问 *.example.com)。
  • 数据面中的策略执行

    • bpf/lib 中,关注与 policy map、identity 和权限判定相关的文件,例如:
      • bpf/lib/policy.h(名称可能略有差异,以实际为准):包含策略匹配宏和 map 定义。
    • 结合 pkg/maps 中关于 policy map 的定义一同阅读。

文档 4:主 CNI 架构下的可观测性

4.1 Hubble 与流级可观测性

  • 核心组件

  • 生成流日志的大致流程(代码学习视角)

    1. BPF 程序在关键路径上记录事件(如 CT、policy decision、drop/forward)。
    2. 通过 perf ring buffer / maps 把事件传给用户空间。
    3. Cilium agent 中的 monitor / hubble 组件消费这些事件,转换为 Flow 对象。
    4. Hubble server 提供 gRPC 接口,Hubble Relay 聚合多个 agent 的数据。
  • 推荐阅读路径

    • pkg/hubble 入手,看 Hubble server 如何订阅事件。
    • 再看 pkg/monitorpkg/eventqueue 理解事件管线。
    • 最后对照 api/v1/flow 里定义的字段,看流是如何编码/传输的。

4.2 指标(Metrics)与监控

  • 指标模块

  • 学习要点

    • pkg/metrics 中如何注册 Prometheus 指标、以及指标的命名规范。
    • 查找典型指标更新的调用点,可以反向看网络/策略不同功能与指标的对应关系。

4.3 健康检查与调试工具


文档 5:Chaining 架构下的网络 / 安全 / 可观测性

5.1 Chaining × 网络

5.2 Chaining × 安全

  • 安全组件复用

    • 身份与策略:完全复用 pkg/identitypkg/policypkg/kvstore
    • 数据面策略执行:仍然是 bpf/lib + 主要 BPF 程序。
  • 差异点

    • Chaining 模式下,Cilium 对 L3 拓扑、IP 的掌控度变弱,因此策略计算时更多依赖 identity、标签,而非本地分配 IP 的信息。
    • 阅读策略路径时,可以对比主 CNI 与 Chaining 下 IPAM 部分的差异。

5.3 Chaining × 可观测性

  • 可观测性组件完全共享

    • Hubble:hubblehubble-relaypkg/hubbleapi/v1/flow
    • 监控与 metrics:pkg/metricsoperator/metrics
    • 事件管线:pkg/monitorpkg/recorderpkg/eventqueue
  • 学习要点

    • 从 Hubble 的角度看,数据来源仍然是 BPF 事件,因此在 Chaining 模式下 可观测性能力基本不变
    • 差异主要在于:链路前半段由其他 CNI 负责,但进入 Cilium hook 之后的行为与主 CNI 类似。

文档 6:建议的代码学习路线图(汇总)

6.1 如果你从零开始看 Cilium 代码

  • 第 1 阶段:整体架构 + 主 CNI 网络

    • plugins/cilium-cni(如何从 CNI 调用到 agent)
    • daemon/main.go + daemon/cmd(agent 主结构)
    • pkg/endpointpkg/ipampkg/loadbalancerpkg/node
    • bpf/bpf_lxc.cbpf/bpf_host.c
  • 第 2 阶段:安全(策略 + 身份 + L7)

    • pkg/labelspkg/identitypkg/kvstore
    • pkg/policy + pkg/k8s 中 CNP 控制器
    • pkg/proxypkg/envoypkg/ciliumenvoyconfigpkg/authpkg/fqdn
    • 对应的 bpf/lib 中策略执行代码
  • 第 3 阶段:可观测性

    • Hubble:pkg/hubblehubblehubble-relayapi/v1/flow
    • pkg/monitorpkg/metricsoperator/metricspkg/recorder
  • 第 4 阶段:Chaining 专项

    • plugins/cilium-cni/chaining/api + awscni/azure/flannel/generic-veth 实现
    • 对比主 CNI 模式下 IPAM 和路由行为的变化。

如果你希望,我可以在下一步把上面某一篇文档展开成更详细的章节结构(例如为 pkg/policy 列出重要类型和函数,并说明阅读顺序),也会保持全部中文说明。