当前位置: 首页 > news >正文

云计算时代携程的网络架构变迁

大家觉得有意义和帮助记得及时关注和点赞!!!


  • 前言
  • 0 携程云平台简介
    • 网络演进时间线
  • 1 基于 VLAN 的二层网络
    • 1.1 需求
    • 1.2 解决方案:OpenStack Provider Network 模型
    • 1.3 硬件网络拓扑
    • 1.4 宿主机内部网络拓扑
    • 1.5 小结
      • 优点
      • 缺点
  • 2 基于 SDN 的大二层网络
    • 2.1 面临的新问题
    • 2.2 解决方案: OpenStack + SDN
      • 硬件拓扑
      • SDN: 控制平面和数据平面
      • SDN: 组件和实现
    • 2.3 软件+硬件网络拓扑
    • 2.4 创建实例涉及的网络配置流程
    • 2.5 小结
      • 硬件
      • 软件
      • 多租户
  • 3 容器和混合云网络
    • 3.1 私有云的 K8S 网络方案
      • 3.1.1 网络需求
      • 3.1.2 解决方案:扩展现有 SDN 方案,接入 Mesos/K8S
        • Neutron 改动
        • K8S CNI for Neutron 插件
        • 基础网络服务升级
      • 3.1.3 容器漂移
      • 3.1.4 小结
      • 3.1.5 进一步演进方向
    • 3.2 公有云上的 K8S
      • 3.2.1 需求
      • 3.2.2 AWS 上的 K8S 网络方案
      • 3.2.3 全球 VPC 拓扑
  • 4 Cloud Native 方案探索
    • 4.1 Cilium Overview
    • 4.2 宿主机内部网络通信(Host Networking)
    • 4.3 跨宿主机网络通信(Multi-Host Networking)
    • 4.4 优劣势比较(Pros & Cons)
      • Pros
      • Cons
  • References

本文介绍云计算时代以来携程在私有云和公有云上的几代网络解决方案。希望这些内容可以 给业内同行,尤其是那些设计和维护同等规模网络的团队提供一些参考。

本文将首先简单介绍携程的云平台,然后依次介绍我们经历过的几代网络模型:从传统的基 于 VLAN 的二层网络,到基于 SDN 的大二层网络,再到容器和混合云场景下的网络,最后是 cloud native 时代的一些探索。

0 携程云平台简介

携程 Cloud 团队成立于 2013 年左右,最初是基于 OpenStack 做私有云,后来又开发了自 己的 baremetal(BM)系统,集成到 OpenStack,最近几年又陆续落地了 Mesos 和 K8S 平 台,并接入了公有云。目前,我们已经将所有 cloud 服务打造成一个 CDOS — 携程数据中心操作系统的混合云平台,统一管理我们在私有云和公有云上的计算、网络 、存储资源。

Fig 1. Ctrip Datacenter Operation System (CDOS)

在私有云上,我们有虚拟机、应用物理机和容器。在公有云上,接入了亚马逊、腾讯云、 UCloud 等供应商,给应用部门提供虚拟机和容器。所有这些资源都通过 CDOS API 统一管 理。

网络演进时间线

Fig 2. Timeline of the Network Architecture Evolution

图 2 我们网络架构演进的大致时间线。

最开始做 OpenStack 时采用的是简单的 VLAN 二层网络,硬件网络基于传统的三层网络模 型。

随着网络规模的扩大,这种架构的不足逐渐显现出来。因此,在 2016 年自研了基于 SDN 的大二层网络来解决面临的问题,其中硬件架构换成了 Spine-Leaf。

2017 年,我们开始在私有云和公有云上落地容器平台。在私有云上,对 SDN 方案进行了扩 展和优化,接入了 Mesos 和 K8S 平台,单套网络方案同时管理了虚拟机、应用物理机和容 器网络。公有云上也设计了自己的网络方案,打通了混合云。

最后是 2019 年,针对 Cloud Native 时代面临的一些新挑战,我们在调研一些新方案。

1 基于 VLAN 的二层网络

2013 年我们开始基于 OpenStack 做私有云,给公司的业务部门提供虚拟机和应用物理机资 源。

1.1 需求

网络方面的需求有:

首先,性能不能太差,衡量指标包括 instance-to-instance 延迟、吞吐量等等。

第二,二层要有必要的隔离,防止二层网络的一些常见问题,例如广播泛洪。

第三,实例的 IP 要可路由,这点比较重要。这也决定了在宿主机内部不能使用隧道 技术。

第四,安全的优先级可以稍微放低一点。如果可以通过牺牲一点安全性带来比较大的性能提 升,在当时也是可以接受的。而且在私有云上,还是有其他方式可以弥补安全性的不足。

1.2 解决方案:OpenStack Provider Network 模型

经过一些调研,我们最后选择了 OpenStack provider network 模型 [1]。

Fig 3. OpenStack Provider Network Model

如图 3 所示。宿主机内部走二层软交换,可以是 OVS、Linux Bridge、或者特定厂商的方案 ;宿主机外面,二层走交换,三层走路由,没有 overlay 封装。

这种方案有如下特点:

首先,租户网络的网关要配置在硬件设备上,因此需要硬件网络的配合,而并不是一个纯软 件的方案;

第二,实例的 IP 是可路由的,不需要走隧道;

第三,和纯软件的方案相比,性能更好,因为不需要隧道的封装和解封装,而且跨网段的路 由都是由硬件交换机完成的。

方案的一些其他方面:

  1. 二层使用 VLAN 做隔离
  2. ML2 选用 OVS,相应的 L2 agent 就是 neutron ovs agent
  3. 因为网关在硬件交换机上,所以我们不需要 L3 agent(OpenStack 软件实现的虚拟路由器)来做路由转发
  4. 不用 DHCP
  5. 没有 floating ip 的需求
  6. 出于性能考虑,我们去掉了 security group

1.3 硬件网络拓扑

图 4 是我们的物理网络拓扑,最下面是服务器机柜,上面的网络是典型的接入-汇聚-核 心三层架构。

Fig 4. Physical Network Topology in the Datacenter

