部署一个Predix App是十分简单, 大部分时候, 我们通过一个简单的cf push
命令即可完成程序的部署和上线. 但cf push
在部署过程中会停掉旧的程序并等待新的程序上线, 在这个过程中程序是访问不到的, 用户在访问时会收到404 not found error
.
为了避免这个情况, 我们可以引入蓝绿部署(Blue-Green): 在部署过程中, 旧的程序作为蓝方不停机一直运行, 直到作为绿方的新程序部署完成并上线. 一旦绿方上线成功, 负载均衡会把用户的访问均匀分布到蓝绿两个程序中, 之后再全下线蓝方, 使所有的流量都指向新的程序. 至此为止, 新程序上线, 程序下线时间为0.
那么我们就来在Predix尝试一下.
步骤
假设已经在运行状态的旧程序名为blue-app
, 我们的目标是上线一个新版的blue-app
并且没有任何下线时间.
在cf
控制台中我们可以看到:
Getting apps in org PREDIX / space blue-green
OK
name requested state instances memory disk urls
blue-app started 1/1 256M 1G blue-app.run.aws-usw02-pr.ice.predix.io
1, 部署并上线新版程序green-app
这一步与普通程序上线无异, 但要注意程序的名字不要与旧版本冲突. 这里我们用green-app
作为程序名.
cf push green-app
这一步之后, 新版本作为green-app
已经上线. 可以使用自己的url进行测试.
2, 映射原路由至green-app
新旧版本两程序都已经部署完成并上线, 但他们使用的是各自的url. 现在我们使用cf map-route
命令, 把green-app
的url替换成blue-app
的, 也就是程序的原始url. 命令执行完成之后会看见成功信息.
cf map-route green-app run.aws-usw02-pr.ice.predix.io -n blue-app
Binding blue-app.run.aws-usw02-pr.ice.predix.io to green-app... OK
注: 将run.aws-usw02-pr.ice.predix.io替换为你所在predix的domain
3, 移除blue-app
的路由映射
第二步之后, 程序的原url已经映射到了新旧两个程序. 负载均衡会以round-robin的方式分布负载. 此时可以选择做一些测试工作. 如果无需测试或者测试已通过, 下一步我们就需要把旧的程序在router中移除, 使其不会再被访问到. 这里用到的是cf unmap-route
命令. 执行结束之后也会看见成功信息.
cf unmap-route blue-app run.aws-usw02-pr.ice.predix.io -n blue-app
Unbinding blue-app.run.aws-usw02-pr.ice.predix.io from blue-app... OK
同样的, 我们也需要移除green-app
在第一步中获得的url. 方法一样不再赘述.
4, 删除旧程序, 并把新程序重命名
第三部之后, 程序上线工作已经完成, 新程序已经接替了旧程序并上线工作. 这一步只是可选的清理工作, 使程序恢复到第一步之前的状态.
删除旧程序:
cf delete blue-app -f
重命名新程序:
cf rename green-app blue-app
总结
在predix中完成无停机部署也是一件并不复杂的事情, 本质上是在部署过程中对程序路由的切换, 可根据实际情况调整每一步的执行顺序和细节. 并且这些步骤均可以集成在CI/CD流水线中以自动化执行.