【Cilium 1.10 重磅发布!】支持 Wireguard, BGP, Egress IP 网关, XDP 负载均衡, 阿里云集成

作者: 清弦

阿里云技术专家,主要负责ACK 容器网络设计与研发,阿里云开源CNI项目Terway 主要维护者,Cilium Alibaba IPAM 贡献者


本文翻译自Cilium 1.10 发布文档[1] 由于译者水平有限,本文不免存在遗漏或错误之处。如有疑问,请查阅原文。 以下是译文。


image
image.gif
  • Egress IP Gateway
  • BGP for LoadBalancer VIP
  • 阿里云集成
  • Wireguard 透明加密
  • Cilium ARM64 镜像
  • Cilium CLI
    • 集群范围 Cilium Status
    • 连通性和一致性测试
  • Cilium网络性能改进
    • Case 1: Pod 到 Pod 隧道模式
    • Case 2: 主机到 Service/Pod 隧道模式
    • Case 3: Pod 到 Pod 直接路由模式
  • XDP-based Standalone Load Balancer
    • DSR with IPIP Encapsulation and L4 DNAT
    • n-Tuple PCAP Recorder
    • 参考资料

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的流量。[More details][2]

  • Integrated BGP Support: 我们简化了通过BGP公告 Kubernetes service IP的功能,以允许外部负载轻松和集群内云原生应用程序进行通信。 在1.10版本中,我们在Cilium中集成了 BGP 服务公告,因而无需任何其他外部组件就能暴露这些 service。[More details][3]

  • 独立 Load Balancer: Cilium的高性能、强大的负载平衡实现针对云原生环境的规模和客户需求进行了调整。 现在,您可以使用Cilium作为独立的负载平衡器来替换网络中昂贵的硬件负载均衡。 无需Kubernets,也可使用DSR和Maglev在本地环境中处理南北流量。 [More details][4]

    • PCAP Recorder 通过全部或部分抓包,在独立负载均衡器模式下提供可观测性能力。 [More details][5]

除了着眼于与更广泛的网络集成外,我们还致力于简化Cilium安装部署,进一步提升网络性能,并添加了一系列急需的功能:

  • 支持 Wireguard: 作为最受人追捧的功能之一,Cilium现在支持使用Wireguard协议替代现有IPsec实现对集群中Pod之间的流量进行加密。[More details][6]

  • 集群管理 CLI (New): 增加了实验性的Cilium CLI 工具,通过自动检测您的环境限制并使用最佳选项集来配置Cilium,从而简化了安装、故障排除和功能启用。[More details][7]

  • 更好的性能: Cilium现在具有跳过 Netfilter 连接跟踪的功能,改进了北/南服务处理,并且通过改进的Linux隧道将吞吐量性能提高了一倍。 [More details][8]

  • 更多增强: 该版本带来了对[Kubernetes双栈][9][阿里云原生IPAM][10],并发布[ARM64的第一个官方版本][11]。新的 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的流量。

image
image.gif

例下面策略,Cilium 会把 default 命名空间下,发到外部地址 192.168.33.13/32的 Pod的流量,重定向到 192.168.33.100的(网关)节点。 可在[入门指南][12]中找到有关出口网关的更多信息。

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"

image.gif

BGP for LoadBalancer VIP

主要贡献: Chris Tarazi (Isovalent)

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

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

image
image.gif

将来,我们计划也支持通过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

image.gif

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

阿里云集成

主要贡献: Bokang Li (Alibaba)

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

image
image.gif

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

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

Wireguard 透明加密

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

image
image.gif

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

image
image.gif

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

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

image
image.gif

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

Kubernetes 双栈

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

Cilium 创建之初就支持 IPv4 / v6双栈。 在Cilium的早期原型中也支持 IPv6 单栈模式。 鉴于Kubernetes一直缺乏双栈支持,Cilium 对Pods、 Services的 IPv6 支持有点麻烦。 在最新的Kubernetes 稳定版本中IP双栈已经默认开启: [Kubernetes 1.21默认开启IP双栈(beta)][19]。 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

image.gif

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甚至可以在智能手机上运行!

Armbian trunk on a Snapdragon 835 (OnePlus 5) running k8s and Cilium eBPF @armbian @ciliumproject @kubernetesio pic.twitter.com/QXMCiox12X — Ricardo Pardini (@SilvioSantoZ) May 12, 2021

Cilium CLI

提供了一个新的[CLI][20],可用于安装和管理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

image.gif

连通性和一致性测试

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

$ cilium connectivity test
✨ [gke_cilium-dev_us-west2-a_test-21504] Creating namespace for connectivity check...
✨ [gke_cilium-dev_us-west2-a_test-21504] Deploying echo-same-node service...
[...]
---------------------------------------------------------------------------------------------------------------------
 [pod-to-pod] Testing cilium-test/client-68c6675687-tcw9f -> cilium-test/echo-other-node-588bf78fbb-84fvc...
---------------------------------------------------------------------------------------------------------------------
✅ [pod-to-pod] cilium-test/client-68c6675687-tcw9f (10.96.6.173) -> cilium-test/echo-other-node-588bf78fbb-84fvc (10.96.5.226)
[...]
---------------------------------------------------------------------------------------------------------------------
 Test Report
