cilium 基础

cilium 概述

Cilium 是一种网络、可观察性和安全解决方案,具有基于 eBPF 的数据平面。它提供了一个简单的扁平第 3 层网络,能够以本机路由或覆盖模式跨越多个集群。它具有 L7 协议感知能力,可以使用与网络寻址分离的基于身份的安全模型在 L3-L7 上实施网络策略。
Cilium 为 Pod 之间和外部服务之间的流量实现分布式负载均衡,并且能够完全取代 kube-proxy,在 eBPF 中使用高效的哈希表,从而实现几乎无限的规模。它还支持集成ingress和egress网关、带宽管理和服务网格等高级功能,并提供深入的网络和安全可观测性和监控。
Cilium 的基础是一种名为 eBPF 的新 Linux 内核技术,它可以在 Linux 本身内动态插入强大的安全可观测性和控制逻辑。由于 eBPF 在 Linux 内核内部运行,因此可以应用和更新 Cilium 安全策略,而无需对应用程序代码或容器配置进行任何更改。

cilium 优点

eBPF 能够以前所未有的粒度和效率对系统和应用程序进行可观测性和控制。它以完全透明的方式完成此操作,无需应用程序以任何方式进行更改。eBPF 同样能够处理现代容器化工作负载以及更传统的工作负载(例如虚拟机和标准 Linux 进程)。
现代数据中心应用程序的开发已转向面向服务的架构(通常称为微服务),其中大型应用程序被拆分为小型独立服务,这些服务通过使用 HTTP 等轻量级协议的 API 相互通信。微服务应用程序往往是高度动态的,随着应用程序横向扩展/收缩以适应负载变化以及作为持续交付的一部分部署的滚动更新期间,各个容器会启动或销毁。
这种向高度动态微服务的转变对于确保微服务之间的连接既是挑战也是机遇。传统的 Linux 网络安全方法(例如 iptables)会根据 IP 地址和 TCP/UDP 端口进行过滤,但 IP 地址在动态微服务环境中经常发生变化。容器的高度不稳定的生命周期导致这些方法难以与应用程序一起扩展,因为负载均衡表和访问控制列表携带数十万条规则,需要以不断增长的频率进行更新。出于安全目的,协议端口(例如用于 HTTP 流量的 TCP 端口 80)不能再用于区分应用程序流量,因为该端口用于跨服务的各种消息。
另一个挑战是提供准确可观测性的能力,因为传统系统使用 IP 地址作为主要识别工具,而在微服务架构中,其生命周期可能会大大缩短,仅为几秒钟。
通过利用Linux eBPF,Cillium保留了透明插入安全可见性+强制执行的能力,但这样做的方式是基于service / pod / container标识(与传统系统中的IP地址标识不同),并可以在应用层上进行过滤(如HTTP)。因此,Cillium不仅通过将安全性与寻址解耦,使在高度动态的环境中应用安全策略变得简单,而且除了提供传统的第3层和第4层外,还可以通过在HTTP层操作提供更强的安全隔离。
eBPF 的使用使 Cilium 能够以高度可扩展的方式实现所有这一切,即使对于大规模环境也是如此。

cilium 功能

cilium 功能结构图

透明地保护 API 的安全

能够保护 REST/HTTP、gRPC 和 Kafka 等现代应用程序协议。传统防火墙在第 3 层和第 4 层运行。在特定端口上运行的协议要么完全信任,要么完全阻止。Cilium 提供了过滤单个应用程序协议请求的能力,例如:
1. 允许所有GET方法和路径 /public/.* 的 HTTP 请求。拒绝所有其他请求。
2. 允许 service1 作为 Kafka 主题 topic1的生产者,并允许 service2 在 topic1 上进行消费。拒绝所有其他 Kafka 消息。
3. 要求 HTTP 标头 X-Token: [0-9]+ 出现在所有 REST 调用中。

基于身份的安全服务间通信

现代分布式应用程序依赖应用程序容器等技术来促进部署的敏捷性和按需扩展。这导致短时间内会启动大量的应用容器。典型的容器防火墙通过过滤源 IP 地址和目标端口来保护工作负载。这个概念要求每当容器在集群中的任何位置启动时,所有服务器上的防火墙都可以被操作。
为了避免这种限制规模的情况,Cilium 为共享相同安全策略的应用程序容器组分配一个安全身份。然后,该身份与应用程序容器发出的所有网络数据包相关联,从而允许在接收节点验证身份。安全身份管理是使用键值存储来执行的。

安全地访问和访问外部服务

基于标签的安全性是集群内部访问控制的首选工具。为了保护对外部服务的访问和从外部服务的访问,支持基于传统 CIDR 的入口和出口安全策略。这允许将应用程序容器的访问限制到特定的 IP 范围。

