Cilium 1.10版本特性解读:支持 Wireguard、BGP、Egress IP 网关、XDP、阿里云集成


Cilium 团队宣布 Cilium 1.10 版本正式发布。此版本总共包含了 2042 个新的提交。280位贡献者来自不同的企业包括:阿里巴巴、Datadog、Google、 Isovalent、 SuSE、Palantir 等。无论是自建数据中心,还是云上使用Cilium的用户,对更好、更广泛的网络集成提出了很多反馈。此版本的主要重点是确保Kubernetes网络与企业内部部署基础结构之间的无缝集成。
  • Egress IP gateway:当将云原生应用程序与在集群之外运行的传统应用程序集成时,由于Pod IP比传统网络更具弹性,因此IP地址管理可能会成为一个难题。通过新的Kubernetes CRD,可以在数据包离开Kubernetes集群时将静态IP与流量相关联。这使外部防火墙可以识别固定IP,并且过滤特定pod的流量。
  • Integrated BGP Support:我们简化了通过BGP公告 Kubernetes service IP的功能,以允许外部负载轻松和集群内云原生应用程序进行通信。在1.10版本中,我们在Cilium中集成了 BGP 服务公告,因而无需任何其他外部组件就能暴露这些 service。

  • 独立 Load Balancer:Cilium的高性能、强大的负载平衡实现针对云原生环境的规模和客户需求进行了调整。现在,您可以使用Cilium作为独立的负载平衡器来替换网络中昂贵的硬件负载均衡。无需Kubernets,也可使用DSR和Maglev在本地环境中处理南北流量。
    • PCAP Recorder 通过全部或部分抓包,在独立负载均衡器模式下提供可观测性能力。


除了着眼于与更广泛的网络集成外,我们还致力于简化Cilium安装部署,进一步提升网络性能,并添加了一系列急需的功能:
  • 支持 Wireguard:作为最受人追捧的功能之一,Cilium现在支持使用Wireguard协议替代现有IPsec实现对集群中Pod之间的流量进行加密。
  • 集群管理 CLI(New):增加了实验性的Cilium CLI 工具,通过自动检测您的环境限制并使用最佳选项集来配置Cilium,从而简化了安装、故障排除和功能启用。
  • 更好的性能:Cilium现在具有跳过 Netfilter 连接跟踪的功能,改进了北/南服务处理,并且通过改进的Linux隧道将吞吐量性能提高了一倍。
  • 更多增强:该版本带来了对Kubernetes双栈阿里云原生IPAM,并发布ARM64的第一个官方版本。新的 Rancher 、Rancher Kubernetes Engine 指南使得在本地Kubernetes环境中部署Cilium更容易。


Egress IP Gateway

主要贡献:Yongkun Gui(Google)and Bolun Zhao(Google)

随着Kubernetes成为应用容器化的标准平台,将这些新服务连接到遗留环境变得很痛苦。传统工作负载具有可以被防火墙识别的固定且唯一的IP。当容器根据需要伸缩时,来自容器应用程序的流量将来自许多不同的IP,通常会以每个容器所在节点的IP的形式出现。这使得很难为应用程序设置安全边界并审核其行为。

1.10版本将出口网关功能引入了Cilium。现在,Cilium允许用户指定出口NAT策略,以便将所选的Pod的出口流量伪装成用户定义的IP地址。如下图所示,来自工作节点中运行的Pod的流量不是通过eth0直接流出,而是通过网关节点从群集中流出。在此节点上,将应用SNAT为出站流量提供一致的外部IP。从那里,可以将网络组件配置为根据源IP地址不同地处理流量。例如,传统防火墙能够通过完全匹配入站流量的源IP地址来过滤源自具有特定标签的Pod的流量。
1.png

例下面策略,Cilium 会把 default 命名空间下,发到外部地址 192.168.33.13/32的 Pod的流量,重定向到 192.168.33.100的(网关)节点。可在入门指南中找到有关出口网关的更多信息。
apiVersion: cilium.io/v2alpha1  
kind: CiliumEgressNATPolicy  
metadata:  
name: egress-sample  
spec:  
egress:  
- podSelector:  
  matchLabels:  
    # The following label selects default namespace  
    io.kubernetes.pod.namespace: default  
destinationCIDRs:  
- 192.168.33.13/32  
egressSourceIP: "192.168.33.100"  

BGP for LoadBalancer VIP

主要贡献:Chris Tarazi(Isovalent)

随着Kubernetes在本地环境中变得越来越普遍,用户在其环境中越来越多地同时使用传统应用程序和Cloud Native应用程序。为了将它们连接在一起并允许外部访问,需要一种机制来集成Kubernetes和运行BGP的现有网络基础结构。

