写点什么

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

用户头像
Chumper
关注
发布于: 2021 年 05 月 26 日
Cilium 1.10 重磅发布!】支持 Wireguard, BGP, Egress IP 网关, XDP 负载均衡, 阿里云集成

作者: 清弦


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




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





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 的流量。



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


apiVersion: cilium.io/v2alpha1kind: CiliumEgressNATPolicymetadata:  name: egress-samplespec:  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][13]进行,利用了 service IP 和 BGP 的 L3 协议支持。 现在 Cilium 可为 LoadBalancer 的 service 分配 IP,并通过 BGP 向其 BGP 路由器通告它们。 现在无需其他组件就可以把 serivce 暴露到集群外部。



将来,我们计划也支持通过 BGP 发布 Pod CIDR 和出口 IP 网关。 这将进一步改善 Cloud Native 与传统环境之间的桥梁。以下是用于配置 Cilium 的 BGP 功能的 ConfigMap 示例。 配置的两个主要方面是对等方和地址池。 前者用于与网络中现有的 BGP 路由器连接,因此需要 IP 地址和 ASN。 后者是 Cilium 将为 LoadBalancer 服务分配 IP 的池。


apiVersion: v1kind: ConfigMapmetadata:  name: bgp-config  namespace: kube-systemdata:  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指南][14]

阿里云集成

主要贡献: Bokang Li (Alibaba)


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



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


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

Wireguard 透明加密

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



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



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


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



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-systemNAME                       ENDPOINT ID   IDENTITY ID   ENDPOINT STATE   IPV4            IPV6coredns-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 甚至可以在智能手机上运行!


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/2DaemonSet         cilium             Desired: 2, Ready: 2/2, Available: 2/2Containers:       cilium             Running: 2                  cilium-operator    Running: 2Image 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 正常工作的理想工具。


$ 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)
复制代码

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 的堆栈遍历,从而降低了每个数据包的堆栈处理成本。


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

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


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

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


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 的功能和架构,可见下图:



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。 对于即将发布的版本,我们计划将其扩展到其他封装机制。


n-Tuple PCAP Recorder

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



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 技术大佬探讨技术,探讨人生。



发布于: 2021 年 05 月 26 日阅读数: 51
用户头像

Chumper

关注

just do it 2018.09.25 加入

赵吉壮,曾就职于华为 Cloud BU,字节跳动 Data 团队,专注于 k8s knative, Go 云原生 个人主页 http://chumper.cn

评论

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