### Flannel、Calico 和 Cilium 有什么区别

1. Flannel

Flannel 是一个简单、轻量级的网络解决方案，它主要关注一点：为每个 Pod 分配一个 IP 地址，并确保这些 IP 之间可以路由

- 工作原理：Flannel 使用一个覆盖网络（Overlay Network）来工作。它在每个主机上运行一个代理进程 `flanneld`，这个代理会在 Pod 的 IP 地址之上创建一个虚拟网络。当一个 Pod 发送数据包时，Flannel 会将数据包封装在 UDP、VXLAN 或 Host-Gateway 等协议中，然后通过物理网络发送到目标主机。目标主机上的 Flannel 代理收到数据包后，再将其解封装，传递给目标 Pod
- 特点：
  - 简单易用：配置简单，适合初学者或对高级网络功能没有要求的场景
  - 纯路由方案：Flannel 只负责路由，不提供网络策略（Network Policy）功能。你需要结合其他工具（如 Kubernetes Network Policy）来实现防火墙规则
  - 性能：由于有封装和解封装的过程，Flannel 的性能通常会比直接路由方案略低

2. Calico

Calico 是一个更强大、功能更全面的 CNI 插件。它不仅提供网络连接，还内置了强大的网络策略引擎

- 工作原理：Calico 默认使用 BGP（Border Gateway Protocol）来直接路由数据包，而不是使用覆盖网络。每个 Calico 节点都像一个路由器，它会向其他节点广播 Pod 的 IP 地址，从而实现 Pod 间的直接通信。Calico 也可以配置为使用 IP-in-IP 或 VXLAN 模式
- 特点：
  - 性能高：由于默认使用 BGP 直接路由，避免了数据包的封装和解封装开销，其性能通常比 Flannel 高
  - 内置网络策略：Calico 提供了非常细粒度的网络策略功能，你可以像使用防火墙一样控制 Pod 间的通信
  - 适用于大规模集群：其设计使其非常适合大型、复杂的集群环境

3. Cilium

Cilium 是一个相对较新但功能强大的 CNI 插件，它的设计理念是基于eBPF（extended Berkeley Packet Filter）技术

- 工作原理：Cilium 使用 eBPF 来在 Linux 内核中实现网络和安全功能。它可以在数据包到达网络协议栈之前，在内核层面直接处理和过滤数据包，而无需将数据包从内核空间复制到用户空间。这使得 Cilium 能够提供超高性能和细粒度的安全控制
- 特点：
  - 性能卓越：eBPF 技术使其在性能上优于大多数传统的 CNI 插件
  - 应用层安全：Cilium 可以在L7 层（应用层）实施网络策略。例如，你可以基于 HTTP 请求的路径、方法或 Kafka 消息的主题来设置策略，这比 Calico 的 L3/L4 网络策略更为强大
  - 可观测性：Cilium 提供了丰富的可观测性工具，可以帮助你追踪数据包的流动和安全策略的执行情况

特性/插件 | Flannel | Calico | Cilium
--- | --- | --- | ---
工作原理 | 覆盖网络 (VXLAN/UDP) | IP 路由 (BGP) | eBPF in kernel
网络策略 | 不提供，需额外配置 | 内置，L3/L4 | 内置，L3/L4/L7
性能 | 简单，性能一般 | 高性能 | 极高性能
适用场景 | 简单集群，测试环境 | 生产环境，大规模集群 | 需要高吞吐和细粒度安全控制的复杂集群
优点 | 易于安装和使用 | 功能全面，性能优越 | 性能最佳，支持 L7 策略
缺点 | 功能单一，无内置策略 | BGP 模式配置复杂 | 技术新，相对复杂