nginx を使用してカナリアリリースをシミュレートする方法

nginx を使用してカナリアリリースをシミュレートする方法

この記事では、ブルーグリーン デプロイメントと、nginx を使用してカナリア リリースを最も簡単な方法でシミュレートする方法について説明します。

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

カナリアリリースのポイントは試行錯誤です。カナリアの放鳥の起源は、自然の美しい生き物が人間の産業の過程で開発されてきたという悲劇的な物語です。カナリアは、鉱夫たちの安全のために試行錯誤しながら人生を歩んでいます。全体的なセキュリティと引き換えに、非常に少ないコストで実行します。継続的デプロイメントの実践において、カナリアはトラフィック制御です。1 パーセントや 10 分の 1 などの非常に少ないトラフィックを使用して、特定のバージョンが正常かどうかを検証します。正常でない場合は、最も低いコストで機能を実現し、リスクを軽減します。正常であれば、重みを徐々に 100% まで増やし、すべてのトラフィックを新しいバージョンにスムーズに切り替えることができます。グレースケールリリースも、一般的には同様の概念です。グレーは、黒と白の間の遷移です。青でも緑でもないブルーグリーンデプロイメントとは異なり、グレーリリース/カナリアリリースが共存する期間がありますが、対応するトラフィックが異なります。カナリアリリースがグレーリリースと異なる場合、その違いは目的であるはずです。カナリアリリースの目的は試行錯誤ですが、グレーリリースはスムーズなリリースです。カナリアリリースで問題がない場合に行われるスムーズな遷移がグレーリリースです。

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

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

準備

2 つのサービスがそれぞれポート 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: 7002 の v2"

実行ログ