特点:

  1. 每个服务器两个物理网卡,直连到两个置顶交换机做物理高可用
  2. 汇聚层和接入层走二层交换,和核心层走三层路由
  3. 所有 OpenStack 网关配置在核心层路由器
  4. 防火墙和核心路由器直连,做一些安全策略

1.4 宿主机内部网络拓扑

再来看宿主机内部的网络拓扑。图 5 是一个计算节点内部的拓扑。

Fig 5. Designed Virtual Network Topology within A Compute Node

特点:

  1. 首先,在宿主机内有两个 OVS bridge:br-int 和 br-bond,两个 bridge 直连
  2. 有两个物理网卡,通过 OVS 做 bond。宿主机的 IP 配置在 br-bond 上作为管理 IP
  3. 所有实例连接到 br-int

图中的两个实例属于不同网段,这些标数字的(虚拟和物理)设备连接起来,就是两个跨 网段的实例之间通信的路径:inst1 出来的包经 br-int 到达 br-bond,再经物理 网卡出宿主机,然后到达交换机,最后到达路由器(网关);路由转发之后,包再经类似路 径回到 inst2,总共是 18 跳。

作为对比,图 6 是原生的 OpenStack provider network 模型。

Fig 6. Virtual Network Topology within A Compute Node in Legacy OpenStack

这里最大的区别就是每个实例和 br-int 之间都多出一个 Linux bridge。这是因为原生的 OpenStack 支持通过 security group 对实例做安全策略,而 security group 底层是基于 iptables 的。OVS port 不支持 iptables 规则,而 Linux bridge port 支持,因此 OpenStack 在每个实例和 OVS 之间都插入了一个 Linux Bridge。在这种情况下,inst1 -> inst2 总共是 24 跳,比刚才多出 6 跳。

1.5 小结

最后总结一下我们第一代网络方案。

优点

首先,我们去掉了一些不用的 OpenStack 组件,例如 L3 agent、HDCP agent, Neutron meta agent 等等,简化了系统架构。对于一个刚开始做 OpenStack、经验还不是很丰 富的团队来说,开发和运维成本比较低。

第二,上面已经看到,我们去掉了 Linux Bridge,简化了宿主机内部的网络拓扑,这使得 转发路径更短,实例的网络延迟更低。

第三,网关在硬件设备上,和 OpenStack 的纯软件方案相比,性能更好。

第四,实例的 IP 可路由,给跟踪、监控等外围系统带来很大便利。

缺点

首先,去掉了 security group,没有了主机防火墙的功能,因此安全性变弱。我们通 过硬件防火墙部分地补偿了这一问题。

第二,网络资源交付过程还没有完全自动化,并且存在较大的运维风险。 provider network 模型要求网关配置在硬件设备上,在我们的方案中就是核心路由 器上。因此,每次在 OpenStack 里创建或删除网络时,都需要手动去核心交换机上做配置 。虽然说这种操作频率还是很低的,但操作核心路由器风险很大,核心发生故障会影响整张 网络。

2 基于 SDN 的大二层网络

以上就是我们在云计算时代的第一代网络方案,设计上比较简单直接,相应地,功能也比较 少。随着网络规模的扩大和近几年我们内部微服务化的推进,这套方案遇到了一些问题。

2.1 面临的新问题

首先来自硬件。做数据中心网络的同学比较清楚,三层网络架构的可扩展性比较差, 而且我们所有的 OpenStack 网关都配置在核心上,使得核心成为潜在的性能瓶颈,而核心 挂了会影响整张网络。

第二,很大的 VLAN 网络内部的泛洪,以及 VLAN 最多只有 4096 个的限制。

第三,宿主机网卡比较旧,都是 1Gbps,也很容易达到瓶颈。

另外我们也有一些新的需求:

首先,携程在这期间收购了一些公司,会有将这些收购来的公司的网络与携程的网络打通的 需求。在网络层面,我们想把它们当作租户对待,因此有多租户和 VPC 的需求。

另外,我们想让网络配置和网络资源交付更加自动化,减少运维成本与运维风险。

2.2 解决方案: OpenStack + SDN

针对以上问题和需求,数据中心网络团队和我们 cloud 网络团队一起设计了第二代网络方 案:一套基于软件+硬件、OpenStack+SDN 的方案,从二层网络演进到大二层网络。

硬件拓扑

在硬件拓扑上,从传统三层网络模型换成了近几年比较流行的 Spine-Leaf 架构,如图 7 所示。

Fig 7. Spine-Leaf Topology in the New Datacenter

Spine-Leaf 是 full-mesh 连接,它可以带来如下几个好处:

第一,转发路径更短。以图 7 的 Spine-Leaf(两级 Clos 架构)为例,任何两台服务器经 过三跳(Leaf1 -> Spine -> Leaf2)就可以到达,延迟更低,并且可保障(可以按跳数精 确计算出来)。

第二,水平可扩展性更好,任何一层有带宽或性能瓶颈,只需新加一台设备,然后跟另一层 的所有设备直连。

第三,所有设备都是 active 的,一个设备挂掉之后,影响面比三层模型里挂掉一个设备小 得多。

宿主机方面,我们升级到了 10G 和 25G 的网卡。

SDN: 控制平面和数据平面

数据平面基于 VxLAN,控制平面基于 MP-BGP EVPN 协议,在设备之间同步控制平面信息。 网关是分布式的,每个 leaf 节点都是网关。VxLAN 和 MP-BGP EVPN 都是 RFC 标准协议, 更多信息参考 [2]。

VxLAN 的封装和解封装都在 leaf 完成,leaf 以下是 VLAN 网络,以上是 VxLAN 网络。

另外,这套方案在物理上支持真正的租户隔离。

SDN: 组件和实现

开发集中在以下几个方面。

首先是自研了一个 SDN 控制器,称作携程网络控制器(Ctrip Network Controller) ,缩写 CNC。CNC 是一个集中式控制器,管理网络内所有 spine 和 leaf 节点,通过 neutron plugin 与 OpenStack Neutron 集成,能够动态向交换机下发配置。

