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サービスの自動停止の解決策

推薦する

SQL ストアド プロシージャの取得、データ取得、プロセス分析

この記事は主に、SQL のストアド プロシージャから返されたデータを取得するプロセスの分析を紹介しま...

nginxリバースプロキシwebSocket設定の詳細な説明

最近、プロジェクトで作業しているときに webSocket プロトコルを使用し、WeChat アプレ...

JavaScript タイピングゲーム

この記事では、タイピングゲームを実装するためのJavaScriptの具体的なコードを参考までに紹介し...

MySQLで最新のトランザクションIDを照会する方法

前に書いた内容: ビジネス ロジックの判断を行うために、最新のトランザクション ID を表示する必要...

antd pro に基づく SMS 認証コード ログイン機能 (プロセス分析)

目次まとめ全体的なプロセスフロントエンドページコード検証コードとログイン サービスをリクエストする ...

背景画像に CSS3 変換を適用するためのソリューション

CSS 変換は便利ですが、背景画像にはまだ適用されていません。この投稿では、背景画像を回転させたい場...

MySQL インデックスの長さ制限の原理の分析

この記事は主に、MySQL インデックスの長さ制限の原理の分析を紹介します。サンプル コードを通じて...

CSS継承方法

次の背景画像を持つ div があるとします。 次の反射効果を作成します。 方法はたくさんありますが、...

CSS を使用して、左側に固定幅、右側に適応幅を持つ 2 列レイアウトを実装する複数の方法

CSS を使用して、左側に固定幅、右側に適応幅を持つ 2 列レイアウトを実装する 7 つの方法。コー...

Docker Docker の保存場所を変更する コンテナイメージのサイズ制限を変更する操作

これは新しいバージョンではもう不可能なようで、推奨されません。そうでない場合は、ソフト リンクを直接...

HTML の基本 - CSS スタイルシート、スタイル属性、フォーマット、レイアウトの詳細

1.位置:固定一部の Web サイトの右下隅にあるポップアップ ウィンドウなどの、ブラウザーを基準と...

MySQL ソート機能の詳細

目次1. 問題のシナリオ2. 原因分析3. 解決策4. 知識を広げる4.1 クエリの最適化を制限する...

MySQL v5.7.18 解凍バージョンのインストール詳細チュートリアル

MySQLをダウンロード5.1.1.1 より前のバージョン私のコンピュータは64ビットなので、Win...

MySQL 5.7.13 winx64 のインストールと設定方法のグラフィック チュートリアル (win10)

この記事では、参考までにMySQL 5.7.13 winx64のインストールと設定方法のグラフィック...