[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:7001
こんにちは、サービス:こんにちはメインサービス:7001のv1
[root@kong ~]# curl http://192.168.163.117:7002
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
[root@kong ~]#

nginxを起動する

[root@kong ~]# docker run -p 9080:80 --name nginx-canary -d nginx
659f15c4d006df6fcd1fab1efe39e25a85c31f3cab1cda67838ddd282669195c
[root@kong ~]# docker ps |grep nginx-canary
659f15c4d006 nginx "nginx -g 'daemon ..." 7 秒前 7 秒前に起動 0.0.0.0:9080->80/tcp nginx-canary
[root@kong ~]#

nginx コードスニペット

以下の nginx コード スニペットを用意し、nginx の /etc/nginx/conf.d/default.conf に追加します。シミュレーション方法は非常に簡単です。Down はトラフィックがゼロであることを示すために使用されます (nginx では重みをゼロに設定できません)。最初は、トラフィックの 100% がメイン バージョンに送信されます。

http {
アップストリーム nginx_canary {
  サーバー 192.168.163.117:7001 重み=100;
  サーバー 192.168.163.117:7002 がダウンしています。
}
サーバー{
  聞く 80;
  サーバー名 www.liumiao.cn 192.168.163.117;
  位置 / {
    proxy_pass http://nginx_canary;
  }
}

default.conf を変更する方法

これは、コンテナに vim をインストールし、ローカルで変更してから docker cp 経由で渡すか、sed で直接変更することで実現できます。コンテナにvimをインストールする場合は、次の方法を使用します

[root@kong ~]# docker exec -it nginx-lb sh
# apt-getアップデート
...省略 #apt-get install vim
...省略

修正前

# cat デフォルト.conf
サーバー{
  聞く 80;
  server_name ローカルホスト;
  #文字セット koi8-r;
  #access_log /var/log/nginx/host.access.log メイン;
  位置 / {
    ルート /usr/share/nginx/html;
    インデックス index.html index.htm;
  }
  #エラーページ 404 /404.html;
  # サーバーのエラーページを静的ページ /50x.html にリダイレクトします
  #
  エラーページ 500 502 503 504 /50x.html;
  場所 = /50x.html {
    ルート /usr/share/nginx/html;
  }
  # PHP スクリプトを 127.0.0.1:80 で listen している Apache にプロキシします
  #
  #場所 ~ \.php$ {
  # プロキシパス http://127.0.0.1;
  #}
  # PHP スクリプトを 127.0.0.1:9000 で待機している FastCGI サーバーに渡します
  #
  #場所 ~ \.php$ {
  #ルートhtml;
  #fastcgi_pass 127.0.0.1:9000;
  # fastcgi_index インデックス.php;
  # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  #fastcgi_params を含めます。
  #}
  # Apacheのドキュメントルートが.htaccessファイルへのアクセスを拒否する
  # nginxのものと一致します
  #
  #場所 ~ /\.ht {
  # すべて拒否;
  #}
}
#

# cat デフォルト.conf
アップストリーム nginx_canary {
  サーバー 192.168.163.117:7001 重み=100;
  サーバー 192.168.163.117:7002 がダウンしています。
}
サーバー{
  聞く 80;
  サーバー名 www.liumiao.cn 192.168.163.117;
  #文字セット koi8-r;
  #access_log /var/log/nginx/host.access.log メイン;
  位置 / {
    nginx を /usr/share/html にコピーします。
    #インデックス index.html index.htm;
    proxy_pass http://nginx_canary;
  }
  #エラーページ 404 /404.html;
  # サーバーのエラーページを静的ページ /50x.html にリダイレクトします
  #
  エラーページ 500 502 503 504 /50x.html;
  場所 = /50x.html {
    ルート /usr/share/nginx/html;
  }
  # PHP スクリプトを 127.0.0.1:80 で listen している Apache にプロキシします
  #
  #場所 ~ \.php$ {
  # プロキシパス http://127.0.0.1;
  #}
  # PHP スクリプトを 127.0.0.1:9000 で待機している FastCGI サーバーに渡します
  #
  #場所 ~ \.php$ {
  #ルートhtml;
  #fastcgi_pass 127.0.0.1:9000;
  # fastcgi_index インデックス.php;
  # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  #fastcgi_params を含めます。
  #}
  # Apacheのドキュメントルートが.htaccessファイルへのアクセスを拒否する
  # nginxのものと一致します
  #
  #場所 ~ /\.ht {
  # すべて拒否;
  #}
}
#

nginx設定を再読み込み

# nginx -s リロード
2018/05/28 05:16:20 [通知] 319#319: シグナル処理が開始されました
#

結果を確認する

10回の呼び出しすべてが7001でv1を出力しました

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl http://localhost:9080; let cnt++; done
こんにちは、サービス:こんにちはメインサービス:7001のv1
こんにちは、サービス:こんにちはメインサービス:7001のv1
こんにちは、サービス:こんにちはメインサービス:7001のv1
こんにちは、サービス:こんにちはメインサービス:7001のv1
こんにちは、サービス:こんにちはメインサービス:7001のv1
こんにちは、サービス:こんにちはメインサービス:7001のv1
こんにちは、サービス:こんにちはメインサービス:7001のv1
こんにちは、サービス:こんにちはメインサービス:7001のv1
こんにちは、サービス:こんにちはメインサービス:7001のv1
こんにちは、サービス:こんにちはメインサービス:7001のv1
[root@kong ~]#

カナリアリリース: カナリアバージョンのトラフィックの重みは 10% です

default.conf の重みを調整してから nginx -s reload を実行すると、カナリア バージョンの重みが 10% に調整され、トラフィックの 10% で新しいサービスが実行されるようになります。

default.conf を変更する方法

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

アップストリーム nginx_canary {
  サーバー 192.168.163.117:7001 重み=10;
  サーバー 192.168.163.117:7002 重み=90;
}

nginx設定を再読み込み

# nginx -s リロード
2018/05/28 05:20:14 [通知] 330#330: シグナル処理が開始されました
#

結果を確認する

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl http://localhost:9080; let cnt++; done
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはメインサービス:7001のv1
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
[root@kong ~]#

カナリアリリース: カナリアバージョンのトラフィックの重みは 50%

default.conf の重みを調整してから nginx -s reload を実行すると、カナリア バージョンの重みが 50% に調整され、トラフィックの 50% で新しいサービスが実行されるようになります。

default.conf を変更する方法

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

アップストリーム nginx_canary {
  サーバー 192.168.163.117:7001 重み=50;
  サーバー 192.168.163.117:7002 重み=50;
}

nginx設定を再読み込み

# nginx -s リロード
2018/05/28 05:22:26 [通知] 339#339: シグナル処理が開始されました
#

結果を確認する

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl http://localhost:9080; let cnt++; done
こんにちは、サービス:こんにちはメインサービス:7001のv1
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはメインサービス:7001のv1
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはメインサービス:7001のv1
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはメインサービス:7001のv1
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはメインサービス:7001のv1
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
[root@kong ~]#

カナリアリリース:カナリアバージョンのトラフィックの重みは90%

default.conf の重みを調整してから nginx -s reload を実行すると、カナリア バージョンの重みが 90% に調整され、トラフィックの 90% で新しいサービスが実行されるようになります。

default.conf を変更する方法

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

アップストリーム nginx_canary {
  サーバー 192.168.163.117:7001 重み=10;
  サーバー 192.168.163.117:7002 重み=90;
}

nginx設定を再読み込み

# nginx -s リロード
2018/05/28 05:24:29 [通知] 346#346: シグナル処理が開始されました
#

結果を確認する

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl http://localhost:9080; let cnt++; done
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはメインサービス:7001のv1
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
[root@kong ~]#

カナリアリリース: カナリアバージョンのトラフィックの重みは 100% です

default.conf の重みを調整してから nginx -s reload を実行すると、カナリア バージョンの重みが 100% に調整され、トラフィックの 100% で新しいサービスが実行されるようになります。

default.conf を変更する方法

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

アップストリーム nginx_canary {
  サーバー 192.168.163.117:7001 がダウンしています。
  サーバー 192.168.163.117:7002 重み=100;
}

nginx設定を再読み込み

# nginx -s リロード
2018/05/28 05:26:37 [通知] 353#353: シグナル処理が開始されました

結果を確認する

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl http://localhost:9080; let cnt++; done
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
こんにちは、サービス:こんにちはカナリアデプロイサービス: 7002 の v2
[root@kong ~]#

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • Nginx でグレースケールリリースを実装する 3 つの方法の概要
  • Asp.Net Core の公開と展開の詳細な説明 (MacOS + Linux + Nginx)
  • nginx がリリースしたばかりの JavaScript 機能、nginScript の簡単な分析
  • Nginxのアクセスボリューム制御の詳細な説明
  • nginx を使用したプロキシ サーバーの設定
  • Docker コンテナのデプロイの試み - マルチコンテナ通信 (node+mongoDB+nginx)
  • Nginx proxy_redirect の使用方法の詳細な説明
  • 指定したディレクトリに nginx をインストールする方法の例
  • Linux システムで IPv6 をサポートするように Nginx を設定する方法
  • VueとNginxをベースにしたフロントエンドとバックエンドのデプロイメントチュートリアルの詳細な説明

<<:  ショートビデオ(Douyin)の透かし除去ツールの実装コード

>>:  MySQLサービスの自動停止の解決策

推薦する

MySQLカスケードレプリケーションの実装方法の例

いわゆるカスケード レプリケーションでは、マスター サーバーが 1 つのスレーブ サーバーにのみデー...

Docker に MySQL と Redis をインストールする方法

この記事はCentOS 7.3システム環境をベースに、MySQLとRedisのインストールと使用につ...

ウェブ画像形式としてPNG、JPG、GIFを選択して使用する方法

では、GIF、PNG、JPG のどの形式を候補形式として選択すればよいのでしょうか。また、どの画像形...

Docker+keepalived+nginx を使用してマスタースレーブホットスタンバイを実装する方法の例

序文単一障害点を解決するには、マスター/スレーブ ホット スタンバイ ソリューションを構成する必要が...

MySQL のソートとページング (order by と limit) と既存の落とし穴

並べ替えクエリ (order by)電子商取引の場合: 今日完了したすべての注文を表示し、取引金額に...

JavaScriptにおける評価戦略の詳細な説明

目次それを覆う栗パラメータの受け渡し値渡し共同配送要約する拡張機能 - 遅延評価私は最近、JavaS...

CSS 線形グラデーション凹型長方形遷移効果の実装

この記事では、線形グラデーションの凹四角形の遷移効果の難しさやアイデアについて説明します。主に、凹四...

この記事ではJavaScriptのガベージコレクションの仕組みを説明します

目次1. 概要2. メモリ管理3. ガベージコレクション4. GCアルゴリズムの紹介5. 参照カウン...

ティックアニメーション効果を作成するための svg+css または js

以前、上司からログイン後にチェックマークを表示できるプログラムを作るように言われたのですが、Baid...

JS ES の新機能、変数分離割り当て

目次1. 配列の分離割り当て1.1 配列分離割り当てとは何ですか? 1.2 配列分離割り当てに失敗し...

CentOS 7.6 仮想ネットワーク カードのバッチ追加、変更、削除操作の紹介

1 カーネルにtunモジュールがあるかどうかを確認する modinfo tun modprobe t...

EXPLAIN を使って MySQL の SQL 実行プランを分析する方法

序文MySQL では、EXPLAIN コマンドを使用して、テーブルの接続方法や SELECT ステー...

ネイティブ JS 音楽プレーヤー

この記事の例では、音楽プレーヤーを実装するためのJSの具体的なコードを参考までに共有しています。具体...

CSS3は、変換変形とイベントを組み合わせて扇形のナビゲーションを完成させます。

この場合、transition という単語を間違って書いたため、午後中ずっとそれに取り組みました。本...