Neutron 的主要改造:

  1. 添加了 ML2 和 L3 两个 plugin 与 CNC 集成
  2. 设计了新的 port 状态机,因为原来的 port 只对 underlay 进行了建模,我们现在有 underlay 和 overlay 两个平面
  3. 添加了一下新的 API,用于和 CNC 交互
  4. 扩展了一些表结构等等

图 8 就是我们对 neutron port 状态的一个监控。如果一个 IP(port)不通,我们很容易 从它的状态看出问题是出在 underlay 还是 overlay。

Fig 8. Monitoring Panel for Neutron Port States

2.3 软件+硬件网络拓扑

Fig 9. HW + SW Topology of the Designed SDN Solution

图 9 是我们软件+硬件的网络拓扑:

  1. 以 leaf 为边界,leaf 以下是 underlay,走 VLAN;上面 overlay,走 VxLAN
  2. underlay 由 neutron、OVS 和 neutron OVS agent 控制;overlay 是 CNC 控制
  3. Neutron 和 CNC 之间通过 plugin 集成

2.4 创建实例涉及的网络配置流程

这里简单来看一下创建一个实例后,它的网络是怎么通的。图 10 中黑色的线是 OpenStack 原有的逻辑,蓝色的是我们新加的。

Fig 10. Flow of Spawn An Instance

  1. 控制节点:从 nova 发起一个创建实例请求,指定从哪个网络分配 IP 给这个实例。 nova 调度器将任务调度到某台计算节点
  2. 计算节点:nova compute 开始创建实例,其中一步是向 neutron 发起一个 create port 请求,简单认为就是申请一个 IP 地址
  3. Neutron Server: neutron 创建一个 port,然后经 create port 的 postcommit 方法 到达 CNC ML2 plugin;plugin 进一步将 port 信息同步给 CNC,CNC 将其存储到自己 的 DB
  4. 计算节点:port 信息从 neutron server 返回给 nova-compute
  5. 计算节点:nova-compute 拿到 port 信息,为实例创建虚拟网卡,配置 IP 地址等参数 ,并将其 attach 到 OVS
  6. 计算节点:ovs agent 检测到新的 device 后,就会为这个 device 配置 OVS,添加 flow 等,这时候 underlay 就通了,它会将 underlay 状态上报给 neutron server
  7. 计算节点:nova-compute 做完网络配置后,会发送一个 update port 消息给 neutron server,其中带着 host_id 信息,表示这个 port 现在在哪台计算节点上
  8. Neutron Server: 请求会通过 postcommit 发给 CNC
  9. CNC:CNC 根据 host_id 找到这台计算节点所连接的 leaf 的端口,然后向这些端口 动态下发配置,这时候 overlay 就通了,最后将 overlay 状态上报给 neutron server

在我们的系统里看,这时 port 就是一个 ACTIVE_ACTIVE 的状态,表示 underlay 和 overlay 配置都是正常的,网络应该是通的。

2.5 小结

总结一下我们这套方案。

硬件

首先,我们从三层网络架构演进到 Spine-Leaf 两级架构。Spine-Leaf 的 full-mesh 使得 服务器之间延迟更低、容错性更好、更易水平扩展。另外,Spine-Leaf 还支持分布式网 关,缓解了集中式网关的性能瓶颈和单点问题。

软件

自研 SDN 控制器并与 OpenStack 集成,实现了网络的动态配置。

这套方案同时支持虚拟机和应用物理机部署系统,限于篇幅这里只介绍了虚拟机。

多租户

有硬多租户(hard-multitenancy)支持能力。

3 容器和混合云网络

以上方案最开始还是针对虚拟机和应用物理机设计的。到了 2017 年,我们开始在私有云和 公有云上落地容器平台,将一部分应用从虚拟机或应用物理机迁移到容器。

容器平台(K8S、Mesos 等)有不同于虚拟机平台的一些特点,例如:

  1. 实例的规模很大,单个集群 10k~100k 个容器是很常见的
  2. 很高的发布频率,实例会频繁地创建和销毁
  3. 实例创建和销毁时间很短,比传统的虚拟机低至少一个数量级
  4. 容器的失败是很常见,总会因为各种各样的原因导致容器挂掉。容器编排引擎在设计的 时候已经把失败当做预期情况处理,例如将挂掉的容器在本机或其他宿主机再拉起来, 后者就是一次漂移

3.1 私有云的 K8S 网络方案

容器平台的这些特点对网络提出了新的需求。

3.1.1 网络需求

首先,网络服务的 API 必须要快,而且支持较大的并发。

第二,不管是 agent 还是可执行文件,为容器创建和删除网络(虚拟网络及相应配置)也要快。

最后是一个工程问题:新系统要想快速落地,就必须与很多线上系统保持前向兼容。这 给我们网络提出一个需求就是:容器漂移时,IP 要保持不变。因为 OpenStack 时代, 虚拟机迁移 IP 是不变的,所以很多外围系统都认为 IP 是实例生命周期中的一个不变量, 如果我们突然要改成 IP 可变,就会涉及大量的外围系统(例如 SOA)改造,这其中很多不 是我们所能控制的。因此为了实现容器的快速落地,就必须考虑这个需求。而流行的 K8S 网络方案都是无法支持这个功能的,因为在容器平台的设计哲学里,IP 地址已经是一个被 弱化的概念,用户更应该关心的是实例暴露的服务,而不是 IP

3.1.2 解决方案:扩展现有 SDN 方案,接入 Mesos/K8S

在私有云中,我们最终决定对现有的为虚拟机和应用物理机设计的 SDN 方案进行扩展,将 容器网络也统一由 Neutron/CNC 管理。具体来说,会复用已有的网络基础设施,包括 Neutron、CNC、OVS、Neutron-OVS-Agent 等待,然后开发一个针对 Neutron 的 CNI 插件 (对于 K8S)。

一些核心改动或优化如下。

Neutron 改动

