nginx應用:使用nginx進行金絲雀發布

來源:互聯網
上載者:User

這篇文章主要介紹了關於nginx應用:使用nginx進行金絲雀發布,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

這篇文章介紹一下藍綠部署以及使用nginx如何最簡單地類比一下金絲雀發布的方式

金絲雀發布/灰階發布

金絲雀發布的重點在於:試錯。金絲雀發布的來曆本身就是自然界的美麗生物在人類工業發展過程中的一個悲慘的故事。金絲雀就是用它的生命來為礦工的安全來試錯的。用很小的成本來換取整體的安全,在持續部署的實踐中,金絲雀就是流量控制,用很少的流量比如百分之一或者十分之一用於檢證某個版本是否正常,如果不正常則就用最低的成本實現了其作用,降低了風險。如果正常,則可以逐漸加大權重直至百分之百,將所有的流量都平穩地切換至新的版本。灰階發布,一般來說也是類似的概念。灰色是介於黑和白之前的一個過渡,區別於藍綠部署的非藍即綠,灰階發布/金絲雀發布會有一個兩者同時存在的時間段,只是兩者對應的流量不同,金絲雀發布如果說和灰階發布有所不同的話,其不同點應該是目的性的不同,金絲雀發布目的在於試錯,而灰階發布在於平穩發布,而在金絲雀發布沒有問題的狀況下進行的平穩過渡則正是灰階發布。

類比金絲雀發布

接下來我們使用nginx的upstream來簡單類比一下金絲雀發布的情境。具體情境如下, 當前活躍的是主要版本,通過調整nginx設定,通過不斷的調節金絲雀版本的權重,最終實現平穩地發布。

版本 說明
router 使用者通過http://localhost:8090來訪此種部署下的微服務
主要版本 當前活躍的主要版本,在7001連接埠提供服務,提示資訊為“Hello main service: v1 in 7001”
金絲雀版本 試錯的金絲雀版本,在7002連接埠提供服務,提示資訊為“Hello canary deploy service: v2 in 7002”

事前準備

事前在7001/7002兩個連接埠分別啟動兩個服務,用於顯示不同資訊,為了示範方便,使用tornado做了一個鏡像,通過docker容器啟動時傳遞的參數不同用於顯示服務的不同。

docker run -d -p 7001:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello main service: v1 in 7001"docker run -d -p 7002:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello canary deploy service: v2 in 7002"

執行日誌

[root@kong ~]# docker run -d -p 7001:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello main service: v1 in 7001"28f42bbd21146c520b05ff2226514e62445b4cdd5d82f372b3791fdd47cd602a[root@kong ~]# docker run -d -p 7002:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello canary deploy service: v2 in 7002"b86c4b83048d782fadc3edbacc19b73af20dc87f5f4cf37cf348d17c45f0215d[root@kong ~]# curl http://192.168.163.117:7001Hello, Service :Hello main service: v1 in 7001[root@kong ~]# curl http://192.168.163.117:7002Hello, Service :Hello canary deploy service: v2 in 7002[root@kong ~]#

啟動nginx

[root@kong ~]# docker run -p 9080:80 --name nginx-canary -d nginx659f15c4d006df6fcd1fab1efe39e25a85c31f3cab1cda67838ddd282669195c[root@kong ~]# docker ps |grep nginx-canary659f15c4d006        nginx                      "nginx -g 'daemon ..."   7 seconds ago        Up 7 seconds        0.0.0.0:9080->80/tcp     nginx-canary[root@kong ~]#

nginx程式碼片段

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

http {upstream nginx_canary {    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_canary;    }}

修改default.conf的方法

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

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

修改前

# cat default.confserver {    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.confupstream nginx_canary {    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_canary;    }    #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 reload2018/05/28 05:16:20 [notice] 319#319: signal process started#

確認結果

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

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl http://localhost:9080; let cnt++; doneHello, Service :Hello main service: v1 in 7001Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello main service: v1 in 7001[root@kong ~]#

金絲雀發布: 金絲雀版本流量權重10%

通過調整default.conf的weight,然後執行nginx -s reload的方式,調節金絲雀版本的權重為10%,流量的10%會執行新的服務

修改default.conf的方法

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

upstream nginx_canary {    server 192.168.163.117:7001 weight=10;    server 192.168.163.117:7002 weight=90;}

重新載入nginx設定

# nginx -s reload2018/05/28 05:20:14 [notice] 330#330: signal process started#

確認結果

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl http://localhost:9080; let cnt++; doneHello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002[root@kong ~]#

金絲雀發布: 金絲雀版本流量權重50%

通過調整default.conf的weight,然後執行nginx -s reload的方式,調節金絲雀版本的權重為50%,流量的50%會執行新的服務

修改default.conf的方法

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

upstream nginx_canary {    server 192.168.163.117:7001 weight=50;    server 192.168.163.117:7002 weight=50;}

重新載入nginx設定

# nginx -s reload2018/05/28 05:22:26 [notice] 339#339: signal process started#

確認結果

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl http://localhost:9080; let cnt++; doneHello, Service :Hello main service: v1 in 7001Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello canary deploy service: v2 in 7002[root@kong ~]#

金絲雀發布: 金絲雀版本流量權重90%

通過調整default.conf的weight,然後執行nginx -s reload的方式,調節金絲雀版本的權重為90%,流量的90%會執行新的服務

修改default.conf的方法

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

upstream nginx_canary {    server 192.168.163.117:7001 weight=10;    server 192.168.163.117:7002 weight=90;}

重新載入nginx設定

# nginx -s reload2018/05/28 05:24:29 [notice] 346#346: signal process started#

確認結果

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl http://localhost:9080; let cnt++; doneHello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello main service: v1 in 7001Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002[root@kong ~]#

金絲雀發布: 金絲雀版本流量權重100%

通過調整default.conf的weight,然後執行nginx -s reload的方式,調節金絲雀版本的權重為100%,流量的100%會執行新的服務

修改default.conf的方法

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

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

重新載入nginx設定

# nginx -s reload2018/05/28 05:26:37 [notice] 353#353: signal process started#

確認結果

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl http://localhost:9080; let cnt++; doneHello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002Hello, Service :Hello canary deploy service: v2 in 7002[root@kong ~]#

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.