浅谈VPC (转)
来源于知乎:https://zhuanlan.zhihu.com/p/33658624
VPC全称是Virtual Private Cloud,翻译成中文是虚拟私有云。但是在有些场合也被翻译成私有网络或者专有网络等。这里其实就有些让人迷惑,VPC究竟是指云还是网络?答案是,VPC即是一种云,也是一种网络模式,不过应该从服务和技术的角度分别来看。
虚拟私有云
首先从服务的角度来看,VPC指的是一种云(Cloud),这与它的字面意思相符。对于基础架构服务(IaaS),云就是指资源池。你或许听过公有云(Public Cloud),私有云(Private Cloud),混合云(Hybrid Cloud)。不过,VPC不属于这三种云中任一种。这是一种运行在公有云上,将一部分公有云资源为某个用户隔离出来,给这个用户私有使用的资源的集合。VPC是这么一种云,它由公有云管理,运行在公共资源上,但是保证每个用户之间的资源是隔离,用户在使用的时候不受其他用户的影响,感觉像是在使用自己的私有云一样。
从这种意义上看,VPC不是网络,我们可以对比VPC和它一个字面上相近的概念:VPN(Virtual Private Network)。VPN在公共的网络资源上虚拟隔离出一个个用户网络,例如IPsec VPN可以是在互联网上构建连接用户私有网络的隧道,MPLS VPN更是直接在运营商的PE设备上划分隔离的VRF给不同的用户。从提供服务的角度来,说如果VPC指的只是网络的话,那它跟VPN的概念是重复的。所以,从公有云所提供的服务来说,VPC应该理解成,向用户提供的隔离资源的集合。
VPC最早是由AWS在2009年提出[1],不过VPC的一些组成元素在其提出之前就已经存在。VPC只是将这些元素以私有云的视角重新包装了一下。在VPC之后,云主机只能使用VPC内部的对应的元素。从这个角度看,VPC更像是公有云服务商以打包的形式提供服务。
用户可以在公有云上创建一个或者多个VPC,每个部门一个VPC。对于需要连通的部门创建VPC连接。
同时,用户也可以通过VPN将自己内部的数据中心与公有云上的VPC连接,构成混合云。
不论哪种用例,VPC都以更加直观形象让用户来设计如何在公有云上存放自己的数据。
VPC硬件租用模式
—
VPC硬件租用模式(Hardware Tenancy)本身也是公有云提供的一种服务模式。VPC的硬件租用模式有两种,一种是共享(shared),一种是专属(dedicated)。共享是指VPC中的虚拟机运行在共享的硬件资源上,不同VPC中的虚拟机通过VPC进行隔离。专属是指VPC中的虚拟机运行在专属的硬件资源上,不同VPC中的虚拟机在物理上就是隔离的,同时VPC帮助实现网络上的隔离。专属模式相当于用户直接向公有云服务商租用物理主机。专属模式适合那些对于数据安全比较敏感的用户,不过这些物理主机还是由公有云服务商管理。
不论是共享模式还是专属模式,VPC都运行在公有云资源上,由公有云服务商管理。
专有网络
从技术角度来看,VPC是用户专属的一个二层网络。
经典网络 VS VPC
—
AWS的网络产品,在VPC之前称为EC2-Classic。去年的一个热点文章《关于阿里云的经典网络问题》说的就是这两种网络模式:Classic和VPC。他们之间最核心的区别是:经典网络提供的是多用户共享的网络,而VPC提供的是用户专属的网络。
这里的网络就是指二层网络,经典网络模型本身有很多问题,其中最大的问题就是安全问题。除非加了特定的防火墙规则去拦截,二层网络内的所有设备默认是可以通信的。这就好比大家都挤在一个房间里,彼此的隐私很难保障一样。稍有不慎,云主机就可能被同网络的其他用户恶意攻击。而VPC能够为每个用户一个专属独立的二层网络。这样相当于给每个用户分了个房间,用户的隐私更容易得到保障。就算有恶意攻击,一般也要走到网关或者VPN设备,在这些集中的设备上,网络流量更可控。
由于每个用户都有专属的二层网络,那说明VPC模式下的可用二层网络的数量是远超经典模式的。虽然各家都没有公布自己的实现细节,但是这里有点类似VXLAN和VLAN的关系。VXLAN可以有1600万个二层网络,VLAN只有4000多个二层网络。公有云与私有云的区别在于用户数量巨大。如果采用VLAN,每个用户一个二层网络,那最多只能带4000多个用户,公有云许多用户还是只有1-2个云主机那种,那必然不能满足公有云的需求,所以在早期的经典网络模式下,不得不让多个用户挤在一个网络里面。而如果采用VXLAN之类的技术,则可以保证在一个region里面为1600万个用户每人分到一个二层网络。
因为VPC是一个用户专属的网络,用户可以任意定义VPC内云主机的IP地址。二层隔离了,IP地址想怎么玩就怎么玩。而在经典网络模式下,大家挤在一个二层网络里面,IP地址首先要保证不要重合,这对用户和服务商来说都不是一件心情愉快的事情。
VPC的网络Overlay
—
从AWS公布的资料[2] 看,VPC的数据封装与VXLAN这类网络Overlay技术也很像。从下图可以看出,桔色的VPC中,10.0.0.2发往10.0.0.3的网络数据,最终被封装成主机之间的通信报文。
原始的二层帧,被VPC标签封装,之后封装在另一个IP报文里面。这与VXLAN的封装方式可以说是一模一样。不过需要澄清的是,AWS在2010年就已经开始应用VPC,而VXLAN标准是2014年[3]才终稿。AWS的VPC或许和VXLAN不一样,但是按照VXLAN理解VPC的overlay会更容易些。
VPC使用网络Overlay之后,可以构建一个L3之上的L2。这样一个VPC内的虚机,可以任意的在数据中心分布。实际中云主机肯定不是任意分布的,会有一些主机的调度优化算法,但是至少,网络不会成为限制云主机部署的因素。举个反例,如果使用VLAN,虚机必须部署在支持相应VLAN的设备上,哪怕这个设备已经接近饱和,而其他的设备却是空置的。如下图,因为左边的机架不支持相应的网络,对应的云主机只能往右边的机架塞,直到塞满。而同时,左边的机架负载还不到50%。
Overlay使得VPC不再受网络硬件的限制,VPC内的云主机可以部署在整个机房。
VPC与SDN
—
AWS在2017年提出,VPC是构建在软件(代码)之上,VPC就是SDN[4]。我们前面说过,VPC是一个二层网络,是一个构建在L3之上的L2 Overlay网络。这里说VPC就是SDN,实际上是指,VPC受SDN所控制。AWS的VPC依靠一个叫Mapping Service的组件工作。当虚机之间要通信的时候,请求先发到Mapping Service,再由它找到目的虚机对应的信息(例如目的虚机所在的主机IP地址),Mapping Service用对应的信息,封装成Overlay数据(类似于封装成VXLAN数据),再进行传输。
如果是一个三层通信,传统上是要发到网关,由网关转发到目的虚机。而对于AWS的VPC,Mapping Service同样也会完成三层通信的信息查找,数据封装。这样连路由器都省了。
这里的Mapping Service,与SDN控制器的作用可以说是一样的。SDN控制器掌握了所有的网络信息,当需要进行二层,三层通信时,SDN控制器会根据网络数据包下发OpenFlow流表,使得虚机之间直接通信。
如果说Mapping Service是SDN控制器,那么更具体点,它还是一个分布式SDN控制器,因为每个主机上都有一个Mapping Service的缓存。通过这种分布式,可以实现高速运算处理。
VPC相关的网络资源
—
VPC虽然指的是专有网络,但是跟网络配套的资源有很多,这些网络资源都是以VPC为单位来划分。也就是说,定义在一个VPC内的网络资源,只能被这个VPC内的虚机所使用。这在前面讲服务的时候提到过。这些资源[5]可以概括如下:
Security Group, Subnet, Network ACL, Routing Table, Router,这些都是老生常谈了。以VPC为单位来划分这些资源,可以更好的突出私有的感觉。但是实际上这些资源大多是虚拟的,每个用户占有一份也不会增加公有云运营商的成本。
需要注意的是,VPC尽管是一个二层网络,但是AWS仍然是通过路由器连接一个VPC下的两个Subnet。
VPC Edge device
—
前面讲服务的时候说过,VPC从服务的角度来看是虚拟私有云,表示的公有云运营商提供给用户的隔离资源的集合。它相当于是漂浮在公有云上的孤岛。真正让VPC变得强大的是它各式各样的连接技术。AWS提供了一个Edge设备(Blackfoot Edge Device),VPC通过这个Edge设备可以:
- 与别的VPC相连
- 与互联网相连
- 与用户的私有云建立VPN连接。
- 与AWS的其他服务建立连接。
这才是公有云服务商在构建VPC网络时,真正的竞争力所在。有了这样的Edge设备,VPC不再是孤岛,而是有了连接其他陆地的桥梁。这里的Edge设备,可以看成是VNF,AWS需要用户在VPC内部手动配置路由来引流到这个Edge设备。
最后
不论是对用户还是公有云服务商,VPC都是一个更好的选择。对于用户来说,首先可以任意定义VPC内的IP地址。其次VPC像是一个容器,装载着所有的云主机,同时又与其他的VPC隔离。第三,用户还可以用各种连接服务(VPN,NAT等)将VPC与现有的网络连接起来。这样对用户来说,既保证了网络隔离,又能提供按需的网络连通。对公有云服务商来说,VPC实际上就是SDN在公有云的应用。软件可控,Overlay使得服务商的硬件利用率提高,对硬件厂商的依赖程度降低。在这个基础上,公有云服务商还能够提供更好的网络服务。
参考
[1] https://aws.amazon.com/blogs/aws/introducing-amazon-virtual-private-cloud-vpc/
[2] https://www.youtube.com/watch?v=Zd5hsL-JNY4
[3] https://tools.ietf.org/html/rfc7348
[4] https://www.youtube.com/watch?v=8gc2DgBqo9U
浅谈VPC (转)的更多相关文章
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
- 浅谈angular2+ionic2
浅谈angular2+ionic2 前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别. 1. 项目所用:angular2+ionic2 ...
- iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- Linux特殊符号浅谈
Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...
- 浅谈Angular的 $q, defer, promise
浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00 博客园-原创精华区 原文 http://www.cnblogs.com/big-snow/ ...
随机推荐
- Missing Data in Kernel PCA
目录 引 主要内容 关于缺失数据的导数 附录 极大似然估计 代码 Sanguinetti G, Lawrence N D. Missing data in kernel PCA[J]. europea ...
- nginx -g "daemon off;" 你学废了吗?
去年的时候写了一篇原创<前后端分离,如何在前端项目中动态插入后端API基地址?(in docker)>, 我自认为这篇生产实践是对大前端. 容器化.CI/CD的得意之作. 对于前后端分离的 ...
- 新手入门typeScript
强类型与弱类型(类型安全) 强类型不允许随意的隐士类型转换,而弱类型是允许的 变量类型允许随时改变的特点,不是强弱类型的差异 静态类型与动态类型(类型检查) 静态类型:一个变量声明时它的类型就是明确的 ...
- Shell自动上传下载文件到SFTP服务器
1.说明 本文提供一个Shell脚本, 可以自动连接到SFTP服务器, 然后上传或者下载指定的文件, 进而可以使用Linux的corntab命令, 定时执行脚本上传下载文件, 实现文件的同步或者备份功 ...
- Appium安装部署
一.安装JDK 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html JD ...
- Mysql字符串字段判断是否包含某个字符串的方法
方法一:like SELECT * FROM 表名 WHERE 字段名 like "%字符%"; 方法二:find_in_set() 利用mysql 字符串函数 find_in_s ...
- java 多态 总结
1.前言 引用教科书解释: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 通俗来说: 总结:多态的抽象类与接口有点相似: 父类不需要具体实现方 ...
- SQL高级优化系列
目录 SQL高级优化系列(一)之MySQL优化 SQL高级优化系列(二)之MySQL架构 SQL高级优化系列(三)之存储引擎 SQL高级优化系列(四)之SQL优化 SQL高级优化系列(五)之执行计划 ...
- 日志收集系统系列(五)之LogTransfer
从kafka里面把日志取出来,写入ES,使用Kibana做可视化展示 1. ElasticSearch 1.1 介绍 Elasticsearch(ES)是一个基于Lucene构建的开源.分布式.RES ...
- hal 编码器做用户输入时捕获初值的设置
uint16_t encoderDirection = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3); uint16_t encoderValue = __HA ...