首先是增加了一些新的 API。比如,原来的 neutron 是按 network id 分配 IP,我们给 network 添加了 label 属性,相同 label 的 network 我们认为是无差别的。这样,CNI 申 请 IP 的时候,只需要说“我需要一个 ‘prod-env’ 网段的 IP”,neutron 就会从打了“ prod-env” label 的 network 中任选一个还没用完的,从中分一个 IP。这样既将外部系统 与 OpenStack 细节解耦,又提高了可扩展性,因为一个 label 可以对应任意多个 network 。

另外做了一些性能优化,例如增加批量分配 IP 接口、API 异步化、数据库操作优化等待。

还有就是 backport 一些新 feature 到 neutron,我们的 OpenStack 已经不随社区一起升 级了,都是按需 backport。例如,其中一个对运维和 trouble shooting 非常友好的功能 是 Graceful OVS agent restart。

K8S CNI for Neutron 插件

开发了一个 CNI plugin 对接 neutron。CNI 插件的功能比较常规:

  1. 为容器创建 veth pairt,并 attach 到 OVS
  2. 为容器配置 MAC、IP、路由等信息

但有两个特殊之处:

  1. 向 neutron(global IPAM)申请分配和释放 IP,而不是宿主机的本地服务分配(local IPAM)
  2. 将 port 信息更新到 neutron server
基础网络服务升级

另外进行了一些基础架构的升级,比如 OVS 在过去几年的使用过程中发现老版本的几个 bug,后来发现这几个问题在社区也是有记录的:

  1. vswitchd CPU 100% [3]
  2. 流量镜像丢包 [4]

注意到最新的 LTS 版本已经解决了这些问题,因此我们将 OVS 升级到了最新的 LTS。 大家如果有遇到类似问题,可以参考 [3, 4]。

3.1.3 容器漂移

创建一个容器后,容器网络配置的流程和图 10 类似,Nova 和 K8S 只需做如下的组件对应:

  • nova -> kube master
  • nova-compute -> kubelet
  • nova network driver -> CNI

其流程不再详细介绍。这里重点介绍一下容器漂移时 IP 是如何保持不变的。

如图 11 所示,保持 IP 不变的关键是:CNI 插件能够根据容器的 labels 推导出 port name,然后拿 name 去 neutron 里获取 port 详细信息。port name 是唯一的,这个是我 们改过的,原生的 OpenStack 并不唯一。

第二个宿主机的 CNI plugin 会根据 name 找到 port 信息,配置完成后,会将新的 host_id 更新到 netron server;neutron 通知到 CNC,CNC 去原来的交换机上删除配置 ,并向新的交换机下发配置。

Fig 11. Pod drifting with the same IP within a K8S cluster

3.1.4 小结

简单总结一下:

  1. 在保持基础设施不变的情况下,我们快速地将容器平台的网络接入到已有系统
  2. 一个 IPAM 同时管理了虚拟机、应用物理机和容器的网络

目前这套新方案的部署规模:

  1. 4 个可用区
  2. 最大的可用区有超过 500 个节点(VM/BM/Container 宿主机),其中主要是 K8S 节点
  3. 单个 K8S 节点最多会有 500+ pod(测试环境的超分比较高)
  4. 最大的可用区有 2+ 万个实例,其中主要是容器实例

3.1.5 进一步演进方向

以上就是到目前为止我们私有云上的网络方案演讲,下面这张图是我们希望将来能达到的一 个架构。

Fig 12. Layered view of the future network architecture

首先会有 underlay 和 overlay 两个平面。underlay 部署各种基础设施,包括 Openstack 控制器、计算节点、SDN 控制器等,以及各种需要运行在 underlay 的物理设备; 在 overlay 创建 VPC,在 VPC 里部署虚拟机、应用物理机实例等。

在 VPC 内创建 K8S 集群,单个 K8S 集群只会属于一个 VPC,所有跨 K8S 集群的访问都走 服务接口,例如 Ingress,现在我们还没有做到这一步,因为涉及到很多老环境的软件和硬 件改造。

3.2 公有云上的 K8S

接下来看一下我们在公有云上的网络。

3.2.1 需求

随着携程国际化战略的开展,我们需要具备在海外部署应用的能力。自建数据中心肯定是来 不及的,因此我们选择在公有云上购买虚拟机或 baremetal 机器,并搭建和维护自己的 K8S 集群(非厂商托管方案,例如 AWS EKS [10])。 在外层,我们通过 CDOS API 封装不同厂商的差异,给应用部门提供统一的接口。这样,我 们的私有云演进到了混合云的阶段。

网络方面主要涉及两方面工作:一是 K8S 的网络方案,这个可能会因厂商而已,因为不同 厂商提供的网络模型和功能可能不同;二是打通私有云和公有云。

3.2.2 AWS 上的 K8S 网络方案

以 AWS 为例来看下我们在公有云上的 K8S 网络方案。

Fig 13. K8S network solution on public cloud vendor (AWS)

首先,起 EC2 实例作为 K8S node,我们自己开发一个 CNI 插件,动态向 EC2 插拔 ENI, 并把 ENI 作为网卡给容器使用。这一部分借鉴了 Lyft 和 Netflix 在 AWS 上经验 [5, 6]。

在 VPC 内,有一个全局的 IPAM,管理整个 K8S 集群的网络资源,角色和私有云中的 neutron 类似。它会调用 AWS API 实现网络资源的申请、释放和管理。

另外,我们的 CNI 还支持 attach/detach floating IP 到容器。还有就是和私有云一样, 容器漂移的时候 IP 保持不变。

3.2.3 全球 VPC 拓扑

图 14 是我们现在在全球的 VPC 分布示意图。

在上海和南通有我们的私有云 VPC;在海外,例如首尔、莫斯科、法兰克福、加州(美 西)、香港、墨尔本等地方有公有云上的 VPC,这里画的不全,实际不止这几个 region。

Fig 14. VPCs distributed over the globe

这些 VPC 使用的网段是经过规划的,目前不会跟内网网段重合。因此通过专线打通后,IP 可以做到可路由。

4 Cloud Native 方案探索

以上就是我们在私有云和混合云场景下的网络方案演进。目前的方案可以支持 业务未来一段的发展,但也有一些新的挑战。

