在使用Azure服务的时候,无论是虚拟机或者PaaS层角色,例如Web/Work Role,大部分时候都是由Azure基础架构平台来自动分配IP地址,包括所谓的云服务IP(VIP)以及实例IP(DIP),就拿AzureVM举例来说,VIP就是云服务的对外发布IP,常用来映射本地端口或供外部直接访问(比如RDP连接),DIP作为虚拟机内部的系统IP来和Azure平台上的其他资源进行通信。


但有一个问题值得注意,就是默认情况下AzureVM或云服务出现停止/重启状态,VIP与DIP都会发生改变,这是Azure本身的平台特性所决定的,因为云计算强调的是弹性,一旦云服务产生了释放,那么IP资源将被回收,等待下一次启动时才会被重新分配,但由于云平台服务对象庞大,像IP地址这种属性肯定是无法保证不被改变的。


这样就引出一个问题,在某些特定业务需求下,用户的VIP或DIP是不希望被修改的,即便长时间的停止或维护重启等情况发生,最简单的例子比如AzureVM运行的是DC服务器或DNS服务等等,本文就先以Azure虚拟机的静态IP为内容做一些介绍

###################################################################################

下面以下图的xieruivm01这台虚拟机为例,可以看到当前的VIP与DIP分别为42.159.102.243以及10.209.62.55,这是由Azure自动分发的

wKiom1UBqwOjcG0jAAMXgjlNKY8927.jpg

我直接停止掉这台虚拟机所在的云服务,即LabService01,如下图:

wKiom1UBqwOyP8-yAAJG8kqQG-E466.jpg

再次启动该云服务,查看虚拟机信息发现VIP与DIP全部发生了改变,虽然前后操作不过几分钟而已,但是IP都变了,如果如上文提到的该虚拟机正在运行的是一台DC角色,那后果可想而知

wKioL1UBrCSQWdYTAALNkILDkxM611.jpg

那么有没有什么简单的方式来避免这类情况呢,当然是没问题的,例如用户需要关闭一阵子虚拟机时,可以通过powersehll并添加“-stayprovisioned”参数,这样一来就可以实现虚拟机关闭但不释放DIP的需求

wKiom1UBqwSjEFHSAAI-Z_DDX0w195.jpg

通过上述方式关掉虚拟机后,可以看到与其他已经停止的虚拟机相比,区别在于是否处在“Deallocated”状态,也就是“未分配”状态,显然xieruivm01这台虚拟机虽然停止了,但是还属于allocated状态,那么就意味着它还在被计费中!(关注成本的筒子们这里就要当心喽)

wKioL1UBrCTwQ72eAALoUREy3gE502.jpg

此时查看云服务的话也会发现处在一个warning状态,即云服务中的实例因为没有被完全释放掉,所以还属于running状态,如下图:

wKiom1UBqwTBIab1AAJG4pFxaCo761.jpg

再次启动xieruivm01之后发现VIP和DIP依然和之前的保持一致,这样通过powershell也可以达到目的,可毕竟治标不治本。

wKioL1UBrCXjFj2GAAMsI5PxkS8022.jpg

因此Azure虚拟机开放了一个静态IP的功能来彻底实现这一目的,使得用户在Azure上托管应用业务时更加安心,若需要使用Azure虚拟机静态IP功能,前提是要预先配置好虚拟网络,即Network服务,如下图中我准备了一个LabNet01的网络,里面还有两个子网分别是Subnet-1和Subnet-2,地址池是10.0.0.0/24以及10.0.1.0/24

wKiom1UBqwTDHKb8AALBJSA4_j0114.jpg

在正式配置静态IP之前可以先通过test-azurestaticvnetip来测试准备使用的地址是否处于available状态,即空闲可用的,如下图我打算使用10.0.0.10这个IP

wKioL1UBrCWAzvhWAAIoqu1uHeo698.jpg

然后我先配置好当前订阅的存储账号,并获取一个azure上的虚拟机p_w_picpath,准备部署一台新的虚拟机并指定到现有的虚拟网络上,如下图:

wKioL1UBrCbz4dqmAAIOv8hzws0373.jpg

下面开始创建虚拟机,例如上面的镜像以及指定的用户名和密码,并且-vnetname指定部署在labnet01这个虚拟网络上,需要注意的是,不要将虚拟机部署在处于地缘组的云服务上,因此我新生成了LabService02这个云服务,如下图:

wKioL1UBrCaCaWyIAALlZKcM-tM470.jpg

当前虚拟机正在创建中,如下图:

wKiom1UBqwaD2UsHAAMY2ub13bU152.jpg

创建好的虚拟机已经可以在我的LabNet01虚拟网络中看到了,它属于Subnet-1这个子网,并且获得了10.0.0.4的IP地址,这个是我自定义子网中的起始IP,为什么不是10.0.0.1呢,Azure会自动把前三个IP拿走用,这其中包含了虚拟网络的gateway地址等等,这个原理和私有云VMM的虚拟网络是一致的

wKioL1UBrCaATaV_AAJjzDGTELs710.jpg

接下来就可以指定该虚拟机使用静态IP了,通过set-azurestaticvnetip来把10.0.0.10这个地址指定给xieruivm04虚拟机使用,如下图:

wKioL1UBrCfwxA56AAN6qafQ-aQ952.jpg

现在这台虚拟机就已经使用了静态IP了,如下图:

wKioL1UBrCfjQxD4AAM6HUnZXMM928.jpg

直接通过powershell停止虚拟机,并通过force强制执行,不使用stayprovisioned参数,如下图:

wKiom1UBqwfCpYvDAAIgAZ4q1CI720.jpg

这时看到云服务也处于完全停止状态,如下图:

wKioL1UBrCjS7CrPAAJ9IDUWlS0805.jpg

再次启动xieruivm04这台虚拟机,验证一下静态IP的效果,如下图:

wKioL1UBrCjxCy10AAJGRnqZn_Y193.jpg

可以看到DIP依然使用了10.0.0.10这个IP,而云服务VIP发生了改变,这样也是合理的,如下图:

wKiom1UBqwjzQ2u4AANtF_8FjWQ715.jpg

有了虚拟网络的存在,可以很容易的对当前虚拟机进行切换,比如我把xieruivm04从之前的subnet-01转换到subnet02,也就是10.0.1.0/24子网,这样做的目的通常是为了扩展现有子网,因为Azure的子网变更需要把子网内资源转移走才可以操作

wKioL1UBrCiz4EPcAAJxKKZnDoI329.jpg

可以看到迁移到新的子网后,虚拟机IP也发生了变化,如下图:

wKiom1UBqwjBZDZMAAJOGWNiQjY805.jpg

其实说到底虚拟机的静态IP功能是依赖于虚拟网络服务的,有了虚拟网络的支持,不管是S2S ×××构建混合云,还是跨云服务的访问,都使得Azure上托管资源的选择变的更加灵活,后面会抽时间介绍针对云服务的“保留IP”功能。