DevOps与阿里云容器服务(四)- 复杂拓扑应用的蓝绿发布

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 在上一篇文章中,我们演示了如何使用蓝绿发布来实现热部署,但是在实际生产的场景中,应用的拓扑结构会复杂很多。在本篇文章中我们将会讨论下复杂应用拓扑中的蓝绿发布方案以及蓝绿发布适用的场景。

前言

在上一篇文章中,我们演示了如何使用蓝绿发布来实现热部署,但是在实际生产的场景中,应用的拓扑结构会复杂很多。在本篇文章中我们将会讨论下复杂应用拓扑中的蓝绿发布方案以及蓝绿发布适用的场景。

场景分析

大于大多数场景而言,对客户提供服务的软件的形态有三种。一种是前端类服务,用户可以直接或者间接通过网页、接口调用使用该服务提供的能力;一种是后端类服务,用户无法直接使用该服务提供的功能,该服务主要的使用者是其他服务,并通过其他服务最终将处理后的结果反馈给用户;第三种是调度任务类服务,即不被用户使用也不被其他服务调用,它的生命周期只存在在一个任务的执行生命周期中,通常任务的执行周期完毕,服务的生命周期就停止,通常为无状态资源密集性服务。

对于上述三种场景,以路由权重切换为主要实现方式的发布策略例如蓝绿发布、A/BTest等通常情况下比较适用于前端类服务与后端类服务。下面我们用一个简单的例子来拆解下如何使用阿里云容器服务来实现这两类服务的蓝绿发布。

在上一篇发布策略的文章中,有的开发者会问我的应用的拓扑关系不是单体的,不能通过单一容器级别的路由权重切换解决。在此要明确的一件事情,蓝绿发布是一种发布策略,部署的最小维度是容器,而发布的最小维度是应用。蓝绿发布的原理是老的应用的版本不变,新的应用版本进行部署,如果新版本与老版本之间应用的名字以及相关的配置没有改变,那么会认为这个应用是新老版本中共用的,无需变更;需要进行变更的应用通过名字的不同进行区分。简单的来讲,蓝绿发布是一个应用级别的更新操作,你可以对一个服务进行两个版本之间的切换,服务是一个逻辑的概念,而不是容器这样一个实体的概念,蓝绿发布可以做复杂拓扑的应用更新操作。

DEMO

下面我们通过一个拓扑结构复杂一点的例子来讲述蓝绿发布。应用的拓扑结构如下:
56f1842895ed5e6ef81a279b9705ba71.png
serviceB会调用serviceA,这两个都是python构建的,代码如下:

serviceA,通过接口返回数据 “world!”

from flask import Flask
app = Flask(__name__)

@app.route('/')
def world():
        return 'world!'

if __name__ == '__main__':
        app.run(port=5000,debug=True,host='0.0.0.0')

serviceB,调用serviceA的接口,并将返回的数据字段前面添加 “Hello ”

from flask import Flask
import requests
import os

dep_endpoint = os.getenv('dep_endpoint');

app = Flask(__name__)

@app.route('/')
def hello():
    msg = requests.get(dep_endpoint);
    return 'Hello ' + msg.text;

if __name__ == '__main__':
        app.run(port=5001,debug=True,host='0.0.0.0')                        

传统应用之间的调用方式可以是通过配置IP地址或者域名来调用,也可以通过服务注册中心中的地址的方式调用,但是对于一个无状态的多实例的服务,常见的做法是使用客户端的负载均衡器或者服务器的服务均衡器端点来实现。在容器服务中使用的方式是使用服务器端的负载均衡端点的方式,提供内部调用的路由端点,来实现后端服务的负载均衡。大致的调用方式如下。

serviceA-v1:
    image: 'registry-internal.cn-hangzhou.aliyuncs.com/ringtail/demo-service-a:1.0'
    labels:
        aliyun.scale: 3
        aliyun.routing.port_5000: servicea.local
