当我们有了计算和存储资源,但是要真正把应用程序运行起来并提供互联网服务,那还需要使用AWS的网络,本章节就一起了解AWS的网络及其相关的组件基础知识和架构,其中包括:
AWS作为一家全球公有云提供商,它需要拥有全球基础设施网络,以支持全球客户的云服务。 AWS在全球多个区域建立数据中心,部署服务,如亚太的首尔,香港,欧洲的法兰克福,伦敦等。一方面提供就近的低延迟服务,另一方面可以满足当地的法律法规要求,比如对用户数据的存储。
可以独立提供云资源服务,并从地理位置上隔离的,称之为区域(Region)。目前AWS在美国,亚太,欧洲等地区拥有20多个Region。
同一个Region又包含多个可用区(AZ),AZ的本质就是物理数据中心,每个AZ使用单独的电源和网络设施,这使得AZ之间相互隔离,以便在单个AZ发生故障时最大限度地减少对其他AZ的影响。
同一个Region的AZ之间采用低延时的专线连接,可以用来实现数据在跨AZ之间的低延迟复制和高可用。需要注意的是,一个AZ可以包含多个数据中心组成。
其关系图如下:
作为公有云,其基础设备和资源在物理层面,对于其客户端来说都是共用的,但是这些客户肯定都希望自己的环境是独立和隔离的,VPC(Virtual Private Cloud )就是从逻辑层面,将客户的基础设施隔离开,让其所有资源运行在的一个私有网络空间,从用户的角度看,VPC就是自己独有的数据中心。如图所示
作为一个私有的网络空间,需要定义和选择 VPC 的地址空间(CIDR 范围),VPC是可以跨多个AZ,但是不能跨Region。
VPC申请完成后,就有了自己的专属"数据中心",接下就需要创建数据中心内部的"隔离区"即子网,比如经常说的“公网”和“私网”。每个子网可以设置自己的CIDR 范围,路由规则,流量转化规则等,如公网可以与外网通讯,私网只能在内网中通讯。如图所示:
该VPC中包含两个子网subnet1和subnet2,两个子网设置不同的路由表,对于subnet1,内部请求走本地连接(10.0.0.0/16:local),其他的流量走互联网网关(0.0.0.0/0:igw-id),所以subnet1是"公网";对于subnet2,无法路由到互联网出口,其流量只能封闭在VPC内部。这里有两个概念,路由表和互联网网关。
路由表,一组路由规则组成,确定将网络流量发送到何处。每个 VPC 内,都有一个默认的路由表,只允许流量在本地(VPC 内部)转发。如果要访问外网,就需要创建一个路由表,显式地指定该规则。
互联网网关,该网关连接到互联网,通过配置该网关路由,实现VPC内的资源与外网的通信。一般默认VPC的默认子网都会有互联网网关。
很多情况下,对于"私网"的实例也有连接互联网的需求,比如版本包的下载,AWS提供了NAT网关实现这一需求。如图所示:
subnet1公网中部署NAT网关,如图示的NAT-123,subnet2私网中的实例通过连接该网关,实现对互联网的访问。
NAT网关,位于公有子网的网关服务,负责接收从私有子网发往公网的数据包,转发至其目的地址;同时转发返回的数据包到源地址。
除了NAT网关外,还可以部署NAT实例,基于EC2实例安装AMI镜像,与NAT网关相比,NAT实例的高可用需要通过脚本实现故障转移,维护和弹性扩容需要自行操作;而NAT网关则是由AWS托管。
在实际的工程中,通过子网的设置划分不同的网络区,比如数据区,应用区等,每个网络区的访问安全要求不同,比如应用区,仅开放80,443端口,对于数据库,仅允许3306(MySQL)端口访问。这些访问规则,可以通过设置网络ACL来实现。
网络ACL,VPC 的一个可选安全层,可作为防火墙来控制进出子网的流量。
前几章节我们提到安全组,那这两者之间有哪些区别呢,我们看下两者的比较
对比项 | 安全组 | 网络ACL |
防护对象 | 云服务实例级别 | 子网级别 |
配置策略 | 仅支持配置允许策略 | 支持允许,拒绝策略 |
优先级 | 多个规则冲突,取其并集生成 | 多个规格冲突,优先级高的生效 |
报文组 | 报文三元组(协议,端口和对端地址) | 报文五元组(协议,源目端口,源目地址) |
当有多个VPC时,VPC之间需要进行连接和通信,这就需要建立VPC的对等连接。如图所示:
VPC建立对等连接后,两个VPC(可以跨AWS账号)中实例的通信就像在同一个网络中一样,流量一直处于AWS内部网络,不会经过Internet。
对于建立对等连接的VPC有以下的特点:
(1)VPC不能有重复的CIDR块,因为建立VPC对等连接后,就像同一个网络,如果有相同的ip,就会有ip冲突。
(2)VPC对等连接不支持传递(两个VPC之间是一对一的关系)。如图所示:
VPC A与VPC B,VPC B与VPC C建立对等连接,VPC A 无法通过VPC B来访问 VPC C。如果需要访问,需要再建立VPC A与VPC C之间的连接。
(3)对等连接是以采用路由的方式,需要手动添加路由。如下图所示:
AWS提供了大量的AWS 内置服务,比如S3,我们希望VPC内的实例对于S3这些服务的访问,走AWS的内部网络,而不是互联网, 此时就可以使用终端节点。
终端节点分为网关终端节点和接口终端节点,网关终端节点是一个网关,仅支持S3和DynamoDB流量 ,其他的为接口终端节点,。
我们以S3的网关终端节点为例。
子网1访问S3的存储桶,需要通过internet。创建S3的网关终端节点,并添加到子网2的路由表后,子网2就可以通过终端节点,走AWS内网实现对S3的访问。这种方式的优势是显而易见的,包括数据安全和低延迟。
终端节点还可以通过策略控制(JSON文档),实现对服务访问的限制,比如特定S3资源。主要注意的是,当EC2实例通过终端节点访问S3存储对象,那么其访问控制由IAM用户策略,EC2实例策略,终端节点策略,S3内置资源策略共同起作用。
接口终端节点,与网管终端节点类似,其实质是一个弹性网络接口。如图所示:
子网1即可以使用默认的DNS,通过互联网网关实现对Amazon Kinesis Data Streams的访问,也可以使用特定于终端节点的 DNS 主机名,通过接口终端节点,实现对对Amazon Kinesis Data Streams的访问。
前面介绍的终端节点,主要是针对AWS提供的内置服务,有些时候我们自有的应用程序也希望在多个VPC间提供服务。当然,可以采用前面讲的VPC对等连接方案,比如如下图
但是这个方案存在很多问题。
(1)由于对等连接无法传递,需要为每一个使用应用程序服务的VPC创建对等连接,并且维护路由表,如果有成千上万个对等连接,那么路由维护工作将是一场灾难。
(2)建立对等连接后,理论上所有VPC间网络是打通的,即EC2实例都可以相互访问,这样带来安全上的风险。
有没有可能,为我们自己的服务提供类似终端节点的访问方案呢,答案就是终端节点服务。
终端节点服务,创建自己的应用程序并将其配置由 Amazon PrivateLink 提供支持的服务,需要使用该服务的其他VPC,就可以通过接口终端节点,实现对该服务的访问。
如图所示:
VPC B中的实例是服务的提供方,为提供方服务创建服务终端节点(vpce-svc-1234),该节点关联一个指向实例的网络负载均衡(Network Load Balancer),
VPC A的实例是服务的使用方,该VPC创建一个接口终端节点(ENI),指向VPB的负载均衡。
因而,VPC A的实例,使用接口终端节点,通过AWS的私有网络,访问网络负载均衡,实现对VPC B的服务访问。
当VPC跨可用区以及跨区域连接,实现内部网络的访问,在物理层面是如何实现的呢?这就是今天要讲的Direct Connect,Direct Connect采用的是光纤直连,使用1Gbps、10Gbps 或 100Gbps专用管道连接到AWS区域。不仅适用于AWS VPC之间,也适用于客户自有的VPC与AWS VPC之间的连接。如图所示:
AWS端创建公有虚拟接口(对于公有服务),私有虚拟接口(对于VPC内私有资源),通过AWS Direct Connect实现同客户网络的出口路由或者防火墙与这些接口的连接。一般情况下,并不是真正拉一条光纤,而是租用网络提供商(比如电信,移动)的专用路由。
很显然,AWS Direct Connect对于传输安全,稳定性,低延迟,带宽等方面有着很大的优势,但是价格也是不菲的。有些时候,并不需要这么高的要求,比如通过客户私有机房访问AWS VPC,实现一些运维操作,就可以采用另一种方案,即VPN。
VPN与Direct Connect最大的不同,走的是互联网,延迟和稳定性都要逊于 Direct Connect,如图所示。
负载均衡对于后端的同学并不陌生,它一般用来实现流量的均衡,故障转移,安全控制,卸载证书等,常见的有硬件负载均衡F5,软件的有LVS,Nginx等。我们看下功能:
使用负载均衡,能很好的实现跨可用区间的流量均衡。
当AZ A的故障后,负载均衡其会自动调整到其他实例上。
负载均衡可以挂载安全组,配置允许通过的流量。
支持HTTPS/TLS传输,并卸载证书,转成HTTP发送到后端。
AWS有三种类型的负载均衡组件,分别为 Classic Load Balancer(CLB),Application Load Balancer(ALB),Network Load Balancer(NLB)。
ALB | NLB | CLB | |
支持的协议 | HTTP , HTTPS,WebSocket | TCP,UDP | HTTP(不包括http2),HTTPS,TCP |
路由规则 | 默认是轮询路由,可以配置按规则路由,如指定url路径路由 | 按照五元组和TCP序列号哈希后路由,连接有效期可保持路由到同一个目标 | TCP,轮询路由 HTTP,HTTPS,最少未完成请求路由算法 |
跨区域 | 默认启用状态 | 默认禁用状态 | 取决于使用方式,API,CLI默认禁止,console默认开启 |
需要注意的是,AWS推荐使用ALB和NLB,之前使用CLB的建议迁移到这两种类型。ELB与Auto Scaling,Certificate Manager,CloudWatch ,Route 53,WAF 配合使用。
Route 53是AWS提供的DNS域名服务,主要包括域名注册,DNS解析,以及健康检查,故障转移等功能。
AWS是通过 ICANN认证的域名注册服务商,可以通过AWS的域名域名注册服务,实现域名的注册和托管。常用的顶级域名如.com,.net,.cn,.edu等都可以申请。
Route 53最主要的功能就是DNS解析,下图是官网提供的解析流程图和说明。
(1)用户打开 Web 浏览器并在地址栏中输入 www.example.com,然后按 Enter。
(2)将对 www.example.com 的请求路由到 DNS 解析程序,该解析程序通常由用户的 Internet 服务提供商 (ISP) (比如有线 Internet 提供商、DSL 宽带提供商或企业网络) 进行管理。
(3)ISP 的 DNS 解析程序将对 www.example.com 的请求转发到 DNS 根名称服务器。
(4)DNS 解析程序将再次转发对 www.example.com 的请求,而这次会转发到 .com 域的其中一个 TLD 名称服务器。.com 域的名称服务器使用与 example.com 域关联的四个 Route 53 名称服务器的名称来响应该请求。
DNS 解析程序会缓存(存储)四个 Route 53 名称服务器。下次有人浏览到 example.com 时,解析程序将跳过步骤 3 和 4,因为它已缓存了 example.com 的名称服务器。名称服务器通常缓存时长为两天。
(5)DNS 解析程序选择一个 Route 53 名称服务器,并将对 www.example.com 的请求转发到该名称服务器。
(6)Route 53 名称服务器在 example.com 托管区域中查找 www.example.com 记录、获取关联值(比如 Web 服务器的 IP 地址 192.0.2.44),并将该 IP 地址返回到 DNS 解析程序。
(7)DNS 解析程序最终将获得用户所需的 IP 地址。解析程序将该值返回给 Web 浏览器。
(8)Web 浏览器将对 www.example.com 的请求发送到它从 DNS 解析程序那里获得的 IP 地址。这是您的内容所在的位置,例如,在 Amazon EC2 实例上运行的 Web 服务器,或配置为网站终端节点的 Amazon S3 存储桶。
(9)192.0.2.44 上的 Web 服务器或其他资源将 www.example.com 的网页返回到 Web 浏览器,而 Web 浏览器会显示该页面。
Route 53支持A,AAAA,CNAM,ALIAS,CAA 等13种记录类型,我们重点介绍以下几种常用的。
DNS解析的目标可以有多个,比如在多个区域有多个ELB,但是最终选哪个呢,Route 53提供多种路由策略实现用户的需求。
当然也可以支持多个后端目标,只不过是以随机顺序返回一个目标给客户端。简单路由策略无法添加健康检查。
这种路由可以实现一定的负载均衡策略,一般可以可以用于灰度发布和A/B测试的场景。
在多个区域部署了目标节点,当请求到来时,Route 53会根据延迟,选择延迟较小的目标进行返回,一般用于对于延迟敏感的场景。
这种一般对于隐私合规要求严格,需要将相关请求和数据限制在本区域内。
这中路由类型可以进行健康状态检查,返回多个正常的目标ip,由客户端选择使用。
CloundFront是AWS提供的CDN(内容分发系统),将静态内容(网站,图像,视频等)拉取到边缘节点缓存,当用户访问时,根据就近原则,选择合适的边缘节点进行服务,提升访问的速度。
如图所示,当用户访问时,首先访问边缘节点,边缘节点判断是否有对应的缓存内容,如果没有则回源到主站下拉内容,再返回给用户。下一次用户请求相同内容的时候,就可以直接从边缘节点下载内容了。
上述过程看起来比较简单,但是涉及到如下的几个核心问题。
下面我们逐个分析。
1、如何实现就近访问,支持哪些协议?
根据用户请求的IP,确定地理位置(匹配GeoIP数据库),从而选取路由的边缘节点。目前支持HTTP,HTTPS,WEBSOCKET协议。
2、如何缓存内容,保持和主站的一致性。支持哪些类型的回源主站?
当用户第一次请求时,回源到主站下载内容缓存,并设置有效期(缓存控制标头,默认为24个小时)。内容过期后失效,重新请求。支持的回源主站类型有S3,负载均衡(ELB),EC2,API网关,以及HTTP后端服务器。
3、如何确保访问的安全性?
CloundFront经常和S3配合使用,实现对静态内容的访问。如下图所示:
下面我们用一张图来总结网络相关的知识点
当用户请求www.yourapp.com,由Route53服务通过DNS解析到负载均衡ELB,ELB根据规则将流量路由到Subnet 1子网的web app实例上,web app访问Subnet 2子网 App server,App serve再将数据读写到数据库DB中,Subnet1与Subnet2之间通过网络ACL实现访问安全控制,Subnet 2的DB实例设置安全组访问策略,限制App Server对DB的访问。DB的数据按照备份策略定时备份到S3中。
Region B与Regin A通过Direct Connect服务实现专有私网连接,确保数据的安全和低延迟,Region B的EC2实例访问网关终端节点实现对S3的访问,避免通过互联网访问。
用户访问视频文件时,先从CloundFront边缘节点拉取,如果CloundFront节点没有数据,则回源到S3存储桶进行下载,缓存后发送给用户。当在内容有效期内再次访问的时候,直接从边缘节点下载。
附件:
AWS云计算技术架构探索系列之一-开篇
AWS云计算技术架构探索系列之二-身份账户体系(IAM)
AWS云计算技术架构探索系列之三-计算
AWS云计算技术架构探索系列之四-存储
AWS云计算技术架构探索系列之五-网络
AWS云计算技术架构探索系列之六-数据库
AWS云计算技术架构探索系列之七-DevOps