简单的组网

一个简单的扁平第 3 层网络能够跨越多个集群,连接所有应用程序容器。通过使用主机范围分配器,IP 分配变得简单。这意味着每个主机都可以分配 IP,而无需主机之间进行任何协调。支持以下多节点网络模型:

Overlay 

跨越所有主机的基于封装的虚拟网络。目前已内置 VXLAN 和 Geneve,但可以启用 Linux 支持的所有封装格式。
何时使用此模式:此模式具有最低的基础架构和集成要求。它几乎适用于任何网络基础设施,因为唯一的要求是主机之间的 IP 连接,而这通常已经给出。

Native Routing 

使用 Linux 主机的常规路由表。网络需要能够路由应用程序容器的 IP 地址。
何时使用此模式:此模式适用于高级用户,需要对底层网络基础设施有一定的了解。此模式适用于:
1. 本机 IPv6 网络
2. 与云网络路由器结合
3. 已经在运行路由守护程序

负载均衡

Cilium 为应用程序容器之间和外部服务之间的流量实现分布式负载均衡,并且能够完全替代 kube-proxy 等组件。负载平衡是在 eBPF 中使用高效的哈希表实现的,允许几乎无限的规模。
对于南北向类型的负载平衡,Cilium 的 eBPF 实现针对最大性能进行了优化,可以附加到 XDP(eXpress Data Path),并且如果不在源主机上执行负载平衡操作,则支持直接服务器返回(DSR)以及Maglev一致性哈希。
对于东西向类型的负载平衡,Cilium 直接在 Linux 内核的套接字层(例如在 TCP 连接时)执行高效的服务到后端转换,从而可以在较低层中避免每个数据包的 NAT 操作开销。

带宽管理

Cilium 通过基于 EDT(最早出发时间)的高效速率限制以及 eBPF 对流出节点的容器流量实施带宽管理。与带宽 CNI 插件中使用的 HTB(层次结构令牌桶)或 TBF(令牌桶过滤器)等传统方法相比,这可以显着减少应用程序的传输尾延迟,并避免在多队列 NIC 下锁定。

监控和故障排除

获得可见性和解决问题的能力是任何分布式系统运行的基础。虽然我们逐渐喜欢上了 tcpdump 和 ping 等工具,而且它们总是在我们心中占有特殊的位置,但我们仍努力提供更好的故障排除工具。这包括提供以下工具:
1. 使用元数据进行事件监控:当数据包丢失时,该工具不仅报告数据包的源和目标 IP,还提供发送者和接收者的完整标签信息以及许多其他信息。
2. 通过 Prometheus 导出指标:通过 Prometheus 导出关键指标,以便与现有仪表板集成。
3. Hubble:专门为 Cilium 编写的可观测平台。它提供服务依赖关系图、操作监控和警报以及基于流日志的应用程序和安全可见性。

cilium 使用场景

可以将 Cilium 用于各种目的,例如多租户安全实施、多集群负载平衡和高性能网络。 Cilium 的一些多样化用例包括:
1. 高效、可扩展、灵活的容器网络。
2. 无 Sidecar、eBPF 加速的服务网格解决方案,包括入口和网关 API 支持。
3. 基于身份的网络策略和API 感知过滤。
4. DNS 过滤和加密(IPsec、WireGuard 和 TLS)。
5. Hubble、Prometheus 和 Grafana 支持的可观测性。
6. 完全替代 kube-proxy组件。

高性能云原生网络 CNI

Cilium 的控制和数据平面是为大规模和高度动态的云原生环境而从头开始构建的,在这些环境中,数百甚至数千个容器在几秒钟内被创建和销毁。 Cilium 的控制平面经过高度优化,运行在具有 1,000 个节点和 100K pod 的 Kubernetes 集群中。 Cilium 的数据平面使用 eBPF 进行高效的负载平衡和增量更新,避免大型 iptables 规则集的陷阱。

cilium 可扩展性

Cilium 是按比例构建的。无论运行几个节点还是管理数千个节点的集群,Cilium 都可以处理。 Cilium 的 eBPF 支持的网络针对大规模运营进行了优化。这意味着可以扩大运营规模,而不必担心网络成为瓶颈。

网络安全

Cilium 不仅性能出色,还带来强大的安全功能。凭借超越传统基于 IP 地址的 ACL 的基于身份的安全性,Cilium 提供细粒度的策略实施。这使您可以控制谁可以与谁交谈,减少攻击面并帮助保护您的云本机应用程序。

参考文档

https://docs.cilium.io/en/stable/

https://github.com/cilium/cilium

posted @ 2024-05-27 15:15  小吉猫  阅读(24)  评论(0编辑  收藏  举报