Cilium 1.10版本带来了对BGP的集成支持,将Kubernetes暴露于外部,同时简化了用户的部署。集成通过MetalLB进行,利用了service IP和BGP的L3协议支持。现在Cilium可为LoadBalancer的service分配IP,并通过BGP向其BGP路由器通告它们。现在无需其他组件就可以把serivce暴露到集群外部。
2.png

将来,我们计划也支持通过BGP发布Pod CIDR和出口IP网关。这将进一步改善Cloud Native与传统环境之间的桥梁。以下是用于配置Cilium的BGP功能的ConfigMap示例。配置的两个主要方面是对等方和地址池。前者用于与网络中现有的BGP路由器连接,因此需要IP地址和ASN。后者是Cilium将为LoadBalancer服务分配IP的池。
apiVersion: v1  
kind: ConfigMap  
metadata:  
name: bgp-config  
namespace: kube-system  
data:  
config.yaml: |  
peers:  
- peer-address: 10.0.0.1  
  peer-asn: 64512  
  my-asn: 64512  
address-pools:  
- name: default  
  protocol: bgp  
  addresses:  
  - 192.0.2.0/24 


更多请参阅文档中的BGP指南

阿里云集成

主要贡献:Bokang Li(Alibaba)

Cilium 支持从公有云上分配IP给Pod,之前已经支持的有 AWS ENI (v1.6)、Azure (v1.8)模式。在1.10版本里增加了阿里云的支持,使得 Cilium 可以直接为Pod 分配 ENI (Elastic Network Interface)上的IP。
3.png

这种模式下,Cilium 为Pod 直接分配 ENI 的IP,这个地址在阿里云的 VPC 上可以被直接路由。这种模式简化了 Pod 间流量模型避免了封装、SNAT。作为云原生的网络解决方案,用户可以轻易使用云企业网(CEN)、VPN网关将自建集群接入到阿里云上。

更多信息参考阿里云使用文档

Wireguard 透明加密

主要贡献:Martynas Pumputis(Isovalent)and Sebastian Wicki(Isovalent)
4.png

在1.10版本中,我们加入Wireguard协议进行透明加密。透明加密是一项功能,可确保Pod之间的流量通过安全隧道传输,从而允许用户在不受信任的网络中运行Kubernetes。自1.4版开始,Cilium就已经支持通过IPSec进行透明加密。现在,我们也引入了 Wireguard。Wireguard 协议不允许对诸如密钥大小和密码套件之类的参数进行调整,这使其非常易于使用并简化了部署和操作。每个节点的加密密钥对由Cilium自动生成,并且密钥旋转由Wireguard内核模块透明地执行。
5.png

对于某些工作负载,Wireguard还具有优于IPSec的性能优势。在我们最近的CNI性能分析博客文章中,我们对这两种协议进行了评估,发现Wireguard可以为流工作负载实现非常高的吞吐量,但是IPSec仍可以实现更好的延迟,并且在某些情况下可以将加密算法卸载到CPU。上图显示了我们实验的简短摘录,请阅读完整的博客以获取更多详细信息。

Wireguard的另一个技术优势是,它可以很好地集成到Cilium datapath 体系中。由于安全隧道是作为Linux网络接口公开的,因此Wireguard可以非常轻松地标记来自容器的数据包以进行加密,然后将其转发到安全隧道设备。下面的动画显示了Cilium中Wireguard加密数据包的路径:
6.gif

Cilium 1.10中直接路由和隧道模式均支持的Wireguard加密,如果基础Linux内核支持的话,也可以在托管Kubernetes环境中启用Wireguard加密。当前缺少对主机级别加密以及Cilium L7 策略和可观测性的支持,并将在后面Cilium版本中添加。如果您想了解有关Cilium中的Wireguard集成的更多信息,请确保观看eCHO第3集直播的录制,并阅读Cilium文档中的入门指南

Kubernetes 双栈

主要贡献:Deepesh Pathak(Microsoft),André Martins(Isovalent)

Cilium 创建之初就支持 IPv4 / v6双栈。在Cilium的早期原型中也支持 IPv6 单栈模式。鉴于Kubernetes一直缺乏双栈支持,Cilium 对Pods、 Services的 IPv6 支持有点麻烦。在最新的Kubernetes 稳定版本中IP双栈已经默认开启:Kubernetes 1.21默认开启IP双栈(beta)。Cilium IPv4/v6 双栈功能可以通过 helm 部署时开启,设置 ipv6.enabled
$ helm install cilium cilium/cilium --version 1.10.0 \  
--namespace kube-system \  
--set ipv4.enabled=true \  
--set ipv6.enabled=true  
$ kubectl get cep -n kube-system  
NAME                       ENDPOINT ID   IDENTITY ID   ENDPOINT STATE   IPV4            IPV6  
coredns-755cd654d4-msqgm   2205          11023         ready            10.16.115.242   fd02::71cf

