经常薅云厂商羊毛的同学肯定知道,在几大云厂商提供的免费套餐中,Azure的免费流量额度是非常足的。包括永久免费100GB流量,以及12个月有效期的15GB流量两个部分。在前12个月的有效期内,两者还是叠加的。相当于有115GB。

然而,这个免费流量背后却有一些不为人知的坑点。稍不注意,你可能就会掉坑里。

免费套餐有什么?

首先,在Azure的免费账户介绍页里,关于免费流量的说明,是在Networking类别下的 带宽(数据传输) 这项服务描述的。表格里就一句话:

描述 每月免费使用量 免费期限
通过我们强大的全球数据中心网络传输入站和出站数据。 15 GB出站 12个月
通过我们强大的全球数据中心网络传输入站和出站数据。 100 GB出站 永久

正常情况下,可能大家的理解就是只要出站流量不超过15或者150GB就可以了,毕竟几乎所有的云厂商对入站流量都是不收费的。然而当你打开Azure的 带宽(数据传输) 服务的计费页面,就会发现,事情可不像那么简单。

首先,在这个页面里完全没有提到上面说的这个12个月有效期每月15 GB的出站流量。当然,这个可以理解,毕竟活动页面和产品页面各有侧重嘛!

其次,关于永久免费的100 GB出站流量,在这个页面则是明确说明了。这100 GB的流量必须是Internet Egress流量,包括route via Microsoft Premium Global Networkroute via Routing preference transit ISP network。当然,Internet Egress流量也没有提到有这两种之外的第三种,我们姑且就简单的理解为Internet Egress

那么问题来了,这里的Internet Egress有什么特别的含义呢?

Azure流量的分类

这就要说一下在这个文档中,对于流量的分类和定义。我们可以大致看一下几个分类:第一大类,没有说类别名字,分为下面五种情况:

  • Data Transfer In: 入站流量,免费。
  • Data Transfer between Availability Zones(Egress and Ingress): 不同可用区间的数据传输,包括入站和出站,费用都是$0.01 per GB,不免费
  • Data Transfer within same Availability Zone: 同一可用区之间的数据传输,免费
  • Data transfer from Azure origin to Azure CDN: 从Azure资源到 Azure CDN服务的流量,免费
  • Data transfer from Azure origin to Azure Front Door: 从Azure资源到Azure Front Door服务的流量,免费

第二大类,称之为Inter Region,可以理解为是Azure区域之间的流量,包括Intra-continentalInter-continental两种情况,也就是大洲内和跨大洲的流量,不同大洲的费用不一样。共同的特点就是都要收费

第三大类,就是上面说的两种Internet Egress,也就是互联网出口流量。这类流量的前100 GB都是免费的,超过后需要付费。

总结一下,所谓的100 GB免费出口流量,仅仅是上面三大类中的最后一类——Internet Egress(互联网出口流量)。反过来说就是,下面两种情况的出口流量并不符合免费额度条件:

  • 同一区域不同可用区之间的所有流量
  • 不同区域之间的所有所有流量

熟悉云服务的同学看到这里,可能觉得这个不是问题。因为只要我对外提供服务的时候,使用公网IP,那就不会产生这两种流量。因为即便是流量源在Azure的其他可用区区域,只要我访问服务的时候是通过公网IP来的,那么流量肯定先从源流出到互联网,再通过互联网路由到目标资源。

有这种想法的同学,还是Too Young Too Naive啊!这里再隆重推出Azure的下一个坑——Routing Preference(路由首选项)

Azure网络的Routing Preference(路由首选项)

如果创建Azure资源(比如:虚拟机、K8S集群、负载均衡器)的时候足够细心,可能你会留意到一个叫做Routing Preference,也就是路由首选项的配置。

那么这是个什么东西呢?我们可以看下Azure的关于Routing Preference(路由首选项)的文档。简单的说,Azure资源的网络路由,有两种可选方式:

  • 通过Microsoft网络路由: 又称冷土豆路由。这种路由方式下,Azure资源的IP并不确定在一个入口,而是分布在全球各地的微软边沿节点上,并通过微软的骨干网互联。每个地区的真正入口通过BGP Anycast公告。 如此以来,当用户通过这些IP访问资源的时候,到这个IP的流量会就近路由到微软骨干网在当地的边沿节点POP),并通过微软的骨干网传输到真实的Azure资源上。
  • 通过ISP网络(公共Internet)路由: 又称热土豆路由。这种路由方式下,Azure资源的IP的入口就确定在这个资源上。所有用户访问的时候,都会根据各地ISP正常的路由策略,通过Internet互联网转发到Azure资源。

