前言

在 腾讯云TKE - 基于 Cilium 统一混合云容器网络(上) 中,我们介绍 TKE 混合云的跨平面网络互通方案和 TKE 混合云 Overlay 网络方案。公有云 TKE 集群添加第三方 IDC 节点服务中,为了应对客户不同使用场景的需求(特别是对于网络性能损耗的低容忍度要求),TKE 混合云网络方案同时提出了基于 BGP 直接路由的 Underlay 网络方案。该网络模型采用 GoBGP 实现,基于 Cilium 打通了 Node-Pod 以及 Pod-Pod 之间网络,能够保证较高的网络性能,并且支持大规模集群扩展。

此网络方案在 TKE 公有云上线前,已经过 腾讯云专有云敏捷PaaS平台 TCNS 私有化环境的大规模实践,并在 腾讯云 TKEStack 中得到了集成和开源。本文将详细介绍 TKE 混合云基于 BGP 直接路由的 Underlay 容器网络方案的设计与实现。

背景介绍

客户需求的多样性,特别是对网络性能损耗的容忍程度决定了 Underlay 网络方案势在必行。为什么选择 BGP 协议呢? 相较于 OSPF、RIP 这些内部网关协议,BGP 着眼于控制路由的传播以及选择最佳路径。BGP 最大的优势在于具有较强的可扩展性,能够满足大规模集群横向扩展的需求。另一方面,BGP 足够简单稳定,并且业内也有着基于 BGP 落地生产环境的成功案例。

根据集群规模大小的不同,BGP 路由模式有着不同的方案。当集群规模较小时,可以使用 Full Mesh 互联模式,它要求同一个 AS 内的所有 BGP Speaker 全连接,并且所有外部路由信息必须重新分发到同一个 AS 的其他路由器。随着集群规模扩大,Full Mesh 模式效率将急剧降低,Route Reflection 模式是一种成熟的替代方案。RR 方案下允许一个 BGP Speaker (也即是 Route Reflector)向其他 BGP Peer 广播学习到的路由信息,大大减少了 BGP Peer 连接数量。

与已有方案相比,腾讯混合云采用基于 GoBGP 实现 Cilium 的 Underlay 方案,该方案基于 GoBGP 提供的良好的编程接口实现了自己的 BGP Agent,具备很好的可扩展性。其特点如下:

  • 支持大规模集群的扩展
  • 支持 BGP 邻居发现
  • 支持网络可视化
  • 支持 VIP 和 PodCIDR 路由宣告
  • 支持 ECMP 等高级路由协议
  • 实现 Cilium native-routing 功能
  • 支持 L3 层网络通信

腾讯混合云 Underlay 容器网络方案

在不改变 IDC 机房内部网络拓扑的情况下,接入层交换机和核心层交换机建立 BGP 连接,借助于机房内部已有的路由策略实现。针对 Node 所处的物理位置分配 PodCIDR,每个节点将 PodCIDR 通过 BGP 协议宣告给接入层交换机,实现全网通信的能力。

  1. 每个接入层交换机与其管理的 Node 二层联通,共同构成一个 AS。每个节点上跑 BGP 服务,用于宣告本节点路由信息。
  2. 核心层交换机和接入层交换机之间的每个路由器单独占用一个 AS,物理直连,跑 BGP 协议。核心层交换机可以感知到全网的路由信息,接入层交换机可以感知与自己直连的 Node 上的路由信息。
  3. 每个 Node 上只有一条默认路由,直接指向接入层交换机。同一个接入层交换机下的 Node 通信下一跳指向对端。

邻居发现

在 BGP 实现的集群网络中,经常存在节点新增和删除的情形,如果采用静态配置对等体的方式,需要频繁的操作交换机进行对等体增删的操作,维护工作量很大,不利于集群的横向扩展。为了避免手动对交换机进行操作,我们支持基于配置接入层交换机和软件层面实现的路由反射器这两种模式来动态发现 BGP 邻居。

通过接入层交换机实现动态邻居发现

接入层交换机充当边界路由器,并开启 Dynamic Neighbors 功能,H3C、Cisco以及华为的路由器具体开启 Dynamic Neighbors 配置请参考官方文档。Node上的 BGP 服务主动与接入层交换机建立 iBGP 连接,并宣告本地路由,接入层交换机将学习到的路由宣告给整个数据机房内部。

通过RR实现动态邻居发现

物理交换机或者 Node 节点充当反射路由器 RR,反射路由器与接入层交换机建立 iBGP 连接,Node 节点上的 BGP 服务与反射路由器建立连接。Node上的BGP服务将本地路由宣告给 RR,RR 反射到接入层交换机,接入层交换机接着宣告给整个数据机房内部。

下一跳