首先,中心式的 IPAM 逐渐成为性能瓶颈。做过 OpenStack 的同学应该很清楚,neutron 不 是为性能设计的,而是为发布频率很低、性能要求不高的虚拟机设计的。没有优化过的话, 一次 neutron API 调用百毫秒级是很正常的,高负载的时候更慢。另外,中心式的 IPAM 也不符合容器网络的设计哲学。Cloud native 方案都倾向于 local IPAM(去中心化),即 每个 node 上有一个 IPAM,自己管理本节点的网络资源分配,calico、flannel 等流行的 网络方案都是这样的。

第二,现在我们的 IP 在整张网络都是可漂移的,因此故障范围特别大。

第三,容器的高部署密度会给大二层网络的交换机表项带来压力,这里面有一些大二层设计 本身以及硬件的限制。

另外,近年来安全受到越来越高度重视,我们有越来越强的 3-7 层主机防火墙需求。目前 基于 OVS 的方案与主流的 K8S 方案差异很大,导致 Service 等很多 K8S 原生功能用不了。

针对以上问题和需求,我们进行了一些新方案的调研,包括 Calico,Cilium 等等。Calico 大家应该已经比较熟悉了,这里介绍下 Cilium。

4.1 Cilium Overview

Cilium [7]是近两年新出现的网络方案,它使用了很多内核新技术,因此对内核版本要求比 较高,需要 4.8 以上支持。

Cilium 的核心功能依赖 BPF/eBPF,这是内核里的一个沙盒虚拟机。应用程序可以通过 BPF 动态的向内核注入程序来完成很多高级功能,例如系统调用跟踪、性能分析、网络拦截 等等。Cilium 基于 BPF 做网络的连通和安全,提供 3-7 层的安策略。

Cilium 组件:

  1. CLI
  2. 存储安全策略的 repository,一般是 etcd
  3. 与编排引擎集成的插件:提供了 plugin 与主流的编排系统(K8S、Mesos 等)集成
  4. Agent,运行在每台宿主机,其中集成了 Local IPAM 功能

Fig 15. Cilium

4.2 宿主机内部网络通信(Host Networking)

每个网络方案都需要解决两个主要问题:

  1. 宿主机内部的通信:实例之间,实例和宿主机通信
  2. 宿主机之间的通信:跨宿主机的实例之间的通信

先来看 Cilium 宿主机内部的网络通信。

Fig 16. Cilium host-networking

Agent 首先会创建一个 cilium_host <---> cilium_net 的 veth pair,然后将它管理的 CIDR 的第一个 IP 作为网关,配置在 cilium_host 上。对于每个容器,CNI 插件 会承担创建 veth pair、配置 IP、生成 BPF 规则 等工作。

同宿主机内部的容器之间的连通性靠内核协议栈二层转发和 BPF 程序。比如 inst1 到 isnt2,包首先从 eth0 经协议栈到达 lxc11,中间再经过 BPF 规则到达 lxc22, 然后再经协议栈转发到达 inst2 的 eth0

以传统的网络观念来看,lxc11 到 lxc22 这一跳非常怪,因为没有既没有 OVS 或 Linux bridge 这样的二层转发设备,也没有 iptables 规则或者 ARP 表项,包就神奇的到 达了另一个地方,并且 MAC 地址还被修改了。

类似地,容器和宿主机的通信走宿主机内部的三层路由和 BPF 转发,其中 BPF 程序连接容 器的 veth pair 和它的网关设备,因为容器和宿主机是两个网段。

4.3 跨宿主机网络通信(Multi-Host Networking)

跨宿主机的通信和主流的方案一样,支持两种常见方式:

  • VxLAN 隧道
  • BGP 直接路由

如果使用 VxLAN 方式,Cilium 会创建一个名为 cilium_vxlan 的 device 作为 VTEP, 负责封装和解封装。这种方案需要评估软件 VxLAN 的性能能否接受,以及是否需要 offload 到硬件加速。一般来说,软件 VxLAN 的方式性能较差,而且实例 IP 不可路由。

BGP 方案性能更好,而且 IP 可路由,但需要底层网络支持。这种方案需要在每个 node 上起一个 BGP agent 来和外部网络交换路由,涉及 BGP agent 的选型、AS(自治系 统)的设计等额外工作。如果是内网,一般就是 BGP agent 与硬件网络做 peering;如果 是在 AWS 之类的公有云上,还可以调用厂商提供的 BGP API。

4.4 优劣势比较(Pros & Cons)

最后总结一下 Cilium 方案的优劣势。

Pros

首先,原生支持 K8S L4-L7 安全策略,例如在 yaml 指定期望的安全效果,Cilium 会自动 将其转化为 BPF 规则。

第二,高性能策略下发(控制平面)。Calico/iptables 最大的问题之一就是集群规模大了 之后,新策略生效非常慢。iptables 是链式设计,复杂度是 O(n);而 Cilium 的复杂度 是 O(1) [11],因此性能非常好。

第三,高性能数据平面 (veth pair, IPVLAN)。

第四,原生支持双栈 (IPv4/IPv6)。事实上 Cilium 最开始只支持 IPv6,后面才添加了对 IPv4 的支持,因为他们一开始就是作为下一代技术为超大规模集群设计的。

第五,支持运行在 flannel 之上:flannel 负责网络连通性,Cilium 负责安全策略。如果 你的集群现在是 flannel 模式,迁移到 Cilium 会比较方便。

最后,非常活跃的社区。Cilium 背后是一家公司在支持,一部分核心开发者来自内核社区 ,而且同时也是 eBPF 的开发者。

Cons

首先是内核版本要求比较高,至少 4.8+,最好 4.14+,相信很多公司的内核版本是没有 这么高的。

第二,方案比较新,还没有哪家比较有名或有说服力的大厂在较大规模的生产环境部署了这 种方案,因此不知道里面有没有大坑。

第三,如果要对代码有把控(稍大规模的公司应该都有这种要求),而不仅仅是做一个用户 ,那对内核有一定的要求,例如要熟悉协议栈、包的收发路径、内核协议栈数据结构、 不错的 C 语言功底(BPF 程序是 C 写的)等等,开发和运维成本比基于 iptables 的方案 (例如 Calico)要高。