Cilium ARM64 镜像

主要贡献:André Martins(Isovalent)

在以前的版本中,Cilium核心团队已在ARM64平台上提供了快照以用于初始测试。但是没发布到Cilium的官方镜像。在个迭代中我们对镜像构建进行了一些改进,以允许自动构建多架构镜像docker镜像。从Cilium 1.10开始,Docker Hub和Quay.io上的官方Cilium存储库将托管这些多架构镜像。在ARM64上安装Cilium与在其他平台上安装类似,使用与AMD64 docker镜像相同的映像标签。这让Cilium 具备在AWS Graviton 实例、Azure Linux/ARM64 Pipelines 等一系列新硬件上运行的能力。Cilium甚至可以在智能手机上运行!
14.png

Cilium CLI

提供了一个新的CLI,可用于安装和管理Cilium群集。CLI直接连接Kubernetes API,并提供各种功能来管理Cilium。该CLI 兼容Cilium的旧版本。
  • 检查Cilium安装状态,并快速显示故障状态。
  • 自动检测特定Kubernetes环境(datapath,IPAM等)的理想配置选项。
  • 启用Hubble观测性和Relay组件。
  • 管理多集群连接和状态。
  • 执行连接性和一致性测试,以验证集群中的网络功能。


集群范围 Cilium Status

cilium status 命令可以快速检查 Cilium 安装状态。可显示不正常组件数量、节点故障的状态。
$ cilium status  
/¯¯\  
/¯¯\__/¯¯\    Cilium:         OK  
\__/¯¯\__/    Operator:       OK  
/¯¯\__/¯¯\    Hubble:         disabled  
\__/¯¯\__/    ClusterMesh:    disabled  
\__/  
Deployment        cilium-operator    Desired: 2, Ready: 2/2, Available: 2/2  
DaemonSet         cilium             Desired: 2, Ready: 2/2, Available: 2/2  
Containers:       cilium             Running: 2  
              cilium-operator    Running: 2  
Image versions    cilium             quay.io/cilium/cilium:v1.10.0: 2  
              cilium-operator    quay.io/cilium/operator-generic:v1.10.0: 2 

连通性和一致性测试

新增 cilium connectivity test 命令,可以快速验证网络、 kubernets service、network policy 是否按预期工作,是验证 Cilium 正常工作的理想工具。
13.png

Cilium网络性能改进

主要贡献:Gilberto Bertin(Isovalent),Kornilios Kourtis(Isovalent)and Daniel Borkmann(Isovalent)

之前版本工作,我们继续严格评估Cilium的网络性能。我们在博文中总结了我们的最新发现,并将其整合到Cilium的文档中。我们对比不同场景,展示了 eBPF 带来的低延迟、高吞吐的 CNI ,以及 Wireguard 和 IPsec 的对比。

在我们深入的性能评估的指导下,Cilium 1.10包括许多 datapath 改进,这次主要集中在VXLAN / Geneve隧道性能以及减少Netfilter开销上。最为显着地:
  • BPF host routing已扩展为支持封装。这意味着在直接路由和隧道模式下均可以使用eBPF最大化性能。由于不再需要上主机堆栈处理网络流量,因此可以将南北服务处理与直接路由模式相提并论。
  • 我们定位并解决了Linux内核中的性能问题,该问题导致VXLAN和Geneve的UDP封装数据包的GRO聚合被延迟,导致与Cilium封装一起使用时性能欠佳。该修复程序已回合到所有稳定的内核(例如4.9),并已集成到下游发行版(如Ubuntu LTS变体)中。在我们的测试环境中,这使VXLAN和Geneve封装的 Gbit/s 级流量TCP单流吞吐速率提高了一倍以上。
  • 最后,现在可以将Cilium配置为跳过Netfilter conntrack:我们引入了一个新的配置项 --install-no-conntrack-iptables-rules ,该选项允许在任何可能的情况下跳过Netfilter连接跟踪。您可以在调优指南中阅读更多内容。


Case 1:Pod到Pod隧道模式

对Pod 间使用VXLAN/Geneve隧道互访场景,吞吐性能有显著提升(通过netperf TCP_STREAM 测试)。我们对Linux内核的GRO引擎进行了小幅改进,该引擎通过将MTU大小的数据包聚合到64k个超级数据包来优化Linux的堆栈遍历,从而降低了每个数据包的堆栈处理成本。
7.png

Case 2:主机到 Service/Pod 隧道模式