每个 Node 上跑 BGP 服务,将本节点的上的 PodCIDR 宣告给接入层交换机,每个接入层交换机可以感知到直连的所有 Node 上的 PodCIDR。接入层交换机下的 Node 之间相互学习路由下发到本地,流量经过接入层交换机二层转发。跨接入层交换机的节点之间通信下一跳指向接入层交换机,同一个接入层交换机下的节点之间通信下一跳指向对端节点。下图展示了同一个接入层交换机下以及跨接入层交换机下节点的路由学习情况,可以直观的根据路由表判定下一跳地址。

  • 同一个接入层交换机下通信链路:10.2.0.2节点与10.2.0.3节点处在同一个接入层交换机下,具备二层连通,报文经过封装后不经过三层转发直接被送到对端。

  • 不同接入层交换机之间通信链路:10.2.0.2节点与10.3.0.3节点处在不同的接入层交换机下,报文需要经过接入层交换机和核心交换机路由后才能到达对端。

BMP 监控

基于 BGP Monitoring Protocol 开发 BMP Server,用于对 BGP 会话的运行状态进行实时监控,包括对等体关系的建立与关闭、路由信息等。利用收集到的BMP Message直接定位故障。

优雅重启

BGP 是基于 TCP 实现的路由协议,TCP 连接异常断开后,开启 Graceful Restart 功能的交换机不会删除 RIB 和 FIB,仍然按照原有的转发表项转发报文,并启动 RIB 路由老化定时器。BGP Peer 需要两端同时开启 Graceful Restart 功能才能生效,Graceful Restart可以有效防止BGP链路震荡,提升底层网络的可用性。

自定义 IPAM

在 Kubernetes 常见配置中,会通过 kube-controller-manager 的 allocate-node-cidrsconfigure-cloud-routes 等参数来为节点分配 PodCIDR 并配置路由。然而,社区的这种方案限制了节点只能有一段 PodCIDR,并且不能动态扩充。这种一个节点一个 PodCIDR 的策略太简单,导致 IP 资源利用率太低,某些节点规格小可能用不完,某些节点规格大却不够。

在混合云场景下,我们发现客户对于 IPAM 提出了更高的要求:

  • 希望节点的 PodCIDR 可以是多段的
  • 希望节点的 PodCIDR 可以支持按需动态扩充和回收

为了解决这个问题,我们使用了自己的 tke-ipamd 组件来实现自定义的 IPAM 功能,原理如下图所示:

  • 不再由 kube-controller-manager 组件来分配节点 PodCIDR,而是由 tke-ipamd 组件统一给节点分配 PodCIDR
  • Cilium Agent 通过 CiliumNode 对象读取 tke-ipamd 分配的 PodCIDR,响应 CNI 请求给 Pod 分配 IP
  • tke-ipamd 通过 list-watch 机制监听节点 IP 资源使用情况,当节点 IP 资源使用率过高时动态扩充节点的 PodCIDR

性能测试

为了对 TKE 混合云 Underlay 容器网络的性能有更好的了解,我们使用 netperf 工具对其进行了性能测试,可以看到,Underlay 在网络吞吐和带宽上基本没有性能损耗。

总结与展望

在介绍了混合云场景下,TKE 基于 Cilium 的混合云容器网络的互联方案和 Overlay 网络方案后,本文重点介绍了基于 BGP 路由的 Underlay 网络方案。TKE 混合云 Underlay 容器网络方案利用了 BGP 的扩展性,能够满足大规模集群横向扩展的需求,同时也能在性能上相对于节点网络做到基本无损,为客户提供更高的数据面转发性能。此网络方案在 TKE 公有云上线前,已经过腾讯云专有云敏捷 PaaS 平台 TCNS 私有化环境的大规模实践,并在 腾讯云 TKEStack 中得到了集成和开源。

混合云与容器结合正在吸引越来越多企业客户的目光,其在资源扩容、多活备灾、业务分布式部署等场景可以提高企业现有计算资源利用率,给客户带来显著受益。腾讯云容器团队打通公有云与 IDC 环境差异,为客户提供统一管理视图,实现多云场景、IDC 场景以及边缘场景的统一。除了单集群能力的统一,腾讯云容器团队在集群注册、多集群管理、跨云跨集群互访等方面也有统一的方案,欢迎关注与体验。

参考资料

Using BIRD to run BGP

容器服务(Tencent Kubernetes Engine,TKE)是腾讯云提供的基于 Kubernetes,一站式云原生 PaaS 服务平台。为用户提供集成了容器集群调度、Helm 应用编排、Docker 镜像管理、Istio服务治理、自动化DevOps以及全套监控运维体系的企业级服务。

