为啥Underlay才是容器网络的最佳落地选择
导语:
几年前,当博云启动自研容器网络研发的时候,除了技术选型的考虑,我们对于先做 Underlay 还是 Overlay 网络也有过深度的讨论。当时的开源社区以及主流容器厂商,多数还是以 Overlay 网络方案为主,但在我们对众多客户真正需求的深入了解之后,发现部分客户对容器内外网络直通有着非常强烈的需求。思虑再三,我们决定还是先做 Underlay 网络(后来又做了Overlay)。随着行业与公司自身的发展,我们建设实施的项目越来越多,这让我们对容器网络的思考也越来越深入,从而观点也越来越清晰:
内外直通的Underlay网络才是容器网络的正确打开方式。
01
从需求出发,考虑容器网络方案

如上图所示,这是目前企业微服务容器化部署的典型场景,也是驱动我们做 Underlay网络的直接原因:
服务部署在Kubernetes集群内部(如图:服务1、服务2);
数据库、注册中心、Redis、MQ等组件部署在集群之外;
部分服务也可能部署在集群之外, 比如容器平台试用阶段(如图:服务3)
这些服务和组件,需要能直接互联互通。
如若需要满足以上需求,最简单有效的方案就是直接把 Kubernetes 内外网络打通,也就是采用 Underlay 网络模式。
当然,如上需求也有别的办法可以解决。比如,细化分析服务和组件间的流量,采用ingress、egress,包括改写应用代码等方式,在特定情况下,这也是可以用的。然而,一方面,这些都是特定场景下的特定解决方案,缺乏一定的通用性;另一方面,容易出现配置复杂、引入额外风险、出错难以定位等问题。远远没有通过Underlay网络直接将内外网打通这么简单有效。
还有另外的办法就是将所有服务和组件都放入Kubernetes集群内部,但是这种方案仍是针对特定场景的非通用方案,很难保证企业所有的应用都在一个Kubernetes集群里。
同样,对于容器内外网络直接互联互通的需求场景还有:
特定用途的Kubernetes集群对外提供服务。比如专门用作提供PaaS中间件服务的Kubernetes集群、专门用作CI/CD服务的Kubernetes集群、专门用作提供大数据服务的Kubernetes集群等;
跨多集群的服务/组件互联互通;
为了在试点阶段降低风险,部分服务跑在集群内、部分服务跑在集群外等场景。
02
与虚拟机对比,从容器本质考虑容器网络方案
在容器的应用实践过程中,除了应用场景,我们也从底层基础设施的角度对容器进行了持续的思考。
从基础设施的角度看容器:容器和虚拟机的本质都是一样的,是上层应用的承载基础设施。
因此,从底层角度看,对容器网络的需求跟虚拟机是一致的。那么,虚拟机网络的落地模式是怎样的呢?