总体来说,Cilium/eBPF 是近几年出现的最令人激动的项目之一,而且还在快速发展之中。 我推荐大家有机会都上手玩一玩,发现其中的乐趣。

相关文章:

云计算时代携程的网络架构变迁

大家觉得有意义和帮助记得及时关注和点赞!!! 前言0 携程云平台简介 网络演进时间线1 基于 VLAN 的二层网络 1.1 需求1.2 解决方案&#xff1a;OpenStack Provider Network 模型1.3 硬件网络拓扑1.4 宿主机内部网络拓扑1.5 小结 优点缺点2 基于 SDN 的大二层网络 2.1 面临的新问…...

uniapp 微信小程序 数据空白展示组件

效果图 html <template><view class"nodata"><view class""><image class"nodataimg":src"$publicfun.locaAndHttp()?localUrl:$publicfun.httpUrlImg(httUrl)"mode"aspectFit"></image>&l…...

java 线程池为什么设计成先进队列再创建最大线程为何先入队列再增加线程数?

java 线程池为什么设计成先进队列再创建最大线程为何先入队列再增加线程数&#xff1f; 这个设计与 线程池的性能优化 、资源利用和任务调度策略密切相关。要理解为什么线程池设计成“ 先将任务入队列&#xff0c;再创建最大线程数 ”&#xff0c;可以从以下几个方面进行分析&…...

我的Qt作品(20)使用Qt+OpenCV写一个旋转/抠图/mask生成工具

使用QtOpenCV写一个旋转/抠图/mask生成工具 1、旋转功能 void FormRotate::rotateImage(const cv::Mat &src, cv::Mat &dst, double degree) //旋转 {if (fabs(degree) < 0.001){dst src;return;}//center旋转的中心点坐标//degree旋转的角度,不是弧度,>0逆时针…...

【vue】vite + ts +vue3 安装及使用 pinia

vue3 TS 安装使用pinia状态管理_vue3 ts pinia-CSDN博客 Vue项目进阶&#xff1a;再谈Pinia函数式&#xff08;composition API&#xff09;用法-腾讯云开发者社区-腾讯云...

计算机网络 (10)网络层

前言 计算机网络中的网络层&#xff08;Network Layer&#xff09;是OSI&#xff08;开放系统互连&#xff09;模型中的第三层&#xff0c;也是TCP/IP模型中的第二层&#xff0c;它位于数据链路层和传输层之间。网络层的主要任务是负责数据包从源主机到目的主机的路径选择和数据…...

1085 PAT单位排行

每次 PAT 考试结束后&#xff0c;考试中心都会发布一个考生单位排行榜。本题就请你实现这个功能。 输入格式&#xff1a; 输入第一行给出一个正整数 N&#xff08;≤105&#xff09;&#xff0c;即考生人数。随后 N 行&#xff0c;每行按下列格式给出一个考生的信息&#xff…...

知识库1: 什么是知识库?

知识库&#xff08;Knowledge Base, KB&#xff09;是一个存储和组织知识的信息系统或数据集合&#xff0c;用于保存、管理和访问结构化或非结构化的信息。它的目的是帮助人们快速获取所需的知识、解答问题或支持决策。知识库可以被广泛应用于技术支持、教育、研究以及智能系统…...

[SAP ABAP] 程序备份

备份当前程序到本地的方式如下&#xff1a; 1.复制粘贴 Ctrl A 、Ctrl V 2.【实用程序】|【更多实用程序】|【上载/下载】|【下载】 ​ 3.快捷键&#xff0c;支持多种格式导出(.abap .html .pdf 等) 在事务码SE38(ABAP编辑器)屏幕右下角&#xff0c;点击【Options选项】图…...

SpringBoot 自动装配原理及源码解析

目录 一、引言 二、什么是 Spring Boot 的自动装配 三、自动装配的核心注解解析 3.1 SpringBootApplication 注解 &#xff08;1&#xff09;SpringBootConfiguration&#xff1a; &#xff08;2&#xff09;EnableAutoConfiguration&#xff1a; &#xff08;3&#xf…...

【专题】2024年悦己生活消费洞察报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p38654 在当今时代背景下&#xff0c;社会发展日新月异&#xff0c;人们的生活方式与消费观念正经历深刻变革。MoonFox 月狐数据的《2024 年悦己生活消费洞察报告》聚焦于这一充满活力与变化的消费领域。随着就业、婚姻等社会压力的…...

empire靶机

打开靶机 我们先查看页面源代码&#xff0c;发现什么也没有 再去用nmap扫描 nmap -sV -p- 192.168.95.144 发现也没什么用 我们在用dirb扫一下 dirb http://192.168.95.144 我们发现了robots.txt并且响应码是200&#xff0c;去访问一下 又得到了一个目录&#xff0c;去访问…...

uniapp 判断多选、选中取消选中的逻辑处理

一、效果展示 二、代码 1.父组件: :id=“this.id” : 给子组件传递参数【id】 @callParentMethod=“takeIndexFun” :给子组件传递方法,这样可以在子组件直接调用父组件的方法 <view @click="$refs.member.open()"...

arthas查看拼接好参数的sql, redis, es完整可直接执行的命令

arthas查看拼接好参数的sql, redis, es完整可直接执行的命令 arthas查看sql可执行命令arthas查看redis可执行命令arthas查看es可执行命令相关链接 经常修bug的时候, 拿不到能够执行的命令, 真是太难受了 arthas查看sql可执行命令 # mybatis plus (参数和sql分离了) watch org.…...

Flamingo:少样本多模态大模型

Flamingo&#xff1a;少样本多模态大模型 论文大纲理解1. 确认目标2. 分析过程&#xff08;目标-手段分析&#xff09;3. 实现步骤4. 效果展示5. 金手指 解法拆解全流程核心模式提问Flamingo为什么选择使用"固定数量的64个视觉tokens"这个特定数字?这个数字的选择背…...

nacos-gateway动态路由

