Cilium 简介
Cilium是一个开源的云原生解决方案,用于提供、保护(安全功能)和观察(监控功能)工作负载之间的网络连接,由革命性的内核技术eBPF
提供动力。Cilium主要使用场景在Kubernetes中,但Cilium的优势并不仅限于Kubernetes环境。
在Kubernetes环境中,Cilium可充当网络插件(CNI),提供pod之间的网络连接。它通过执行网络策略(network policy)和透明加密来提供安全性,而Cilium的Hubble组件则提供了网络流量流的深度可见性(监控功能)。
得益于eBPF,Cilium的网络、安全和可观测性逻辑可以直接编程到内核中,从而使Cilium和Hubble的功能对应用工作负载完全透明。这些将是Kubernetes集群中的容器化工作服在,不过Cilium也能连接虚拟机和标准Linux进程等传统工作负载。
关于Cilium可观察性,典型的案例是:pod中应用无需启用Tracing功能,也无需通过exporter将http requests metris 发个Prometheus,仅通过Cilium的Hubble功能,就能直接获取到该应用的http requests的RED(Requests,Errors,Durations)。
Cilium 适用场景-解决大规模容器联网的挑战
在高度动态和复杂的微服务世界中,主要从IP地址和端口的角度考虑网络问题可能会导致挫败感。使用传统的网络工具(通过五元组)实施可能会非常低效,只能提供粗粒度的可见性和过滤,从而限制了排除故障和保护容器网络安全的能力。这些都是Cilium要解决的难题。
从一开始,Cilium就是为大规模、高动态的容器化环境而设计的。她能原生理解容器和Kubernetes身份,并解析HTTP、gRPC、和kafka等API协议,提供比传统防火墙更简单、更强大的可视性和安全性。
所以,Cilium的功能要点集中在以下3点:
- 高性能
- 安全
- 可观察性
Cilium - 基于eBFP构建
eBPF是Cilium强大的安全可视性和控制逻辑能够动态插入Linux内核。eBPF使Linux内核可编程,因此Cilium等应用可以hook Linux内核子系统,将用户空间应用上下文引入内核操作。
因此,要使用完整的Cilium功能,需要非常新版本的Linux内核。目前官方推荐的Linux Kernel是 ≥ 5.10
由于eBPF在Linux内核中运行,因此Cilium安全策略的应用和更新无需更改应用程序代码和容器配置。eBPF程序和Linux网络数据路径挂钩,可用于在数据包进入网络套接字时,根据网络策略规则采取丢弃数据包等操作。
eBPF能够以前所未有的粒度和效率实现对系统和应用程序的可见性和控制。它以完全透明的方式实现了这一点,而无需以任何方式更改应用程序。Cilium利用eBPF的强大功能,将高效身份识别概念分层;将Kubernetes上下文信息(如元数据标签)引入eBPF驱动的网络逻辑。
Cili功能
网络功能
Cilium提供网络连接,允许pod和其他组件(Kubernetes集群内部或外部)进行通信。Cilium实现了一个简单的扁平3层网络,能够跨越多个集群连接所有应用容器(ClusterMesh功能)。
默认情况下,Cilium支持overlay网络模型,其中一个虚拟网络跨越所有主机。Overlay网络中的流量经过封装,可在不同主机之间传输。之所以选择这种模式作为默认模式,是因为他对基础设施和集成的要求较低,主需要主机之间的IP连接。
Cilium还提供本地路由(native routing)网络模式选项,使用每台主机上的常规路由表将流量路由到Pod(或外部)IP地址。这种模式适用于高级用户,需要对底层网络基础设施有一定的了解。他与本地IPv6网络、云网络路由器或预先存在的路由守护程序配合使用效果很好。
身份感知网络策略执行
网络策略定义允许哪些工作负载相互通信,通过防止意外流量来确保部署安全。Cilium可同时执行本地Kubernetes NetworkPolicies和增强型CiliumNetworkPolicy资源(CRD)类型。
传统防火墙通过过滤IP地址和目标端口来保护工作负载。在Kubernetes环境中,每当集群中的Pod启动时,都需要对所有节点主机上的防火墙(或iptable规则)进行操作,以便重建与所需网络策略执行相对应的防火墙规则,这并不能很好的扩展。
为了避免这种情况,Cilium根据Kubernetes标签等相关元数据为应用容器组分配一个身份(identity)。然后将该身份与应用容器发出的所有网络数据包关联起来,使eBPF程序能够在接收节点有效验证身份,而无需使用任何Linux防火墙规则。例如,当扩展部署并在集群中创建新Pod时,新Pod与现有Pod共享相同的身份。与网络策略执行相对应的eBPF程序规则无需再次更新,因为他们已经知道Pod的身份。
传统防火墙在第3层和第4层运行,而Cilium还能确保REST/HTTP、gRPC和kafka等现代第7层应用协议的安全(除了在第3层和第4层执行外)。还能根据应用协议请求条件执行网络策略,例如:
- 允许方法GET、路径为
/public/.*
的所有HTTP请求。拒绝所有其他请求。 - 要求所有REST调用都包含HTTP表头
X-Token:[0-9]
透明加密
现在,服务之间的数据加密已成为PCI和HIPAA等许多监管框架的要求。Cilium支持使用IPSec或WireGuard进行简单配置的透明代理,启用后无需重新配置任何工作负载即可确保节点之间流量的安全。
多集群网络
Cilium的Cluster Mesh功能可让工作负载轻松与不同Kubernetes集群中托管的服务进行通信。您可以在不同区域的集群中运行服务,并使用Cilium Cluster Mesh将他们连接起来,从而实现服务的高可用性。
负载均衡
Cilium为应用程序容器和外部服务之间的流量实现分布式负载均衡。事实上,Cilium可以完全替代kube-proxy等组件,也可以用作独立的负载均衡器。eBPF使用高效的哈希表实现负载均衡,几乎可以无限扩展。
增强的网络可观察性
虽然我们对tcpdump和ping等工具情有独钟,他们在我们心中永远占据着特殊的位置,但他们无法胜任在动态Kubernetes集群环境中排除网络问题的任务。Cilium致力于提供可观察性工具,让你能够快速识别和修复集群网络问题。
为此,Cilium推出了名为Hubble的专用网络可观察性组件。Hubble利用Cilium的身份概念,以可操作的方式轻松过滤流量,并提供一下功能:
- 第3/4层(IP地址和端口)和第7层(API协议)的网络流量可见性
- 带元数据的事件监控:当数据包被丢弃时,该工具不仅会报告数据包的源IP和目标IP,还会提供发送方和接收方的完整标签信息以及大量其他信息
- 可配置的Prometheus指标导出
- 可视化集群网络流量的图形用户界面
Prometheus 指标
Cilium和Hubble通过Prometheus输出有关网络性能和延迟的指标,因此可以将Cilium指标集成到现有的Grafana仪表盘中。
最新消息, Cilium 和 Grafana 合作有初步成果了 —— Grafana Hubble 数据源. 具体可以阅读这篇文章: Monitor Kubernetes network and security events with Hubble and Grafana Monitor Kubernetes network and security events with Hubble and Grafana: https://grafana.com/blog/2023/07/13/how-to-monitor-kubernetes-network-and-security-events-with-hubble-and-grafana/
Service Mesh
Cilium支持服务间的负载均衡、应用层可见性和各种与安全相关的功能,所有这些都是Kubernetes 服务网格的功能。Cilium还支持Kubernetes的Ingress和Gateway API,可提供全套服务网格功能,但不需要在每个Pod中注入Sidecar的开销。
总结
Cilium是一个开源云原生解决方案,用于提供、保护(安全功能)和观察(监控功能)的工作负载之间的网络连接,由革命性的内核技术eBPF提供动力。Cilium主要使用场景在Kubernetes中。
Cilium最主要的特点是:
- 高性能
- 安全功能
- 可观察性
Cilium除了作为Kubernetes CNI之外,还有很多其他功能,包括不限于:
- 多集群网络
- 负载均衡(完全替代Kube-proxy)
- Service Mesh
参考文档
eBPF: https://ebpf.io/what-is-ebpf/
完全替代 kube-proxy: https://cilium.io/blog/2020/06/22/cilium-18/#kubeproxy-removal
独立的负载均衡器: https://cilium.io/blog/2022/04/12/cilium-standalone-L4LB-XDP/
Monitor Kubernetes network and security events with Hubble and Grafana: https://grafana.com/blog/2023/07/13/how-to-monitor-kubernetes-network-and-security-events-with-hubble-and-grafana/
服务网格: https://isovalent.com/blog/post/cilium-service-mesh/
Introduction to Cilium & Hubble — Cilium 1.13.4 documentation: https://docs.cilium.io/en/stable/overview/intro/