对于外部客户端(例如NodePort service)访问Pod 情况,可以应用与之前直接路由情况相同的改进。转发可以直接在tc eBPF层中执行,而不必将数据包推入主机栈。这将显着提高单流吞吐量(TCP_STREAM),并显着减少延迟(TCP_RR TCP_CRR)。当数据包必须走隧道时(例如Pod 到Pod),这时收益不明显,因为这要求通过上层UDP堆栈。但对后端在本地节点的收益明显。一个典型的例子是NodePort 服务并且指定了 externalTrafficPolicy=Local
8.png

Case 3:Pod 到 Pod 直接路由模式

对于最后一种情况,我们研究了流量通过 Netfilter 子系统时的性能影响。发现特别是Netfilter 连接跟踪模块会给 fast-path 增加大量成本。由于我们实现了基于eBPF 的源地址转换,我们可以跳过连接跟踪。改进后连接/请求/响应类型的工作负载(TCP_CRR)性能几乎提升了一倍。
9.png

XDP-based Standalone Load Balancer

主要贡献:Daniel Borkmann(Isovalent),Martynas Pumputis(Isovalent),Chris Tarazi(Isovalent)and Sebastian Wicki(Isovalent)

Cilium基于eBPF的负载均衡器最新增加了对Maglev一致性哈希的支持以及eXpress数据路径(XDP)层的转发平面加速,从而显着提高了鲁棒性和负载均衡效率。这些功能目标是替代kube-proxy,同时也为可编程的高性能第4层负载均衡器(L4LB)框架铺平了道路,我们在1.10版本中添加了该框架。Cilium XDP L4LB 带有完整的IPv4/v6 双栈支持,可以独立于Kubernetes进行部署。我们共同维护的Linux内核中的XDP层提供了接近于DPDK的性能,同时通过在驱动程序层中运行eBPF程序,搭载Linux的NAPI机制来更有效地利用CPU资源。绝大部分的10G,40G和100G NIC驱动程序,LTS内核均支持XDP。为了更好地理解Cilium XDP L4LB的功能和架构,可见下图:
10.png

Cilium 基于XDP 的L4 负载均衡由下面两部分组成:
  • 高性能转发平面,eBPF 程序运行在驱动层,以便Maglev一致哈希以L4 DNAT从服务表中选择后端,然后将数据包尽快回出节点尽可能possible,
  • Cilium编排API,以便对主要服务表和通配的n元组PCAP记录器进行编程和利用,该记录器可用于过滤和观察L4LB的入站和相应出站流量。


通过集成到XDP层和Maglev 后端状态保持,L4LB可以随着NIC接收队列的CPU的数量线性扩展。鉴于负载均衡器设计的效率和较低的CPU开销,Cilium XDP L4LB也可以与常规工作负载并置。尽管Cilium的XDP L4LB入门指南尚在开发中,但请参阅示例DaemonSet以了解如何部署负载平衡器。入门指南发布后,我们将更新。

DSR with IPIP Encapsulation and L4 DNAT

Cilium的XDP L4LB实现了直接服务器返回(DSR),用于将请求转发到后端节点,这是通过将客户端请求封装到 IPIP/IP6IP6 数据包中来实现的。内层 IP 头包含原始请求,因此后端节点具有完整的上下文,可以直接向客户端发送答复,从而节省了反向路径的额外跳数。L4LB DNAT 后端可以配置为 service 或者 pod ip。对于即将发布的版本,我们计划将其扩展到其他封装机制。
11.png

n-Tuple PCAP Recorder

在一组不断处理每秒数亿个数据包的Cilium XDP L4LB中,如何才能有效地找到来排除故障或观察一小部分网络流量呢?由于XDP在常规网络堆栈以下运行,现有工具(例如tcpdump)并不可用。在Cilium XDP L4LB的数据路径中,设置有两个观察点,以便过滤并记录LB入站流量及其对应的出站流量。这就使得我们可以观测流量通过负载均衡后下一跳路径。L4LB 过滤器支持通配符和n元组表达式,当然也支持 IPv4/v6,这意味着允许匹配源和目标前缀,端口和协议的任意组合。支持导出为PCAP文件,以通过Wireshark,tcpdump或其他熟悉的工具进行检查。
12.gif

PCAP记录器对XDP datapath 里面大流量进行优化,可通过新的Hubble Recorder API 调用。为了方便起见,我们还为Hubble CLI添加了支持,作为Hubble Recorder API 用法的一个示例。上面的示例演示如何通过在Hubble CLI中指定5元组过滤器来捕获从任何源到目标 192.168.33.11:80 L4LB转发的TCP服务流量。PCAP记录器目前仅在Cilium的新XDP L4LB模式下可用,未来计划支持分析集群内东西向流量。

译文链接:https://mp.weixin.qq.com/s/FaLtC6j3zhf9W3wKbfQX0g

0 个评论

要回复文章请先登录注册