Cilium 是一种网络、可观察性和安全性解决方案,具有基于 eBPF 的数据平面。它提供了一个简单的平面第 3 层网络,能够以本地路由或覆盖模式跨越多个集群。它是 L7 协议感知的,可以使用与网络寻址分离的基于身份的安全模型在 L3-L7 上实施网络策略。
Cilium 为 pod 之间的流量和到外部服务的流量实现分布式负载平衡,并且能够完全替代 kube-proxy,在 eBPF 中使用高效的哈希表允许几乎无限的扩展。它还支持集成入口和出口网关、带宽管理和服务网格等高级功能,并提供深度网络和安全可见性和监控。
一种称为eBPF的新 Linux 内核技术是 Cilium 的基础。它支持在各种集成点将 eBPF 字节码动态插入 Linux 内核,例如:网络 IO、应用程序套接字和跟踪点,以实现安全、网络和可见性逻辑。eBPF 高效且灵活。
[hidecontent type="logged" desc="隐藏内容:登录后可查看"]
能够保护现代应用程序协议,例如 REST/HTTP、gRPC 和 Kafka。传统防火墙在第 3 层和第 4 层运行。在特定端口上运行的协议要么完全受信任,要么完全被阻止。Cilium 提供了过滤单个应用程序协议请求的能力,例如:
GET
允许所有带有 method和 path的 HTTP 请求/public/.*
。拒绝所有其他请求。service1
在 Kafka 主题上生产topic1
并service2
在topic1
. 拒绝所有其他 Kafka 消息。X-Token: [0-9]+
出现在所有 REST 调用中。请参阅文档中的第 7 层策略部分,了解最新的受支持协议列表以及有关如何使用它的示例。
现代分布式应用程序依赖于应用程序容器等技术来促进部署的敏捷性和按需扩展。这导致在短时间内启动大量应用程序容器。典型的容器防火墙通过过滤源 IP 地址和目标端口来保护工作负载。这个概念要求在集群中的任何地方启动容器时,所有服务器上的防火墙都被操纵。
为了避免这种限制规模的情况,Cilium 为共享相同安全策略的应用程序容器组分配了一个安全标识。然后将身份与应用程序容器发出的所有网络数据包相关联,从而允许在接收节点验证身份。安全身份管理是使用键值存储执行的。
基于标签的安全性是集群内部访问控制的首选工具。为了保护对外部服务的访问和从外部服务访问,支持传统的基于 CIDR 的入口和出口安全策略。这允许将进出应用程序容器的访问限制在特定的 IP 范围内。
一个简单的平面第 3 层网络能够跨越多个集群连接所有应用程序容器。IP 分配通过使用主机范围分配器保持简单。这意味着每个主机都可以分配 IP,而无需主机之间的任何协调。
支持以下多节点网络模型:
覆盖:跨越所有主机的基于封装的虚拟网络。目前 VXLAN 和 Geneve 已内置,但可以启用 Linux 支持的所有封装格式。
何时使用此模式:此模式对基础架构和集成的要求最低。它几乎适用于任何网络基础设施,因为唯一的要求是主机之间的 IP 连接,这通常已经提供。
Native Routing:使用 Linux 主机的常规路由表。网络需要能够路由应用程序容器的 IP 地址。
何时使用此模式:此模式适用于高级用户,需要对底层网络基础设施有所了解。此模式适用于:
Cilium实现了应用容器与外部服务之间流量的分布式负载均衡,能够完全替代kube-proxy等组件。负载平衡是在 eBPF 中使用有效的哈希表实现的,允许几乎无限的规模。
对于南北类型的负载均衡,Cilium 的 eBPF 实现针对最大性能进行了优化,可以附加到 XDP(eXpress 数据路径),并且支持直接服务器返回(DSR)以及如果不执行负载均衡操作则使用 Maglev 一致性哈希在源主机上。
对于东西向类型的负载均衡,Cilium 在 Linux 内核的套接字层(例如,在 TCP 连接时)执行高效的服务到后端转换,这样可以避免较低层的每个数据包 NAT 操作开销。
Cilium 通过有效的基于 EDT(最早出发时间)的速率限制和 eBPF 对流出节点的容器流量实施带宽管理。与带宽 CNI 插件中使用的 HTB(层次令牌桶)或 TBF(令牌桶过滤器)等传统方法相比,这可以显着减少应用程序的传输尾部延迟,并避免在多队列 NIC 下锁定。
获得可见性和解决问题的能力是任何分布式系统运行的基础。虽然我们学会了喜欢 tcpdump
和之类的工具,ping
并且它们总能在我们心中找到一个特殊的位置,但我们努力提供更好的故障排除工具。这包括提供以下工具:
Berkeley Packet Filter (BPF) 是一个 Linux 内核字节码解释器,最初被引入用于过滤网络数据包,例如用于 tcpdump 和套接字过滤器。BPF 指令集和周围的体系结构最近经过重大改造,增加了额外的数据结构,例如用于保持状态的哈希表和数组,以及支持数据包处理、转发、封装等的额外操作。此外,LLVM 的编译器后端允许用于用 C 编写并编译成 BPF 指令的程序。内核验证器确保 BPF 程序可以安全运行,JIT 编译器将 BPF 字节码转换为 CPU 架构特定指令以提高本机执行效率。BPF 程序可以在内核中的各种挂钩点运行,例如传入数据包、传出数据包、系统调用、kprobes、
BPF 随着每个新的 Linux 版本不断发展并获得更多功能。Cilium 利用 BPF 来执行核心数据路径过滤、处理、监控和重定向,并且需要任何 4.8.0 版或更高版本的 Linux 内核(当前最新的稳定 Linux 内核是 4.14.x)中的 BPF 功能。
许多 Linux 发行版,包括 CoreOS、Debian、Docker 的 LinuxKit、Fedora、openSUSE 和 Ubuntu 已经发布了 >= 4.8.x 的内核版本。您可以通过运行来检查您的 Linux 内核版本uname -a
。如果您还没有运行足够新的内核,请查看您的 Linux 发行版的文档,了解如何运行 Linux 内核 4.9.x 或更高版本。
[/hidecontent]