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

 

作者: 清弦

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


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


【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的流量。[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 1.10 重磅发布!】支持 Wireguard, BGP, Egress IP 网关, XDP 负载均衡, 阿里云集成

例下面策略,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"

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 暴露到集群外部。

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

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

阿里云集成

主要贡献: Bokang Li (Alibaba)

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

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

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

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

Wireguard 透明加密

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

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

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

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

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

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

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

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

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 

上一篇:JS - 基础学习(1): 数组(列表)的基本操作


下一篇:实战:一文说清OpenShift的Egress Router:OpenShift安全系列第八篇