作者: Stan Peng,微软云计算架构师

做好 DevOps不是容易的事,最主要的就是避免人为失误,尽量多的用schedule tasks /automation script完成。

首先,什么是蓝绿部署?

Martin Flower曾在其文章中阐述了蓝绿部署的整体要点,大家可以看看。

基本上,蓝绿部署是一种以可预测的方式发布应用的技术,目的是减少发布过程中服务停止的时间。

简单来说,你需要准备两个相同的环境(基础架构),在蓝色环境运行当前生产环境中的应用,也就是旧版本应用,如图中 App1 version1App2 version1App3 version1

31

当你想要升级 App2version2,在蓝色环境中进行操作,即部署新版本应用,并进行测试。如果测试没问题,就可以把负载均衡器/反向代理/路由指向蓝色环境了。

32

在以前的 ASM 模式下,我们有一个比较容易的办法就是在 C loud Service 环境下,创建 staging production 环境。这是相对来说挺简单挺高效的办法。通过一个虚拟 VIP 来实现测试环境和生产环境的交互。但是在 ARM 模式下,我们没有提供这种 VIP 交互的方式,所以如果你有一个 staging 环境,又有一个生产环境。我们如何做到切换呢?今天就来讲讲 ARM 模式下的实现。

首先,原理很简单。通过 LB public IP 的交换,我们可以做到在可接受 downtime 的情况下蓝绿部署。

思路是这样的:

  • 把测试环境里的LB IP释放
  • 把生产环境IP关联到测试环境
  • 把测试环境的IP关联到生产环境

但我们 ARM IP 有个限制,一定要释放后才能关联。所以我们这里引入一个 template 变量,来自 IP 交换 . (其实就是一个 A = C, A=B, B=C 的初级编程题

到这里为止,我们的流程就完成了。

# 添加stage lb, production lb ,rg, location信息

$lb1name = ‘vipswap1lb’ $lb2name = ‘vipswap2lb’ $rgname = ‘vipswap’ $location = ‘chinaeast’

# create a new temporary public ip address “Creating a temporary public IP address” new-AzureRmPublicIpAddress -name ‘floatip’ -ResourceGroupName $rgname -location $location -AllocationMethod Dynamic $floatip = Get-AzureRmPublicIpAddress -name ‘floatip’ -ResourceGroupName $rgname

# get the LB1 model $lb1 = Get-AzureRmLoadBalancer -Name $lb1name -ResourceGroupName $rgname $lb1_ip_id = $lb1.frontendIPConfigurations.publicIPAddress.id

# set the LB1 IP addr to floatip “Assigning the temporary public IP address id ” + $floatip.id + ” to load balancer ” + $lb1name $lb1.FrontendIpConfigurations.publicIpAddress.id = $floatip.id Set-AzureRmLoadBalancer -LoadBalancer $lb1

# get the LB2 model $lb2 = Get-AzureRmLoadBalancer -Name $lb2name -ResourceGroupName $rgname $lb2_ip_id = $lb2.FrontendIPConfigurations.publicIPAddress.id

# set the LB2 IP addr to lb1 IP “Assigning the public IP address id ” + $lb1_ip_id + “to load balancer ” + $lb2name $lb2.FrontendIpConfigurations.publicIpAddress.id = $lb1_ip_id Set-AzureRmLoadBalancer -LoadBalancer $lb2

# set the LB1 IP addr to old lb2 IP “Assigning the public IP id ” + $lb2_ip_id + ” to load balancer ” + $lb1name $lb1.FrontendIpConfigurations.publicIpAddress.id = $lb2_ip_id Set-AzureRmLoadBalancer -LoadBalancer $lb1

# now delete the floatip “Deleting the temporary public IP address” Remove-AzureRmPublicIpAddress -Name ‘floatip’ -ResourceGroupName $rgname -Force

这样就是用 P owerShell 完成的自动化蓝绿部署。

除了 P owerShell 之外,我相信广大的 D evOps 专家们,也会喜欢使用 python 等自动化运维方式去管理。

这里再次介绍一下 mcazurerm python https://github.com/pjshi23/mcazurerm 。下载安装后就可以很快的用 python 脚本完成这个需求。

具体效果如下:

我的生产机器 demo2 ,目前可以通过这个 IP/DNS   lb1ipstan来访问:

33

通过 VIPSWAP 脚本,我通过上述逻辑实现了 VIP swap total downtime 66秒,平均downtiem60~120)

34

脚本跑完以后,生产环境和demo环境就交换了DNS/IP,部署完毕。

35