一、平滑发布与灰度发布
**什么叫平滑:**在发布的过程中不影响用户的使用,系统不会因发布而暂停对外服务,不会造成用户短暂性无法访问;
**什么叫灰度:**发布后让部分用户使用新版本,其它用户使用旧版本,逐步扩大影响范围,最终达到全部更新的发布方式 ;
灰度发布与平滑发布其实是关联的。当服务器的数量只有一台的时候,不存在灰度发布,一旦发布了就是所有用户都更新了,
所以这个时候只有平滑发布。当服务器数量大于一台的时候,只要每台服务器都能达到平滑发布的方式,然后设定好需要
发布的服务器占比数量,就可以实现灰度发布了。
单台服务器的平滑发布模式:
单机状态下,应用的持续服务主要依靠Nginx的负载均衡及自动切换功能;
为了能够切换应用,需要在服务器中创建两个相同的独立应用,分配两个不同的端口,
例如:app1,端口801; app2,端口802;
在Nginx中,将app1,app2作为负载均衡加载:
upstream myapp{
server 127.0.0.1:801; //app1
server 127.0.0.1:802; //app2
}
然后设置代理超时为1秒,以便在某个应用停止时及时切换到另一个应用:
server {
listen 80;
server_name localhost;
location /{
proxy_pass http://myapp;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 1;
proxy_read_timeout 1;
proxy_send_timeout 1;
}
}
以上内容写在单独的配置文件中:/vhost/pub/pub_app.conf
在nginx.conf里包含进去:
include /vhost/*.conf;
现在系统会均衡地分配用户访问app1与app2。
接下来我们进行平滑发布,我们先把app1停止,然后将新版本发布到app1中:
步骤1: 准备发布app1配置文件
新做一个配置文件 pub_app1_down.conf,内容中把app1停止掉:
upstream myapp{
server 127.0.0.1:801 down; //app1
server 127.0.0.1:802; //app2
}
将这个文件内容覆盖掉在原有的pub_app.conf
cp -f /vhost/pub/pub_app1_down.conf /vhost/pub_app.conf
步骤2:停止app1应用
平滑重新加载一下nginx:
service nginx reload
或者:
/usr/local/nginx/sbin/nginx -s reload
此时所有的请求都转到了app2了;
步骤3:更新app1
现在可以通过各种方式来更新应用了,例如:压缩包方式:
wget http://version.my.com/appudate/myapp/myapp-v3.2.32.tar
unzip -o -d /home/wwwroot/app1/ myapp-v3.2.32.tar
其中:-o:不提示的情况下覆盖文件;-d:指定解压目录
步骤3.5 内部测试
如果需要的话,可以在这一步对app1进行内部测试,以确保应用的正确性;
步骤4:准备发布app2配置文件;
此时app1已经是最新版本的文件了,可以切换到app1来对外,
创建一个新的nginx配置文件:pub_app2_down.conf,设置为app1对外,app2停止即可:
upstream myapp{
server 127.0.0.1:801; //app1
server 127.0.0.1:802 down; //app2
}
将这个文件内容覆盖掉在原有的pub_app.conf
cp -f /vhost/pub/pub_app2_down.conf /vhost/pub_app.conf
步骤5:切换到app1新版本应用
平滑重新一下nginx:
service nginx reload
或者:
/usr/local/nginx/sbin/nginx -s reload
此时所有的请求都转到了app1了,新版本开始运行;
步骤6:更新app2
与第3步一样,解压就可以了,这里可以省去下载过程
unzip -o -d /home/wwwroot/app2/ myapp-v3.2.32.tar
步骤7:恢复app1,app2同时对外:
cp -f /vhost/pub/pub_app.conf /vhost/pub_app.conf
平滑重新一下nginx:
service nginx reload
或者:
/usr/local/nginx/sbin/nginx -s reload
至此,整个应用都已经更新。
将各步骤中的脚本汇总一下:
[pub.sh]
#============ 平滑发布 v1.0 ===============
#step 1
cp -f /vhost/pub/pub_app1_down.conf /vhost/pub_app.conf
#step 2
service nginx reload
#step 3
wget http://version.my.com/appudate/myapp/myapp-v3.2.32.tar
unzip -o -d /home/wwwroot/app1/ myapp-v3.2.32.tar
#step 4
cp -f /vhost/pub/pub_app2_down.conf /vhost/pub_app.conf
#step 5
service nginx reload
#step 6
unzip -o -d /home/wwwroot/app2/ myapp-v3.2.32.tar
#step 7
cp -f /vhost/pub/pub_app.conf /vhost/pub_app.conf
service nginx reload
#============ 平滑发布 v1.0 ===============
备注:也可以充分利用nginx的宕机检测,省去步骤1,2,4,5,7;
简化后的脚本如下:
[pub_mini.sh]
#======== 简化版脚本 =============
wget http://version.my.com/appudate/myapp/myapp-v3.2.32.tar
unzip -o -d /home/wwwroot/app1/ myapp-v3.2.32.tar
unzip -o -d /home/wwwroot/app2/ myapp-v3.2.32.tar
#========= over ===========
多台服务器平滑发布模式:
有了单台平滑发布模式的基础,多台服务器就简单了。
每台服务器当作应用进行发布就可以了,由于nginx有宕机自动检测功能,
只需要在每台服务器上先停止发布,然后更新文件,再启动就可以了;
如果选择部分的服务器进行更新,那就是灰度了。
二、介绍 CI / CD
在本文档中,我们将概述持续集成,持续交付和持续部署的概念,以及GitLab CI / CD的介绍。
1、为什么要 CI / CD 方法简介
软件开发的连续方法基于自动执行脚本,以最大限度地减少在开发应用程序时引入错误的可能性。从新代码的开发到部署,它们需要较少的人为干预甚至根本不需要干预。
它涉及在每次小迭代中不断构建,测试和部署代码更改,从而减少基于有缺陷或失败的先前版本开发新代码的机会。
这种方法有三种主要方法,每种方法都根据最适合您的策略进行应用。 Devops
持续集成(Continuous Integration, CI): 代码合并,构建,部署,测试都在一起,不断地执行这个过程,并对结果反馈。
持续部署(Continuous Deployment, CD): 部署到测试环境、预生产环境、生成环境。
持续发布(Continuous Delivery, CD): 将最终产品发布到生成环境、给用户使用。
1、持续集成
考虑一个应用程序,其代码存储在GitLab中的Git存储库中。开发人员每天多次推送代码更改。对于每次推送到存储库,您都可以创建一组脚本来自动构建和测试应用程序,从而减少向应用程序引入错误的可能性。
这种做法被称为持续整合 ; 对于提交给应用程序的每个更改 - 甚至是开发分支 - 它都是自动且连续地构建和测试的,确保所引入的更改通过您为应用程序建立的所有测试,指南和代码合规性标准。
GitLab本身就是使用持续集成作为软件开发方法的一个例子。对于项目的每次推送,都会有一组脚本来检查代码。
2、持续交付
持续交付是持续集成的一个步骤。您的应用程序不仅在推送到代码库的每个代码更改时都构建和测试,而且,作为一个额外的步骤,它也会连续部署,尽管部署是手动触发的。
此方法可确保自动检查代码,但需要人工干预才能手动并策略性地触发更改的部署。
3、持续部署
持续部署 也是持续集成的又一步,类似于持续交付。不同之处在于,您不必手动部署应用程序,而是将其设置为自动部署。完全不需要人工干预就可以部署您的应用程序。
2、GitLab CI / CD简介
GitLab CI / CD是GitLab内置的强大工具,允许您将所有连续方法(持续集成,交付和部署)应用于您的软件,而无需第三方应用程序或集成。
3、GitLab CI / CD 的工作原理
要使用GitLab CI / CD,您只需要一个托管在Git存储库中的应用程序代码库,并在一