阿里云服务提供的产品中,一般都涉及到endpoint的概念,其中分为internal endpoint和internet(external)endpoint。在阿里云VPC环境中使用这些服务,一般都是建议使用内部endpoint。下面就介绍下它们之间的区别,理解了这个机制,在开发使用中更好的使用阿里云服务。
VPC的工作机制及一般产品架构
我们产品是运行在阿里云VPC环境中的,VPC中在各个AZ(Available Zone可用区)中创建了几个vSwitch,然后有一个路由表来进行相关的路由设置。VPC内的程序如果需要访问外网,会通过NAT Gateway来进行。同时产品对外提供的服务是通过SLB(Load Balancer 负载均衡器)来完成。见下面的示意图。
图1:VPC and Product Architecture
阿里云的很多服务都提供两种访问方式,一种是internal endpoint即内部访问点,一种是public的internet endpoint。在VPC内部要访问阿里云服务时,比如OSS,RDS,Table Store,MNS等,有2条路径可以使用,一条是通过阿里云内部访问,这样不会经过NAT gateway,路由表直接到系统到阿里云服务;另一条是公网外部访问,那么就要经过NAT gateway转到阿里云服务。下面的图是从路由表中提取出来的,0.0.0.0/0表示不在路由表中的条目会通过NAT gateway出去。而100.64.0.0/10这个地址恰恰是阿里云服务的内部访问点的IP地址段,是通过阿里云内部系统直接到达对应服务,不会经过NAT gateway。
图2:VPC路由表设置
以OSS为例,内部endpoint是oss-cn-shanghai-internal.aliyuncs.com,外网的endpoint是oss-cn-shanghai.aliyuncs.com。下面分别ping它们,得到IP地址。而100.118.102.33就属于100.64.0.0/10网段。
图3:内部endpoint和外部endpoint IP地址
VPC内通过internal/internet endpoint访问阿里云服务的区别
通过图一的示意图,我们理解了internal 访问阿里云服务是不会经过NAT gateway的,直接通过内部系统路由到了阿里云特定服务器;而通过internet访问阿里云服务就会通过NAT网关。那么这两者具体有什么区别和影响呢?我列举以下几点:
1.NAT带宽占用。NAT是有一定的带宽限制的,具体是根据NAT实例类型来决定。负载比较大的情况会把NAT带宽占满,影响正常服务的外网访问性能。
2.NAT连接数的占用,因为NAT能提供的连接数也是有限制的。
3.访问速度的不同。前面提了外网访问会占用NAT带宽,而阿里云内网的带宽相较于NAT外网带宽会高很多。所以访问速度性能高很多。
4.外网访问流量费用。访问外网需要收取流量费。
既然访问阿里云服务通过NAT有这么多弱势,那么它有什么优势吗?答案是,没有。正是因为如此,所以VPC内访问阿里云服务都是建议通过内部访问点去访问的。
访问阿里云服务的方式
目前我们用到的很多阿里云服务都有提供内网访问点,比如docker registry (ACR,Ali Cloud Registry)、OSS、Loghub、RDS、Redis、MNS、MQ、Table Store等等。开发人员一般通过相应服务提供的SDK来使用对应的服务,如果阿里云没有对应的SDK,开发会通过第三方的一些库来使用,或者直接使用阿里云的API。有些调用是明确需要我们提供endpoint的,所以大家比较容易提供相应的内网endpoint给SDK/API,比如通过环境变量配置的方式传递过去。而有些SDK或者第三方的库没有明确要求我们提供endpoint,这个时候我们就要额外注意了,要检查以下代码到底用的是什么类型的endpoint。
比如下面的代码就是MNS service的NodeJS 库的实现。在构造MNS的时候,如果只是传一个region字符串的参数,它就会用Public的网络方式来使用MNS,如果要想使用内网的endpoint,要先构造Region实例并改成内网访问。
图4:MNS NodeJS库
下面列几个常用service的内网和公网endpoint:
Docker registry:
registry-vpc.cn-shanghai.aliyuncs.com
registry.cn-shanghai.aliyuncs.com
OSS:
http://oss-cn-shanghai-internal.aliyuncs.com
http://oss-cn-shanghai.aliyuncs.com
MNS:
http://xxxx.mns.cn-shanghai-internal.aliyuncs.com/
http(s)://xxxx.mns.cn-shanghai.aliyuncs.com/
Table Store:
https://xxxx.cn-shanghai.ots-internal.aliyuncs.com
https://xxxx.cn-shanghai.ots.aliyuncs.com
总结
通过上面的介绍,我们知道使用内部endpoint来访问阿里云服务的优势。使用阿里云service时能够注意一下这个问题,明确到底使用了什么类型的endpoint,做到心里有数。