serviceB-v1:
    image: 'registry-internal.cn-hangzhou.aliyuncs.com/ringtail/demo-service-b:1.0'
    environment:
        - 'dep_endpoint=http://servicea.local'
    labels:
        aliyun.scale: 2
        aliyun.routing.port_5001: serviceb
    external_links:
        - "servicea.local"    

serviceB通过external_links的方式将serviceA的内部路由端点引入,在环境变量中将dep_endpoint=http://servicea.local,使用servicea.local作为调用的地址。
访问serviceB的对外访问地址,可以得到:
393b1b6dbe6dd2868a40071995ed021e.png
我们最开始基本结构的应用就已经部署完毕了,下面开始进行不同服务的蓝绿发布。

前端服务的蓝绿发布

首先我们先看如果做前端服务的蓝绿发布,也就是说要对serviceB进行蓝绿发布的流程。大致的结构图如下。
99c1efd266e2eaeffba4df8d405f8387.png

在这个应用中前端服务的蓝绿发布,也就是对serviceB进行蓝绿发布,下面我们修改serviceB的代码

from flask import Flask
import requests
import os

dep_endpoint = os.getenv('dep_endpoint');

app = Flask(__name__)

@app.route('/')
def hello():
    msg = requests.get(dep_endpoint);
    return 'Welcome to the ' + msg.text;       //修改"Hello " => "Welcome to the "

if __name__ == '__main__':
        app.run(port=5001,debug=True,host='0.0.0.0')

修改编排模板,进行蓝绿发布

serviceA-v1:
    image: 'registry-internal.cn-hangzhou.aliyuncs.com/ringtail/demo-service-a:1.0'
    labels:
        aliyun.scale: 3
        aliyun.routing.port_5000: servicea.local
serviceB-v2:
    image: 'registry-internal.cn-hangzhou.aliyuncs.com/ringtail/demo-service-b:2.0'
    environment:
        - 'dep_endpoint=http://servicea.local'
    labels:
        aliyun.scale: 2
        aliyun.routing.port_5001: serviceb
    external_links:
        - "servicea.local" 

进行蓝绿发布更新后,可以看到更新后的服务列表,其中黄色的serviceA-v1表示当前的应用在蓝绿发布的过程中不会产生变化,serviceB-v1为老版本,serviceB-v2为新版本
ef51a1fa49bdd44052449de91906b235.png
通过路由列表选择相应的权重管理,进行权重的调整,将serviceA-v1的权重调整为0,将serviceA-v2的权重调整为100,此时访问serviceB的网址可以发现。
edcf06d0e9064384f82cd718e229aef7.png
验证完毕,点击确认发布完成,完成蓝绿发布。

后端服务的蓝绿发布

我们再看下如何做后端服务的蓝绿发布,也就是说对serviceA进行蓝绿发布。大致的结构图如下。
162e685ac16bf4621f2c57f6ca34783a.png

修改编排模板

serviceA-v2:
    image: 'registry-internal.cn-hangzhou.aliyuncs.com/ringtail/demo-service-a:2.0'
    labels:
        aliyun.scale: 3
        aliyun.routing.coexist: true
        aliyun.routing.port_5000: servicea.local
serviceB-v2:
    image: 'registry-internal.cn-hangzhou.aliyuncs.com/ringtail/demo-service-b:2.0'
    environment:
        - 'dep_endpoint=http://servicea.local'
    labels:
        aliyun.scale: 2
        aliyun.routing.coexist: true
        aliyun.routing.port_5001: serviceb
    external_links:
        - "servicea.local"

部署后的服务列表:

27c2f14345835bcaf23c360b81bc9274.png

此时可以发现serviceB-v2在本次发布中不会进行变更,调整服务的权重
4122b06d08f50ae52938909885432fba.png
此时再访问serviceB的地址,可以得到如下的结果
ef4e0f246d79a2f916cf3b1e47be144b.png

总结

蓝绿发布是一种用于升级与更新的发布策略,对于增量升级有比较好的支持,但是对于涉及数据表结构变更等等不可逆转的升级,并不完全合适用蓝绿发布来实现,需要结合一些业务的逻辑以及数据迁移与回滚的策略才可以完全满足需求,希望给位开发者可以在自己的业务场景中,更灵活的使用和实现蓝绿发布。