关于这个特性,也不是微软一家独有,很多云厂商都有。只不过通常会作为一个单独的服务售卖,而不是广泛的作为云资源的一个配置项存在。而且听起来好像这是改善网络情况的好特性,那么问题在哪里呢?问题就在于——我的用户的流量来源是不确定的。

  • 他可能是一个普通的终端用户: 用着ISP提供的网络,无论我们的路由首选项是什么,他的流量都是先通过ISP接入互联网,然后经过层层路由,才到达我们的Azure资源,或者到达微软的边沿节点最终进入我们的Azure资源。这种情况下,一切正常、免费、没毛病
  • 但是他也可能是一个Azure的用户,用着微软Azure的网络。
    • 如果我们Azure资源的路由首选项是通过ISP网络(公共Internet): 那问题不大。他的流量会先从他所在的Azure区域流出到互联网,然后再经过层层路由到达我们的Azure资源。
    • 如果我们设置的路由首选项是通过Microsoft网络: 那就尴尬了。 如果我们Azure资源的BGP边沿节点和他在同一个区域的同一个可用区,那问题不大,他的流量不会因此收费。 但如果不是,那么他的流量流入到BGP边沿节点的时候,就会产生不同可用区甚至是不同区域的访问,从而导致流量成本。

你可能会说,那大不了我就不用高大上的Microsoft网络路由首选项呗。恭喜你,开始跳进Azure设计的坑里了。我们看下路由策略文档下面的Limitations(限制)部分。这部分内容有这么一句很重要的话:

Internet routing preference is only compatible with zone-redundant standard SKU of public IP address. Basic SKU of public IP address isn’t supported.

我给翻译一下,意思就是:通过ISP网络(公共Internet)路由的公网IP所支持的SKU,只支持Standard,不支持 Basic。不错,一个Standart(标准)、一个Basic(基础),取得一手好名字,完全无法从字面猜不出差别来,感觉都很普通、中庸。所以,我们继续挖掘。

Azure不同IP地址SKU的差别

为了找到StandardBasic这两种Public IP SKU的区别,我们可以看下Azure关于Public IPs SKU的文档。

这个文档中用表哥详细列出了两种SKU各种纬度的差异。这里我们只需要关心最前面的Allocation method这一条,也就是IP地址的分配方法就足够了。关于这一条,文档中简单精炼的说明了:

  • Standard:只支持Static这种分配方法;
  • Basic:IPv4支持DynamicStatic两种分配方法,IPv6只支持Dynamic

好,这里又来了一个看起来很熟悉,但是摸不到脑门的DynamicStatic两个Allocation method的新概念。这两个东西又会有什么影响呢?

我们继续挖Azure的文档,在IP地址定价这篇文档中,我们终于找到了端倪:

  • 对于Dynamic IPv4 address(动态IPv4地址),每个云服务可以免费绑定一个,超过的收费。
  • 对于Static IPv4 Address(静态IPv4地址),全部都收费。

所有限制条件大串联

到这里,想要白嫖Azure 100+15 GB的流量的我们,可以把整个事情串联起来看一下。

  • 首先,我们想要白嫖这100+15 GB的出口流量;
  • 然后,由于白嫖流量必须通过互联网进入,所以我们只能*选用*通过ISP网络(公共Internet)这种路由策略
  • 在这种策略下,我们的IP地址SKU必须使用Standard类型,不能使用Basic类型;
  • 因为必须使用Standard类型的IP地址,所以我们就只能使用Static方法分配IP地址
  • 由于必须使用Static方法分配IP地址,所以一定会被收取IP地址使用费

我们再反过来串一下:

  • 首先,我们想白嫖IP地址,所以只能使用Dynamic方法分配IP地址
  • 由于使用Dynamic方法分配地址,所以我们的IP地址的SKU必须是Basic
  • 由于IP地址的SKU必须是Basic,所以我们的必须是通过Microsoft路由这种路由策略
  • 由于是Microsoft路由这种策略,导致我们入口流量就有可能是在区域或者可用区之间传输
  • 由于流量可能在区域或可用区之间传输,所以我们的流量就不能满足免费条件

总结

总结起来就一句话,用Azure的免费套餐,要么给流量费、要么给IP使用费。两个都不想给?

那就只有赌一赌你的用户里,没有任何一个人,在没有Azure边沿节点的Azure可用区。

这种情况比较少,但从我的Azure账单上看肯定是有的。