如何使用nginx模擬進行藍綠部署

藍綠部署

藍綠部署的重點在于如下特點

  • 1. 藍色版本和綠色版本同時存在

  • 2. 實際運行的環境為藍或則綠,只能為其中之一,通過開關控制

優點和缺點分析:優點在于它的速度和回滾。而缺點也顯而易見。可以快速回滾是因為有兩套環境同時存在的緣故,所以復雜度和需要的資源會增多,因為其有兩套環境。
另外雖然速度有所提高,但是在實現的過程中,開關的控制,無論多快的切換速度,如果不結合其他的技術,還是無法做到完全無縫切換。

模擬藍綠部署

接下來我們使用nginx的upstream來簡單模擬一下藍綠部署的場景。具體場景如下, 當前活躍的是藍色版本,通過調整nginx設定,將綠色版本設定為當前活躍版本。

如何使用nginx模擬進行藍綠部署

事前準備

事前在7001/7002兩個端口分別啟動兩個服務,用于顯示不同信息,為了演示方便,使用tornado做了一個鏡像,通過docker容器啟動時傳遞的參數不同用于顯示服務的不同。

docker?run?-d?-p?7001:8080?liumiaocn/tornado:latest?python?/usr/local/bin/daemon.py?"hello?blue/green?service:?v1?in?7001" docker?run?-d?-p?7002:8080?liumiaocn/tornado:latest?python?/usr/local/bin/daemon.py?"hello?blue/green?service:?v2?in?7002"

執行日志

[root@kong?~]#?docker?run?-d?-p?7001:8080?liumiaocn/tornado:latest?python?/usr/local/bin/daemon.py?"hello?blue/green?service:?v1?in?7001" 70c74dc8e43d5635983f7240deb63a3fc0599d5474454c3bc5197aa5c0017348 [root@kong?~]#?docker?run?-d?-p?7002:8080?liumiaocn/tornado:latest?python?/usr/local/bin/daemon.py?"hello?blue/green?service:?v2?in?7002" 6c5c2ea322d4ac17b90feefb96e3194ec8adecedaa4c944419316a2e4bf07117 [root@kong?~]#?cURL?http://192.168.163.117:7001 hello,?service?:hello?blue/green?service:?v1?in?7001 [root@kong?~]#?curl?http://192.168.163.117:7002 hello,?service?:hello?blue/green?service:?v2?in?7002 [root@kong?~]#

啟動nginx

[root@kong?~]#?docker?run?-p?9080:80?--name?nginx-blue-green?-d?nginx d3b7098c44890c15918dc47616b67e5e0eb0da7a443eac266dbf26d55049216a [root@kong?~]#?docker?ps?|grep?nginx-blue-green d3b7098c4489????nginx???????????"nginx?-g?'daemon?..."??10?seconds?ago????up?9?seconds????0.0.0.0:9080->80/tcp???nginx-blue-green [root@kong?~]#

nginx代碼段

準備如下nginx代碼段將其添加到nginx的/etc/nginx/conf.d/default.conf中, 模擬方式很簡單,通過down來表示流量為零(nginx中無法將weight設置為零),開始的時候100%的流量都發到藍色版本。

