ホームページ  >  記事  >  バックエンド開発  >  nginx アプリケーション: nginx を使用したカナリア公開

nginx アプリケーション: nginx を使用したカナリア公開

不言
不言オリジナル
2018-06-05 09:36:261956ブラウズ

この記事は主に nginx アプリケーションを紹介します。カナリア パブリッシングに nginx を使用することには、特定の参考値があります。必要な友人はそれを参照できます。

この記事では、Blue-Green デプロイメントと nginx の使用方法を紹介します。最も簡単な方法でのカナリア リリース

カナリア リリース/グレースケール リリース

カナリア リリースの重要なポイントは、試行錯誤です。カナリアの放鳥自体の起源は、人類の産業発展の過程における美しい自然の生き物たちの悲劇的な物語です。カナリアは、鉱山労働者の安全のために命をかけて試行錯誤します。全体的なセキュリティを確保するために、少量のコストが使用されます。カナリアは、特定のバージョンが正常であるかどうかを確認するために、1 パーセントまたは 10 分の 1 などの非常に少量のトラフィックを制御します。異常であれば、その機能は最小限のコストで達成され、リスクは軽減されます。正常であれば、100% に達するまで徐々に重みを増やし、すべてのトラフィックを新しいバージョンにスムーズに切り替えることができます。グレースケール パブリッシングも一般に同様の概念です。グレーは黒と白の間の遷移であり、青または緑のどちらかのグレースケール リリースとカナリア リリースには、両方が同時に存在する期間がありますが、この 2 つの対応するトラフィックは異なります。カナリア リリースがグレースケール リリースと異なる場合、その違いは試行錯誤が目的であり、グレースケール リリースは安定したリリースを目的としていますが、カナリア リリースでは問題はありません。グレースケールリリースの状況下で。

カナリアリリースのシミュレーション

次に、nginx のアップストリームを使用して、カナリアリリースのシナリオを単純にシミュレートします。具体的なシナリオは次のとおりです。現在、メイン バージョンがアクティブになっており、nginx の設定を調整し、Canary バージョンの重みを常に調整することで、最終的にスムーズなリリースが実現されます。

バージョン 説明
ルーター ユーザーは http://localhost:8090 を通じてこのデプロイメントの下でマイクロサービスにアクセスします
メイン バージョン サービス内の現在アクティブなメイン バージョンはポート 7001 で提供され、プロンプト メッセージは「Hello main service: v1 in 7001」です
Canary バージョン トライアル アンド エラーの Canary バージョン、サービスはポート 7002 で提供され、プロンプト メッセージは「Hello Canarydeployservice:v2in7002"

事前準備

異なる情報を表示するために、事前に2つのポート7001/7002で2つのサービスを起動してください。デモンストレーションの便宜上、トルネードを使用してミラーを作成し、パスしました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に追加する シミュレーション方法は非常に簡単です。 through down トラフィックがゼロ (nginx では重みをゼロに設定できない) であることを示すために、トラフィックの 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回の呼び出し後のすべての出力は7001のv1です

[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 ~]#

Canaryリリース: Canary バージョンのトラフィックのウェイトは 10% です

default.conf のウェイトを調整して nginx -s reload を実行すると、Canary バージョンのウェイトが 10% に調整され、トラフィックの 10% が実行されます New service

default.confの変更方法

以下のようにアップストリームのサーバーの重みを調整するだけです:

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 の重みを調整してから nginx -s reload を実行すると、カナリア バージョンの重みが 50% に調整され、新しいサービスが実行されます

default.conf を変更する方法

のみ。上流のサーバーのウェイトを次のように調整する必要があります:

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%です

調整によりデフォルトのウェイトです。 conf を変更して、nginx -s reload を実行し、カナリア バージョンの重みを 90% に調整すると、トラフィックの 90% が新しいサービスを実行します

default.conf の変更方法

アップストリームを変更するだけです

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 ~]#

Canaryリリース:Canary版トラフィックウェイト100%

default.confのウェイトを調整し、nginx -s reloadを実行この方法では、カナリア バージョンの重みを 100% に調整すると、トラフィックの 100% が新しいサービスを実行します

default.conf を変更する方法

次のようにアップストリームのサーバーの重みを調整するだけです:

<p style="margin-bottom: 7px; margin-top: 14px;">upstream nginx_canary {    server 192.168.163.117:7001 down;    server 192.168.163.117:7002 weight=100;<br/>}<br/></p>

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 ~]#

関連する推奨事項:

nginxアプリケーション:負荷分散にnginxを使用する

以上がnginx アプリケーション: nginx を使用したカナリア公開の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。