在Nacos官网中给出了手动监听Nacos配置变更的SDK&#xff1a; Nacos Java SDK 所需依赖 <!--统一配置管理--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <…...

Kotlin 协程基础知识总结二 —— 启动与取消

协程启动与取消的主要内容&#xff1a; 启动协程&#xff1a;启动构建器、启动模式、作用域构建器、Job 生命周期取消协程&#xff1a;协程的取消、CPU 密集型任务取消、协程取消的副作用、超时任务 1、协程构建器 &#xff08;P20&#xff09;launch 与 aysnc 两种协程构建…...

【漏洞复现】Struts2(CVE-2024-53677)任意文件上传逻辑绕过漏洞

文章目录 前言一、漏洞描述二、漏洞详情三、影响版本四、危害描述五、漏洞分析六、漏洞复现七、修复建议前言 Struts2框架是一个用于开发Java EE网络应用程序的开放源代码网页应用程序架构。它利用并延伸了Java Servlet API,鼓励开发者采用MVC架构。Struts2以WebWork优秀的设…...

使用 IDE生成 Java Doc

使用步骤 Android Studio界面->Tools->Generate JavaDoc zh-CN -encoding UTF-8 -charset UTF-8 -classpath “C:\Users\fangjian\AppData\Local\Android\Sdk\platforms\android-34\android.jar” 报错问题 错误: 目标 17 不允许选项 --boot-class-path 如果你正在使用…...

AWS、Google Cloud Platform (GCP)、Microsoft Azure、Linode和 桔子数据 的 价格对比

要对比 AWS、Google Cloud Platform (GCP)、Microsoft Azure、Linode 和 桔子数据 的 价格&#xff0c;我们需要先了解每个平台的定价模型、服务类型以及不同服务之间的价格差异。以下是根据各个平台常见服务&#xff08;如计算实例、存储、数据传输等&#xff09;做的一个 简化…...

【C++篇】AVL树的实现

前言 本篇是基于二叉搜索树写的&#xff0c;详情可以去看上篇【二叉搜索树】 一&#xff0c;AVL树的概念 &#xff08;1&#xff09;&#xff0c;AVL树是一颗二叉搜索树&#xff0c;它是一棵空树或者是具备以下性质的二叉搜索树&#xff1a;它的左右子树都是AVL树&#xff…...

VIVO Android面试题及参考答案

请重写算法题:求数组的全排列。 思路: 要获取一个数组的全排列,我们可以利用回溯算法。具体来说,回溯算法通过递归的方式逐步生成排列,在每一步都将一个元素加入排列中,然后在下一步递归中排除已选元素,回溯的时候撤销选择,尝试其他可能。 步骤: 递归生成排列: 使…...

联邦大模型微调

微调&#xff08;Fine-tuning&#xff09;是一种迁移学习的技术&#xff0c;用于在一个已经预训练好的模型基础上&#xff0c;通过进一步训练来适应特定的任务或数据集。微调可以在具有相似特征的任务之间共享知识&#xff0c;从而加快训练速度并提高模型性能。 微调步骤&…...

DigitalOcean Kubernetes现已支持VPC natvie集群

DigitalOcean Kubernetes (DOKS)的VPC natvie集群功能现已正式上线&#xff01;这一新功能实现了DOKS集群与虚拟私有云&#xff08;VPC&#xff09;资源之间的无缝集成&#xff0c;提升了工作负载的网络灵活性和可扩展性。 什么是VPC natvie 集群&#xff1f; VPC natvie 集群支…...

【每日学点鸿蒙知识】H5与C++通讯、动态参数化配置、ArkTS调用JS、Json对象转换、showToast在多次调用问题

1、HarmonyOS h5页面和C如何进行双向通讯&#xff1f; 前的规格是H5只能和ArkTS通讯&#xff0c;ArkTS通过NDK接口与C通讯&#xff0c;只有网络拦截有C接口。参考链接&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/_web-V5 2、HarmonyO…...

ZC706开发板教程:使用SD卡启动工具烧写flash

在使用开发板的过程中&#xff0c;常常需要通过 Flash 模式启动。然而&#xff0c;使用 JTAG 模式在线烧写 flash 的过程既繁琐又耗时&#xff0c;许多用户对此表示困扰。本期将为您提供解决方案&#xff0c;以简化这一流程。 我们分析正常的flash烧写过程&#xff0c;就是通过…...

问题-01

Mybatis比较失效问题 1、问题复现 whetherPromoterNull是字符串类型&#xff0c;0使用单引号包裹&#xff0c;进行比较时发现不起作用 <if test"whetherPromoterNull ! null and whetherPromoterNull.trim() 0"> and sui.share_user_id is not null</if&g…...

内容营销专家刘鑫炜:误区四,目标不明,营销如同“盲头苍蝇”?

我们经常会遇到这样的客户&#xff0c;稿件提交过来后&#xff0c;一会儿说要发这个媒体&#xff0c;不一会儿又要发那个媒体&#xff0c;而且这两个媒体根本没有关联性&#xff0c;这时候&#xff0c;我们都会问客户&#xff0c;你推广这篇稿件的目的是什么&#xff0c;是为了…...

java基础1:处理Map

一、适用场景&#xff1a;相对Map排序&#xff0c;想获取其中最大或最小值。 1、获取map集合里&#xff0c;获取 max(value)对应的key 1)、方式1 Testpublic void MapInnerMaxValue() {HashMap<String, Integer> hashMap new HashMap<>();hashMap.put("a&q…...

企业销售人员培训系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…...

设计模式-责任链模式

一、简介 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;用于将请求的发送者与接收者解耦&#xff0c;使多个处理对象都有机会处理该请求。这些处理对象通过形成一条链式结构依次处理请求&#xff0c;直到某个对象能够完…...

04、Spring MVC

Spring MVC是Spring的Web模块,用来开发Web应用的,它最终作为B/S、C/S模式下的Server端 Web应用的核心就是处理HTTP请求并响应。 一、关于两种开发模式说明 我们使用Spring MVC有两个开发模式 前后分离(数据与页面分离) @ResponseBody@RestController其涉及的生要机制是:…...

