作者: 清弦
阿里云技术专家,主要负责ACK 容器网络设计与研发,阿里云开源CNI项目Terway 主要维护者,Cilium Alibaba IPAM 贡献者
本文翻译自
Cilium 1.10 发布文档[1]
由于译者水平有限,本文不免存在遗漏或错误之处。如有疑问,请查阅原文。 以下是译文。
- Egress IP Gateway
- BGP for LoadBalancer VIP
- 阿里云集成
- Wireguard 透明加密
- Cilium ARM64 镜像
- Cilium CLI
- Cilium网络性能改进
- XDP-based Standalone Load Balancer
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/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 暴露到集群外部。
将来,我们计划也支持通过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 为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-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