附录

代码仓库地址:https://github.com/ringtail/BlueGreenDevelopment

相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1天前
|
缓存 运维 前端开发
阿里云云效操作报错合集之如何解决在使用流水线构建net8应用时遇到无法构建的报错
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
2天前
|
Kubernetes 负载均衡 安全
【技术揭秘】阿里云容器服务Ingress高级玩法:如何轻松实现客户端原始IP透传,提升应用安全性与用户体验!
【8月更文挑战第17天】本文介绍如何在阿里云容器服务中配置Ingress以透传客户端原始IP地址。通过Ingress可实现HTTP负载均衡等功能。需在Ingress定义文件中添加特定注解,如`nginx.ingress.kubernetes.io/real-ip-header: X-Real-IP`。创建并应用Ingress配置后,后端服务可通过读取`X-Real-IP`头获取真实IP。此举有助于安全审计及流量分析。
|
5天前
|
缓存 负载均衡 算法
"揭秘!阿里云视觉智能开放平台人脸1vn搜索慢?轻松几招,QPS飙升,让你的应用快如闪电,用户体验秒变VIP级享受!"
【8月更文挑战第14天】在数字浪潮中,人脸识别技术广泛应用于安全监控到个性化服务等领域。阿里云视觉智能开放平台凭借其强大算法和服务模式成为行业翘楚。面对人脸1:Vn搜索响应慢的问题,不仅可通过增加QPS优化,还需从参数调整、缓存机制、并行处理及算法硬件升级等方面综合施策,以实现搜索速度与准确性的双重提升。
15 2
|
7天前
|
运维 监控 Devops
构建高效自动化运维体系:DevOps与容器化实践
【7月更文挑战第44天】在现代IT基础设施管理中,自动化运维已成为提升效率、降低成本、确保系统稳定性的关键。本文将探讨如何通过结合DevOps理念和容器化技术来构建一个高效的自动化运维体系。我们将分析这一体系对提高软件交付速度、优化资源利用率以及增强系统可靠性的积极影响,并提供一系列实施策略和最佳实践,帮助企业实现运维自动化转型。
|
7天前
|
运维 Devops 持续交付
DevOps实践之路:从理论到企业级应用
在数字化浪潮中,DevOps作为一种提升软件开发和运维效率的方法论,正被越来越多的企业采纳。本文通过探讨DevOps的核心理念、关键实践以及在不同规模企业中的应用案例,旨在为读者提供一条清晰的DevOps实践之路。无论你是初涉这一领域的新手,还是寻求进阶的资深人士,这篇文章都将为你打开一扇洞悉DevOps精髓的大门。
17 2
|
14天前
|
Kubernetes Devops 测试技术
DevOps实践:持续集成和持续部署(CI/CD)在现代企业中的应用
随着软件开发行业的迅猛发展,DevOps文化及其核心实践—持续集成(Continuous Integration, CI)与持续部署(Continuous Deployment, CD)—已成为提升软件交付速度和质量的关键策略。本文将深入探讨CI/CD的理论基础,并结合真实案例分析其在现代企业中的实际应用效果,旨在为读者提供一套可行的实施指南。
|
17天前
|
弹性计算 运维 负载均衡
基于阿里云容器服务Kubernetes版(ACK)| 容器化管理云上应用
【8月更文挑战第3天】基于阿里云容器服务Kubernetes版(ACK)| 容器化管理云上应用
|
4天前
|
人工智能 网络协议 小程序
重磅升级!阿里云推出首个域名AI大模型应用
重磅升级!阿里云推出首个域名AI大模型应用
23 0
|
3月前
|
存储 Kubernetes Docker
容器服务ACK常见问题之阿里云控制台进不去了如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
3月前
|
Kubernetes 容器
要获取ACK(阿里云容器服务)集群中的Deployment
要获取ACK(阿里云容器服务)集群中的Deployment【1月更文挑战第8天】【1月更文挑战第40篇】
81 4

相关产品

  • 容器计算服务