如上图右侧部分所示,IaaS层的落地网络方案可以认为是有行业标准的,不管是基于VMware 还是 OpenStack,基本都是采用OVS(或类似OVS)的二层 Underlay 网络方案。
因此,从基础设施的角度往上看,容器网络采用跟 IaaS 类似的方案,即将虚拟机和容器放到同一个网络层面上,是最合理的选择。
PS:在公有云上,虚拟机都在VPC里,因此目前公有云的容器网络方案,也是主要采用将容器和虚拟机放到同一个VPC中,可以直接互联互通的方案。这也是对上述判断的典型证明。
同时,对于部分客户反馈的 Unberlay 网络占用 IP 地址过多的问题,从虚拟机和容器的对比角度,也可以获得合理的解释:如果使用虚拟机部署,占用 IP 地址数量与容器 Underlay 网络是一样的。IP 地址的数量是由应用数量决定的,使用容器并没有引入多余 IP 地址占用。另外,Ipv6已经开始规模落地,在Ipv6时代,IP 地址数量将不会是问题。
03
技术方案选型
容器典型的开源 Unberlay 网络选型方案有 Calico 和 MACVLAN,这两个方案的问题也比较明显:
Calico:需要在数据中心路由器(或三层交换机)打开 BGP 路由协议,而 BGP 是广域网的路由协议,一般在数据中心内部不会启动,低端三层交换机/路由器对齐的支持情况也有风险。
MACVLAN:几年前有部分客户采用此容器网络方案,MACVLAN最大的问题就是社区活跃度已经很低,一些问题长期没有在社区中解决。同时,面向未来的扩展性也比较差。
以上也是博云基于 OVS 自研 Underlay(也支持Overlay)网络的原因。
04
总结
在容器网络方案中,Overlay网络方案有着对底层网络要求低(落地过程不需要跟网络部门打交道)、落地容易、IP地址占用少等特点,也有自己适用的特性需求场景。但是随着越来越多的客户将 Kubernetes 和容器大规模应用到生产环境中,博云客户中选择使用 Underlay 网络模式的比例也越来越高。这让我们更加明确认识到:
内外直通的Underlay网络才是容器网络的正确打开方式。
为啥Underlay才是容器网络的最佳落地选择的更多相关文章
- 【Networking】容器网络大观 && SDN 资料汇总
SDNLAB技术分享(十五):容器网络大观 SDNLAB君• 16-06-17 •2957 人围观 编者按:本文系SDNLAB技术分享系列,本次分享来自SDN撕X群(群主:大猫猫)群直播,我们希望 ...
- 容器网络——从CNI到Calico
从容器诞生开始,存储和网络这两个话题就一直为大家津津乐道.我们今天这个环境下讲网络这个问题,其实是因为容器对网络的需求,和传统物理.虚拟环境对网络环境需求是有差别的,主要面临以下两个问题: 过去Iaa ...
- 腾讯云TKE-基于 Cilium 统一混合云容器网络(下)
前言 在 腾讯云TKE - 基于 Cilium 统一混合云容器网络(上) 中,我们介绍 TKE 混合云的跨平面网络互通方案和 TKE 混合云 Overlay 网络方案.公有云 TKE 集群添加第三方 ...
- 第 8 章 容器网络 - 072 - 一文搞懂各种 Docker 网络
Docker 起初只提供了简单的 single-host 网络,显然这不利于 Docker 构建容器集群并通过 scale-out 方式横向扩展到多个主机上. 跨主机网络方案: Docker Over ...
- [svc]容器网络学习索引及网络监控
整理的可能有些误失,抽时间在细细的分类完善下. 发现这篇对于网络从低到高层协议整理的还不错 每层都有一些有意思的话题 一些协议有一些设计上的弱点, 所以产生了种种的网络层安全问题 一般我们学一些 1, ...
- Docker技术入门与实战 第二版-学习笔记-8-网络功能network-1-单个host上的容器网络
Docker 中的网络功能介绍 Docker 允许通过外部访问容器或容器互联的方式来提供网络服务 1) 外部访问容器 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -p或 -P参数 ...
- k8s pod的4种网络模式最佳实战(externalIPs )
[k8s]k8s pod的4种网络模式最佳实战(externalIPs ) hostPort相当于docker run -p 8081:8080,不用创建svc,因此端口只在容器运行的vm ...
- 初学Docker容器网络不得不看的学习笔记
一.关于Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...
- Docker 容器网络
默认网络 当安装docker时,它会自动创建3个网络.可以使用docker network ls 来查看. zane@zane-V:~$ docker network ls NETWORK ID ...
随机推荐
- 线程间配合:Condition、Semaphore、CountDownLatch、CyclicBarrier
1 重入锁的好搭档:Condition条件 如果大家理解了Object.wait()和Object.notify()方法的话,那么就能很容易理解Condition接口了.它和wait()和notify ...
- 马士兵老师Java虚拟机调优
该视频主要讲解的内容如下所示: 1.虚拟机的内存结构 1.每一个线程都有一个虚拟机栈,线程中每调用一个方法都会开启一个栈帧,栈帧里面保存方法中的局部变量. 2.方法区在java8以后改名为永久区域pe ...
- sharepoint 2010项目中,ashx页面获取SPContext.Current 为null的原因和解决方法
//错误的写法 public void ProcessRequest(HttpContext context) { SPSecurity.RunWithElevatedPrivileges(deleg ...
- 标记下 'net 查壳/脱壳/加壳' 工具
net查壳工具 DotNet Id v1.0.0.3 该net程序集被“MaxToCode”加壳了(也不能完全相信). 加壳工具就是列表中列出的了. de4Net.exe脱壳工具版本de4dot-v3 ...
- pl/sql案例
项目生命周期: 瀑布模型 拿到一个项目后,首先:分析需要用到的SQL语句: 其次:分析需要定义的变量初始值是多少,怎么得到最终值: 案例一: 统计每年入职的员工数量以及总数量: SQL语句:selec ...
- 硬刚 lodash 源码之路,compact & concat
前置 本篇随笔包含 _.compact 和 _.concat 及其依赖的工具函数. 你可能需要一些 JavaScript 基础知识才能看懂一些没有注释的细节. compact _.compact(ar ...
- Netty 源码解析(五): Netty 的线程池分析
今天是猿灯塔“365篇原创计划”第五篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源码解析(二): Netty 的 Channel Netty ...
- css中 出现height为100%失效的原因及解决方案
我们都知道需要给html和body标签设置了高度height:100%之后,再给内部的div设置height:100%的时候,内部div的高度100%才会起到作用.这是由于:%是一个相对父元素计算得来 ...
- html table表格斜线表头的实现方法总汇
在html中给table加一个斜线的表头有时是很有必要的,但是到底该怎么实现这种效果呢?总结了以下几种方法: 1.UI背景图实现 直接去找公司的UI,让她做一张图片,作为背景图片放到这里,然后撑满就可 ...
- Spring MVC原理简要概括
本篇简要讲解SpringMVC 的运作方式 Spring 的 web 框架是一个设计良好的 web MVC 框架.MVC模式导致应用程序的不同方面(输入逻辑,业务逻辑和UI逻辑)分离,同时提供这些元素 ...