K8S 黑魔法之如何从 Pod 拿到节点的命令行

搞 K8S 运维的时候&#xff0c;偶尔会遇到一个难题&#xff0c;定位到问题出在某个节点上&#xff0c;而由于权限审批&#xff0c;错误配置等等各种原因&#xff0c;没有办法拿到节点的 SSH 权限&#xff0c;无法进入节点命令行进一步排障。 这个时候&#xff0c;就可以用这个…...

谷歌用Anthropic的Claude帮Gemini“打磨”性能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

React性能优化:构建更高效的应用

在现代前端开发中,React已经成为构建复杂、交互频繁应用的首选框架。然而,随着应用规模的扩大和功能的丰富,组件的频繁重渲染可能会成为性能瓶颈,影响用户体验。为了提升React应用的性能,开发者需要掌握一系列性能优化技巧和工具。本文将详细介绍React性能优化的各个方面,…...

Linux从0到1——线程同步和互斥【互斥量/条件变量/信号量/PC模型】

Linux从0到1——线程同步和互斥 1. Linux线程互斥1.1 问题引入1.2 互斥相关概念1.3 多执行流并发访问公共资源的数据不一致问题1.4 互斥量&#xff08;锁&#xff09;1.5 改进抢票系统1.6 锁的简单封装1.7 锁的实现原理1.8 可重入VS线程安全1.9 死锁 2. Linux线程同步2.1 理解同…...

无人机驾驶证对入伍有帮助吗?

无人机驾驶证对入伍确实有一定的帮助&#xff0c;主要体现在以下几个方面&#xff1a; 一、提升专业技能 无人机操作是一项高度专业化的技能&#xff0c;需要掌握飞行原理、航电系统、任务规划、紧急处理等多方面的知识。通过考取无人机驾驶证&#xff0c;个人可以系统地学习这…...

【贪心算法】贪心算法七

贪心算法七 1.整数替换2.俄罗斯套娃信封问题3.可被三整除的最大和4.距离相等的条形码5.重构字符串 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f…...

MySQL 锁概述

1.锁的分类 根据不同的分类角度可将锁分为&#xff1a; 按是否共享分&#xff1a;S 锁、X 锁按粒度分&#xff1a;表级锁、行级锁、全局锁&#xff08;锁整个库&#xff09;、页锁&#xff08;锁数据页&#xff09;意向锁&#xff1a;意向 S 锁、意向 X 锁&#xff1a;都是表…...

springboot502基于WEB的牙科诊所管理系统(论文+源码)_kaic

牙科诊所管理系统的设计与实现 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定牙科诊所管理系统的…...

overleaf中出现TeX capacity exceeded PDF object stream buffer=5000000的原因和解决方案

在插入pdf 配图后&#xff0c;编译出错提示信息如图&#xff0c;很可能的一个原因是pdf文件大小太大了&#xff0c;最好压缩一下&#xff0c;压缩到1MB以内。...

LabVIEW神经肌肉电刺激与记录系统

神经肌肉电刺激技术在康复医学和神经科学领域占有重要地位。基于LabVIEW开发了神经肌肉电刺激与记录系统&#xff0c;该系统具备可控电脉冲输出与高效数据采集功能&#xff0c;适用于临床和科研领域。 项目背景 神经肌肉电刺激技术用于治疗各类神经和肌肉系统疾病&#xff0c;…...

【CSS in Depth 2 精译_096】16.4:CSS 中的三维变换 + 16.5:本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…...

Label-Studio X SAM 半自动化标注

教程&#xff1a;playground/label_anything/readme_zh.md at main open-mmlab/playground GitHub B站视频&#xff1a;Label Studio x Segment Anything Model 半自动化标注_哔哩哔哩_bilibili 需要注意&#xff1a; 1.LINUX上跑比较方便 2.中文路径、文件名闯大祸 3. 4…...

Mono里运行C#脚本8—mono_image_storage_open打开EXE文件

Mono里运行C#脚本8—mono_image_storage_open打开EXE文件 前面分析哈希表的实现,以及文件打开的底层函数,还有保存到HASH表里的数据结构。 static MonoImageStorage * mono_image_storage_open (const char *fname) { char *key = NULL; key = mono_path_resolve_symlinks…...

【WebSocket】tomcat内部处理websocket的过程

websocket请求格式 浏览器请求 GET /webfin/websocket/ HTTP/1.1。 Host: localhost。 Upgrade: websocket。 Connection: Upgrade。 Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg。 Origin: http://服务器地址。 Sec-WebSocket-Version: 13。 服务器响应 HTTP/1.1 101 Swi…...

将一个组件的propName属性与父组件中的variable变量进行双向绑定的vue3(组件传值)

封装组件看这个&#xff0c;然后理解父子组件传值 应用场景&#xff1a; 1.使用v - model语法实现双向绑定&#xff08;传值两边都不用定义方法接数据&#xff09; 1.子组件 1. update:modelValue事件是MultiSelect组件对象自带的事件 2.:options"countries" opti…...

Linux下通用型shellcode的编写

实验目的及要求 目的&#xff1a; 通过对本实验执行过程的理解&#xff0c;认真分析总结&#xff0c;能够独立的在 Linux 下进行 shellcode 的编写。 要求&#xff1a; &#xff08;1&#xff09;%70&#xff1a;完成对 shellcode 的分析及提取 &#xff08;2&#xff09;%…...

STM32F103RCT6学习之二:GPIO开发

GPIO基础 1.简介 2.GPIO基本结构 3.种模式 GPIO基本功能 1.输出功能--LED灯闪烁 1)进行基本配置 2)编辑代码 主要在main.c中编辑。 int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration------------------------------------------------…...

kong网关使用pre-function插件,改写接口的返回数据

一、背景 kong作为api网关&#xff0c;除了反向代理后端服务外&#xff0c;还可对接口进行预处理。 比如本文提及的一个小功能&#xff0c;根据http header某个字段的值&#xff0c;等于多少的时候&#xff0c;返回一个固定的报文。 使用到的kong插件是pre-function。 除了上…...