---------------------------------------------------------------------------------------------------------------------
✅ 9/9 tests successful (0 warnings)

image.gif

Cilium网络性能改进

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

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

在我们深入的性能评估的指导下,Cilium 1.10包括许多 datapath 改进,这次主要集中在VXLAN / Geneve隧道性能以及减少Netfilter开销上。 最为显着地::

  • [BPF host routing][24] 已扩展为支持封装。 这意味着在直接路由和隧道模式下均可以使用eBPF最大化性能。 由于不再需要上主机堆栈处理网络流量,因此可以将南北服务处理与直接路由模式相提并论。

  • 我们定位并[解决][25]了Linux内核中的性能问题,该问题导致VXLAN和Geneve的UDP封装数据包的GRO聚合被延迟,导致与Cilium封装一起使用时性能欠佳。 该修复程序已回合到所有稳定的内核(例如4.9),并已集成到下游发行版(如Ubuntu LTS变体)中。 在我们的测试环境中,这使VXLAN和Geneve封装的 Gbit/s 级流量TCP单流吞吐速率提高了一倍以上。

  • 最后,现在可以将Cilium配置为跳过Netfilter conntrack:我们引入了一个新的配置项 --install-no-conntrack-iptables-rules ,该选项允许在任何可能的情况下跳过Netfilter连接跟踪。 您可以在[调优指南][26]中阅读更多内容。

Case 1: Pod 到 Pod 隧道模式

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

image
image.gif

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

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

image
image.gif

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

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

image
image.gif

XDP-based Standalone Load Balancer

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

Cilium基于eBPF的负载均衡器最新增加了对[Maglev][28]一致性哈希的支持以及[eXpress数据路径][29](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的功能和架构,可见下图:

image
image.gif

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][30]以了解如何部署负载平衡器。 入门指南发布后,我们将更新。

DSR with IPIP Encapsulation and L4 DNAT

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

image
image.gif

n-Tuple PCAP Recorder

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

image
image.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模式下可用,未来计划支持分析集群内东西向流量。

参考资料

  1. https://cilium.io/blog/2021/05/20/cilium-110

  2. https://cilium.io/blog/2021/05/20/cilium-110#egressgateway

  3. https://cilium.io/blog/2021/05/20/cilium-110#bgp

  4. https://cilium.io/blog/2021/05/20/cilium-110#standalonelb

  5. https://cilium.io/blog/2021/05/20/cilium-110#pcap

  6. https://cilium.io/blog/2021/05/20/cilium-110#wireguard

  7. https://cilium.io/blog/2021/05/20/cilium-110#cli

  8. https://cilium.io/blog/2021/05/20/cilium-110#performance

  9. https://cilium.io/blog/2021/05/20/cilium-110#dualstack

  10. https://cilium.io/blog/2021/05/20/cilium-110#alibaba

  11. https://cilium.io/blog/2021/05/20/cilium-110#arm64

  12. https://docs.cilium.io/en/v1.10/gettingstarted/egress-gateway/

  13. https://metallb.universe.tf/

  14. https://docs.cilium.io/en/v1.10/gettingstarted/bgp/

  15. https://docs.cilium.io/en/v1.10/gettingstarted/alibabacloud-eni/

  16. https://cilium.io/blog/2021/05/11/cni-benchmark#encryption

  17. https://www.youtube.com/watch?v=-awkPi3D60E

  18. https://docs.cilium.io/en/v1.10/gettingstarted/encryption-wireguard/

  19. https://kubernetes.io/docs/concepts/services-networking/dual-stack/

  20. https://github.com/cilium/cilium-cli

  21. https://cilium.io/blog/2020/11/10/cilium-19#performance-testing-framework

  22. https://cilium.io/blog/2021/05/11/cni-benchmark

  23. https://docs.cilium.io/en/v1.10/operations/performance/benchmark/

  24. https://cilium.io/blog/2020/11/10/cilium-19#virtual-ethernet-device-optimization-with-ebpf

  25. https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=89e5c58fc1e2857ccdaae506fb8bc5fed57ee063

  26. https://docs.cilium.io/en/v1.10/operations/performance/tuning/#bypass-iptables-connection-tracking

  27. https://cilium.io/blog/2020/11/10/cilium-19#virtual-ethernet-device-optimization-with-ebpf

  28. https://cilium.io/blog/2020/11/10/cilium-19#maglev-load-balancing

  29. https://cilium.io/blog/2020/06/22/cilium-18#kube-proxy-replacement-at-the-xdp-layer

  30. https://github.com/cilium/cilium-l4lb-test/blob/master/cilium-lb-example.yaml

关注公众号: Knative,了解更多 Serverless 、Knative,云原生相关资讯

关注公众号,回复 "进群",即可进群与众多云原生 Serverless 技术大佬探讨技术,探讨人生。

你可能感兴趣的:(【Cilium 1.10 重磅发布!】支持 Wireguard, BGP, Egress IP 网关, XDP 负载均衡, 阿里云集成)