http?{ upstream?nginx_blug_green?{ ??server?192.168.163.117:7001?weight=100; ??server?192.168.163.117:7002?down; } server?{ ??listen????80; ??server_name?www.liumiao.cn?192.168.163.117; ??location?/?{ ????proxy_pass?http://nginx_blug_green; ??} }

修改default.conf的方法

可以通過在容器中安裝vim達到效果,也可以在本地修改然后通過docker cp傳入,或者直接sed修改都可。如果在容器中安裝vim,使用如下方式即可

[root@kong?~]#?docker?exec?-it?nginx-lb?sh #?apt-get?update ...省略 #?apt-get?install?vim ...省略

修改前

#?cat?default.conf server?{ ??listen????80; ??server_name?localhost; ??#charset?koi8-r; ??#access_log?/var/log/nginx/host.access.log?main; ??location?/?{ ????root??/usr/share/nginx/html; ????index?index.html?index.htm; ??} ??#error_page?404???????/404.html; ??#?redirect?server?error?pages?to?the?static?page?/50x.html ??# ??error_page??500?502?503?504?/50x.html; ??location?=?/50x.html?{ ????root??/usr/share/nginx/html; ??} ??#?proxy?the?php?scripts?to?apache?listening?on?127.0.0.1:80 ??# ??#location?~?.php$?{ ??#??proxy_pass??http://127.0.0.1; ??#} ??#?pass?the?php?scripts?to?fastcgi?server?listening?on?127.0.0.1:9000 ??# ??#location?~?.php$?{ ??#??root??????html; ??#??fastcgi_pass??127.0.0.1:9000; ??#??fastcgi_index?index.php; ??#??fastcgi_param?script_filename?/scripts$fastcgi_script_name; ??#??include????fastcgi_params; ??#} ??#?deny?access?to?.htaccess?files,?if?apache's?document?root ??#?concurs?with?nginx's?one ??# ??#location?~?/.ht?{ ??#??deny?all; ??#} } #

修改后

#?cat?default.conf upstream?nginx_blug_green?{ ??server?192.168.163.117:7001?weight=100; ??server?192.168.163.117:7002?down; } server?{ ??listen????80; ??server_name?www.liumiao.cn?192.168.163.117; ??#charset?koi8-r; ??#access_log?/var/log/nginx/host.access.log?main; ??location?/?{ ????#root??/usr/share/nginx/html; ????#index?index.html?index.htm; ????proxy_pass?http://nginx_blug_green; ??} ??#error_page?404???????/404.html; ??#?redirect?server?error?pages?to?the?static?page?/50x.html ??# ??error_page??500?502?503?504?/50x.html; ??location?=?/50x.html?{ ????root??/usr/share/nginx/html; ??} ??#?proxy?the?php?scripts?to?apache?listening?on?127.0.0.1:80 ??# ??#location?~?.php$?{ ??#??proxy_pass??http://127.0.0.1; ??#} ??#?pass?the?php?scripts?to?fastcgi?server?listening?on?127.0.0.1:9000 ??# ??#location?~?.php$?{ ??#??root??????html; ??#??fastcgi_pass??127.0.0.1:9000; ??#??fastcgi_index?index.php; ??#??fastcgi_param?script_filename?/scripts$fastcgi_script_name; ??#??include????fastcgi_params; ??#} ??#?deny?access?to?.htaccess?files,?if?apache's?document?root ??#?concurs?with?nginx's?one ??# ??#location?~?/.ht?{ ??#??deny?all; ??#} } #

重新加載nginx設定

#?nginx?-s?reload 2018/05/28?04:39:47?[notice]?321#321:?signal?process?started #

確認結果

10次調用全部輸出的都是v1 in 7001

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]
> do
> curl
> let cnt++
> done
hello, service :hello blue/green service: v1 in 7001
hello, service :hello blue/green service: v1 in 7001
hello, service :hello blue/green service: v1 in 7001
hello, service :hello blue/green service: v1 in 7001
hello, service :hello blue/green service: v1 in 7001
hello, service :hello blue/green service: v1 in 7001
hello, service :hello blue/green service: v1 in 7001
hello, service :hello blue/green service: v1 in 7001
hello, service :hello blue/green service: v1 in 7001
hello, service :hello blue/green service: v1 in 7001
[root@kong ~]#

藍綠部署:切換到綠色版本

通過調整default.conf的weight,然后執行nginx -s reload的方式,在不停止nginx服務的方式下可動態的切換到綠色版本,目標將會將全部的流量都輸出v2 in 7002

修改default.conf的方法

只需要將upstream中的server的權重做如下調整:

upstream?nginx_blug_green?{ ??server?192.168.163.117:7001?down; ??server?192.168.163.117:7002?weight=100; }

重新加載nginx設定

#?nginx?-s?reload 2018/05/28?05:01:28?[notice]?330#330:?signal?process?started #

確認結果

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl ; let cnt++; done
hello, service :hello blue/green service: v2 in 7002
hello, service :hello blue/green service: v2 in 7002
hello, service :hello blue/green service: v2 in 7002
hello, service :hello blue/green service: v2 in 7002
hello, service :hello blue/green service: v2 in 7002
hello, service :hello blue/green service: v2 in 7002
hello, service :hello blue/green service: v2 in 7002
hello, service :hello blue/green service: v2 in 7002
hello, service :hello blue/green service: v2 in 7002
hello, service :hello blue/green service: v2 in 7002
[root@kong ~]#

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享