GKE的新数据平面使用基于eBPF的cilium项目

2020-08-20 02:36:28

Kubernetes真正的超能力之一是其开发者优先的网络模式。它提供易于使用的功能,如L3/L4服务和L7入口,用于将流量引入您的群集,以及用于隔离多租户工作负载的网络策略。随着越来越多的企业采用Kubernetes,随着围绕多云、安全性、可见性和可扩展性的新需求,用例的范围也在扩大。此外,服务Mesh、无服务器等新技术对底层的Kubernetes层提出了更高的定制化要求。这些新需求都有一些共同点:它们需要一个更具可编程性的数据平面,能够在不牺牲性能的情况下执行Kubernetes感知的数据包操作。

进入Extended Berkeley Packet Filter(EBPF),这是一种新的Linux网络范例,它将可编程钩子公开到Linux内核内的网络堆栈。使用用户空间信息丰富内核的能力-无需在用户和内核空间之间来回跳转-实现了对网络数据包的高速上下文感知操作。

今天,我们将介绍GKE DataPlane V2,这是一个固执己见的数据平面,它利用了eBPF和cilium的力量,cilium是一个开放源码项目,它使用eBPF使Linux内核能够识别Kubernetes。现在在测试版中,我们还在使用DataPlane V2将Kubernetes网络策略日志记录引入Google Kubernetes Engine(GKE)。

EBPF是一项革命性的技术,它可以在Linux内核中运行沙箱程序,而无需重新编译内核或加载内核模块。在过去的几年中,eBPF已经成为解决以前依赖于内核更改或内核模块的问题的标准方法。此外,eBPF还在网络、安全和应用程序分析等领域开发了全新一代的工具。这些工具不再依赖现有的内核功能,而是主动重新编程运行时行为,所有这些都不会影响执行效率或安全性。

Cilium是一个在eBPF之上设计的开源项目,旨在满足容器工作负载的新的可伸缩性、安全性和可见性需求。Cilium超越了传统的Container Networking Interface(CNI),可提供服务解析、策略实施等更多功能,如下图所示。

Cilium社区已经投入了大量的精力来引导cilium项目,这是Kubernetes最成熟的eBPF实现。我们在Google积极为cilium项目做出贡献,这样整个Kubernetes社区就可以利用我们在eBPF方面取得的进步。

让我们看看eBPF如何帮助我们解决真正的客户痛点的具体应用程序。有安全意识的客户使用Kubernetes网络策略来声明Pod之间如何通信。但是,没有可扩展的方法来对这些策略的行为进行故障排除和审核,这使得它对企业客户来说是行不通的。通过将eBPF引入GKE,我们现在可以支持实时策略实施,并以线速将策略操作(允许/拒绝)关联到POD、命名空间和策略名称,而对节点的CPU和内存资源的影响最小。

上图显示了如何将高度专门化的eBPF程序安装到Linux内核中,以实施网络策略和报告操作日志。当数据包进入VM时,内核中安装的eBPF程序决定如何路由数据包。与iptables不同,eBPF程序可以访问特定于Kubernetes的元数据,包括网络策略信息。这样,它们不仅可以允许或拒绝数据包,还可以将带注释的操作报告回用户空间。这些事件使我们可以生成对Kubernetes用户有意义的网络策略日志。例如,下面显示的日志片段精确指出了哪个源Pod正在尝试连接到哪个目的Pod,以及哪个网络策略允许该连接。

在幕后,网络策略日志记录利用GKE DataPlane V2。GKE DataPlane V2不仅公开了策略日志记录所需的信息,还完全抽象了用户配置网络策略实施的细节。也就是说,当您使用DataPlane V2时,您不必再担心显式启用网络策略强制或选择正确的CNI来在GKE集群上使用网络策略。谈到让Kubernetes更容易使用!

除了网络策略,Kubernetes负载均衡还可以使用eBPF实现直接服务器返回(DSR)模式。DSR消除了在使用Kubernetes LoadBalancer服务时丢失客户端IP地址的附加NAT问题。EBPF将元数据动态编码为网络数据包的能力允许我们向目的地节点提供附加信息,以便它可以直接与原始客户端进行对话。使用DSR,我们可以降低每个节点的带宽需求,同时避免端口耗尽。

EBPF使用自定义元数据扩充网络数据包的能力支持一长串可能的用例。我们和你们一样对Kubernetes和eBPF的未来感到兴奋,所以请继续关注更多的创新。

企业总是希望通过更好地了解其基础设施来改善其安全状况。他们希望能够快速识别异常流量模式,例如意外与互联网通话的Pod和拒绝服务攻击。有了Kubernetes网络策略日志记录,您现在可以直接在云日志控制台中看到所有允许和拒绝的网络连接,以排除策略故障和发现不正常的网络活动。

要亲自尝试Kubernetes Network Policy日志记录,请使用以下命令使用DataPlane V2创建一个新的GKE集群。

Gcloud测试版容器群集创建<;群集名称>;\ --enable-dataplan-v2\ --释放通道快速\ --cluster-version 1.17.9-gke.600\ --区域us-east1-d。

谷歌要感谢cilium项目的联合创始人Thomas Graf为这篇博客所做的贡献。