腾讯云TKE-基于 Cilium 统一混合云容器网络(下)的更多相关文章

  1. 基于VPN搭建混合云架构需要考虑的网络因素

     Joy Qiao from MSFT Wed, Jan 21 2015 8:44 AM 很多用户在搭建混合云架构时,会使用到微软Azure虚拟网络中的 VPN功能,来实现Azure中的虚拟网络与用户 ...

  2. 阿里云发布Apsara SA系列混合云存储阵列

    3月21日,2019北京阿里云峰会上,阿里云正式发布Apsara SA系列混合云存储阵列,融合IP SAN,FC SAN,NAS和OSS对象存储协议于一体,同时实现了本地数据中心架构和公共云存储的无缝 ...

  3. 腾讯云 TKE Everywhere 特性发布,用户可在自有基础设施中托管 K8s 服务

    作者 孔令飞,腾讯云资深工程师,拥有大规模 Kubernetes 集群.微服务的研发和架构经验,目前专注于云原生混合云领域的基础架构开发. 朱翔,腾讯云容器服务高级产品经理,目前负责云原生混合云产品方 ...

  4. 腾讯云容器服务 TKE 推出新一代零损耗容器网络

    随着容器技术的发展成熟,越来越多的组件迁移到容器,在技术迁移过程中,数据库,游戏,AI 这些组件对容器网络性能(时延,吞吐,稳定性)提出了更高的要求.为了得到更优的时延和吞吐表现,各大云厂商都在致力于 ...

  5. OpenStack 企业私有云的若干需求(4):混合云支持 (Hybrid Cloud Support)

    本系列会介绍OpenStack 企业私有云的几个需求: 自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合云( ...

  6. 上海仪电Azure Stack技术深入浅出系列1:谈Azure Stack在私有云/混合云生态中的定位

    2.2 Azure Stack Azure Stack到2017年7月才提供GA版本,但目前还是可以通过技术预览版了解该技术.Azure Stack本质上是核心Azure服务的一个私有实例. Micr ...

  7. 数据中心网络架构的问题与演进 — 混合云与 VPC 专有网络

    目录 文章目录 目录 前文列表 历史背景 混合云 Why hybrid cloud? 混合云市场 混合云的逻辑架构 混合云应用场景 灾难恢复 数据备份 负载扩容 应用部署 开发测试生产部署 混合云产品 ...

  8. TKE基于弹性网卡直连Pod的网络负载均衡

    前言 Kubernetes在集群接入层设计并提供了两种原生资源Service和Ingress,分别负责四层和七层的网络接入层配置. 传统的做法是创建Ingress或LoadBalancer类型的Ser ...

  9. IBM云的商务动作之我见(2):IBM 和 VMware 战略合作推进混合云

    本系列文章基于公开信息,对IBM云的近期商务动作比如收购.战略合作.整合等,给出本人的快速分析,仅仅代表本人个人观点,和本人所在的公司和所在的岗位没有任何关系: (1)IBM 收购 Blue Box ...

随机推荐

  1. Jmeter(四十五) - 从入门到精通高级篇 - Jmeter之网页爬虫-上篇(详解教程)

    1.简介 上大学的时候,第一次听同学说网页爬虫,当时比较幼稚和懵懂,觉得就是几只电子虫子爬在网页上在抓取东西.后来又听说写代码可以实现网页爬虫,宏哥感觉高大上,后来工作又听说,有的公司做爬虫被抓的新闻 ...

  2. Nifi:nifi内置处理器Processor的开发

    本篇主要是介绍自定义处理器的开发方式及Nifi处理器开发的一些细节 Nifi-Processor自定义开发的流程 之前说过,大部分的数据处理,我们可以基于ExcuseGroovyScript处理器,编 ...

  3. Linux 内存 占用较高问题排查

    Linux 内存 占用较高问题排查 niuhao307523005 2019-04-24 14:31:55 11087 收藏 11展开一 查看内存情况#按 k 查看 free #按兆M查看 free ...

  4. CentOS 7系统中的时间日期设置

    修改 CentOS 7系统中的时间日期设置 timedatectl set-ntp no timedatectl timedatectl set-time 2022-06-04 timedatectl ...

  5. ipmitool使用手册(20200401)

    ipmitool使用手册原创xinqidian_xiao 最后发布于2018-07-05 12:15:47 阅读数 17579 收藏展开一.查找安装包 查看ipmitool属于哪个安装包 #yum p ...

  6. 使用 dd 命令进行硬盘 I/O 性能检测

    使用 dd 命令进行硬盘 I/O 性能检测 作者: Vivek Gite 译者: LCTT DongShuaike | 2015-08-28 07:30   评论: 1 收藏: 6 如何使用dd命令测 ...

  7. flink-cdc读取postgres报异常,没有发布表

    异常信息 must be superuser to create FOR ALL TABLES publication 必须是超级用户才能为所有发布表创建 网上搜索了一天,都毫无头绪,后面搜索到了一个 ...

  8. JAVA并发(3)-ReentrantReadWriteLock的探索

    1. 介绍 本文我们继续探究使用AQS的子类ReentrantReadWriteLock(读写锁).老规矩,先贴一下类图 ReentrantReadWriteLock这个类包含读锁和写锁,这两种锁都存 ...

  9. golang快速入门(六)特有程序结构

    提示:本系列文章适合对Go有持续冲动的读者 阅前须知:在程序结构这章,更多会关注golang中特有结构,与其他语言如C.python中相似结构(命名.声明.赋值.作用域等)不再赘述. 一.golang ...

  10. Linux(CentOS7)下Nginx安装

    记录一下 Linux(CentOS7) 下 Nginx 安装过程 一.准备工作 版本说明: Linux版本:CentOS 7 64位 Nginx版本:nginx-1.20.0 1. 下载安装文件 采用 ...