目录
引言
Cilium 是一款开源软件,也是 CNCF 的孵化项目,最初它仅是作为一个 Kubernetes 网络组件,作为第一个通过 ebpf 实现了 kube-proxy 所有功能的网络插件,对kubernetes的网络方案的技术革新起到了推古拉朽的作用。
Cilium 在 1.7 版本后推出并开源了Hubble,它是专门为网络可视化设计,能够利用 Cilium 提供的eBPF 数据路径,获得对 Kubernetes 应用和服务的网络流量的深度可见性。
背景
随着云原生的普及率越来越高,各大厂商基本上都实现了业务的 k8s 容器化,随着 k8s 的普及,当前集群逐渐呈现出以下两个特点:
1.k8s集群规模越来越大,Pod数量越来越多,比如:k8s 官方单集群就已经支持 150k pod
2.Pod的生命周期月累越短,Serverless 场景下甚至短至几分钟,几秒钟
随着k8s集群规模的增大,以及Pod生命周期的变短,对原生容器网络带来的挑战也越来越大
当前 k8s Service 负载均衡的实现方式
在 Cilium 出现之前, Service 由 kube-proxy 来实现,实现方式有 userspace,iptables,ipvs 三种模式。
Userspace
当前模式下,kube-proxy 作为反向代理,监听随机端口,通过 iptables 规则将流量重定向到代理端口,再由 kube-proxy 将流量转发到后端 pod。Service 的请求会先从用户空间进入内核 ,然后再回到用户空间,代价较大,性能较差。
Iptables
存在的问题:
1.可扩展性差。随着 service 数据达到数千个,其控制面和数据面的性能都会急剧下降。原因在于 iptables 控制面的接口设计中,每添加一条规则,需要遍历和修改所有的规则,其控制面性能是O(n²)。在数据面,规则是用链表组织的,其性能是O(n)
2.LB 调度算法仅支持随机转发
Ipvs 模式
IPVS是专门为LB设计的。它用hash table管理service,对service 的增删查找都是O(1)的时间复杂度。不过 IPVS内核模块没有SNAT功能,因此借用了 iptables 的 SNAT 功能。
IPVS 针对报文做DNAT后,将连接信息保存在nf_conntrack中,iptables 据此接力做 SNAT。该模式是目前 Kubernetes 网络性能最好的选择。但是由于nf_conntrack的复杂性,带来了很大的性能损耗。
Cilium的出现
cilium是什么
Cilium 是一款开源软件,用于透明地保护使用 Linux 容器管理平台(如 Docker 和 Kubernetes)部署的应用服务之间的网络连接。
Cilium 的基础是一项名为 eBPF 的新 Linux 内核技术,该技术能够在 Linux 本身内动态插入强大的安全可见性和控制逻辑。由于 eBPF 在 Linux 内核中运行,因此无需更改应用程序代码或容器配置即可应用和更新 Cilium 安全策略。
eBPF是什么
全称为“ Berkeley Packet Filter ”,于1997 年自Linux 2.1.75版本的内核引入,基于寄存器的虚拟机,运行于内核空间
负责运行从用户空间注入的代码而无须对内核进行编程(开发内核模块)
使用自定义的64位RISC指令集,能够在Linux内核内部运行即时本地编译的“ BPF 程序”,并能访问内核功能和内存的子集
eBPF ,即“ extended BPF ”,由 Alexei Straovoitov 于 2014 年实现,最早出现在 Linux 3.15 版本的内核中
针对现代硬件进行了优化,较之 BPF 执行速度更快
2014年6月,eBPF扩展到用户空间,从而演进成了一个通用执行引擎,应用场景不再局限于数据包过滤,而是逐步扩展到内核各子模块,随后被广泛应用在观测、网络和安全等领域
目前已然发展成为Linux内核的顶级子系统,eBPF 不止是一个包过滤系统, bpf() syscall 允许在内核中直接运行在用户空间编写的代码
XDP
XDP 的全称为“ eXpress Data Path ”,在内核级提供可编程数据包处理机制
Linux 内核中基于 eBPF 提供的高性能数据路径,支持绕过内核的网络栈直接在网络驱动程序的级别处理数据包
无须处理上下文切换、中断等,可大大减少内核开销
cilium
基于eBPF和XDP 的 Kubernetes 高性能网络插件
支持可观测性和安全机制
ServiceMesh 的数据平面
Cilium的功能
查看官网,可以看到 Cilium
的功能主要包含网络、可观测性、安全三个方面
网络
一、高性能云原生网络 (CNI)
Cilium 的控制和数据平面是专为大规模、高度动态的云原生环境而构建的,在这种环境中,数百甚至数千个容器会在几秒钟内创建和销毁。Cilium 的控制平面经过高度优化,可在具有数千个节点和 10 万个 Pod 的 Kubernetes 集群中运行。Cilium 的数据平面使用 eBPF 实现高效的负载平衡和增量更新,从而避免了大型 iptables 规则集的缺陷。
二、第 4 层负载均衡器
Cilium 的高性能、强大的负载平衡实现针对云原生环境的规模和变动进行了调整。您可以使用 Cilium 作为独立的负载平衡器来替换网络中昂贵的旧式设备。这释放了 DSR 和 Maglev 处理本地环境中南北流量的潜力,而无需 Kubernetes 来管理网络边界。
三、集群网格
Cilium Cluster Mesh 允许您连接多个集群的网络,这样每个集群中的 pod 都可以发现和访问网格中所有其他集群中的服务,前提是所有集群都运行 Cilium 作为其 CNI。这样可以有效地将多个集群连接到一个大型统一网络中,无论每个集群运行的 Kubernetes 发行版或位置如何。Cluster Mesh 可增强您服务的高可用性和容错能力。它支持在多个区域或可用区中运行 Kubernetes 集群。如果资源暂时不可用、在一个集群中配置错误或因升级而离线,它可以故障转移到其他集群,确保您的服务始终可访问。
四、Kube-proxy 替代品
用 Cilium 替换 kube-proxy 是一个简单的过程,因为 Cilium 提供了与 Kubernetes API 完全兼容的 Kubernetes 原生实现。现有的 Kubernetes 应用程序和配置可以继续与 Cilium 无缝协作。
Cilium 的 kube-proxy 替代品提供了高级配置模式,可满足特定需求。客户端源 IP 保存等功能可确保服务连接保持完整,而 Maglev 一致性哈希可增强负载平衡和弹性。借助对直接服务器返回 (DSR) 和混合 DSR/SNAT 模式的支持,可以优化流量路由并提高性能。
五、Cilium 服务网格
Cilium Service Mesh 通过使用 eBPF 将网格层直接集成到内核中,重新定义了传统的服务网格框架,从而无需使用 Sidecar 代理。它管理网络和应用程序协议层的连接,以更高的效率处理 IP、TCP、UDP、HTTP、Kafka、gRPC 和 DNS 等协议。
Cilium 的核心是 eBPF,这是一项内置于 Linux 内核的革命性技术。借助 eBPF,Cilium 可提供极快、高效且可扩展的网络。这可避免传统代理的性能缺陷,从而实现服务之间的直接高效通信。
六、网关 API
Cilium 的 Gateway API 实现提供了完全符合 Kubernetes Ingress 标准的实现,并提供了超越 Ingress API 限制的高级路由功能。它支持流量拆分、标头修改和 URL 重写等功能。此外,它还超越了 HTTP 和 HTTPS 流量,支持其他协议,例如 TCP、UDP 和 gRPC。这允许更灵活和复杂的路由策略。
Cilium 的 Gateway API 实现在设计时考虑了不同的运营角色,例如基础设施提供商、集群运营商和应用程序开发人员。通过将 Ingress API 分解为多个 Gateway API 对象,可以根据不同角色的职责为其分配适当的访问权限和特权。
可观测性
一、服务地图
Hubble 提供一系列监控功能,包括服务依赖关系和通信图、网络监控、应用程序监控和安全可观察性。通过依赖 eBPF,所有可见性都是可编程的,并允许采用动态方法,在提供深入而详细的可见性的同时最大限度地减少开销。
Hubble 可轻松自动发现 Kubernetes 集群中 L3/L4 和 L7 级别的服务依赖关系。这允许以服务映射的形式对数据流进行用户友好的可视化和过滤,从而轻松管理服务依赖关系。
二、指标和跟踪导出
Cilium 的指标和跟踪导出功能提供了无缝集成的解决方案,使用户能够轻松监控、分析和优化其 Kubernetes 环境。通过利用 Prometheus 指标的强大功能,结合 Hubble 的网络行为洞察,Cilium 使用户能够深入了解其应用程序和网络,同时简化设置和配置过程。Cilium 还与各种跟踪系统(如 Jaeger、Zipkin 和 OpenTelemetry)集成,以提供分布式跟踪功能。Cilium 经过优化,可在不影响性能的情况下处理大量数据。
Cilium 可捕获大量指标,包括应用程序的延迟、请求率和错误率。这些指标以标准化的 Prometheus 格式导出,可轻松与您现有的监控和可视化工具集成,让您能够实时跟踪网络性能。
三、高级网络协议可视性
Cilium 的协议感知可见性让应用程序所有者能够深入了解其工作负载在协议层面的通信情况。这意味着 Cilium 能够原生理解各种应用程序协议,例如 TLS、gRPC、Kafka、DNS 和 HTTP,以及 SCTP 等其他协议,从而实现对特定于 API 的端点和外部端点的 DNS 身份的细粒度可观察性。
安全
一、透明加密
Cilium 提供了一种简单的解决方案,只需一个交换机即可加密所有节点到节点的流量,无需更改应用程序或添加代理。Cilium 具有使用重叠密钥的自动密钥轮换功能、通过内核 IPsec 或 WireGuard 进行高效的数据路径加密,并且可以加密所有流量,包括 UDP 等非标准流量。只需使用通用密钥配置所有集群中的所有节点,节点之间的所有通信都会自动加密。
二、高级网络策略
Cilium 实现了针对 L3/L4 级别的 Kubernetes 网络策略,并通过 L7 策略进行扩展,为 HTTP、Kafka、gRPC 等常见协议提供细粒度的 API 级安全性。例如,标签为 role=frontend 的端点只能执行 REST API 调用 GET /userdata/[0-9]+,其他所有标签为 role=backend 的 API 交互都受到限制。
Cilium 提供了一个简单直观的网络策略编辑器 UI,减轻了编写网络策略的认知负担。
Cluster Mesh 是 Cilium 的多集群实现,其特点是跨多个集群实施网络策略。Cilium 还具有集群范围的策略,这些策略是非命名空间的,并且通过扩展的 CiliumClusterwideNetworkPolicy CRD 具有集群范围。使用集群范围的策略,管理员可以在所有命名空间中实施一致的策略,从而简化网络管理。
Cilium的关键组件
一、Cilium Agent
◼ 由DaemonSet编排运行集群中的每个节点上
◼ 从Kubernetes 或 API接口接受配置:网络、LB、Network Policy等
◼ 基于SDK调用节点上的eBPF实现相关的功能
二、Cilium Client
◼ 命令行工具,通过Rest API同当前节点上的Cilium Agent进行交互
◼ 常用于检查本地Cilium Agent的状态
◼ 也可用于直接访问eBPF Map
◼ 另外还有一个客户端工具称为Cilium CLI,负责管理整个Cilium集群,而非当前Cilium Agent
三、Cilium Operator
◼ 负责监视和维护整个集群
◼ 同 Cilium 的网络功能和网络策略机制不相关
◆ 其故障并不会影响报文转发和网络策略的进行
◆ 但会影响 IPAM 和 kvstore 的数据存取
四、Cilium Plugin
◼ Cilium自身即为Kubernetes CNI插件,同时还可以完全取代Kube Proxy的功能
扫一扫关注作者公众号,公众号每天分享干货经验