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

推薦する

HTML は、Web ページの作成者が学習して習得しなければならないものです。

HTML を学ぶメリットは何ですか? 1: ウェブサイトやブログのウェブ構造を簡単に変更できます。...

簡単な計算機を実装する小さなプログラム

この記事の例では、簡単な計算機を実装するための小さなプログラムの具体的なコードを参考までに共有してい...

新しい CSS :where および :is 疑似クラス関数とは何ですか?

:is と :where とは何ですか? :is()と:where()は、セレクターを作成するとき...

MySQLログシステムの使い方に関する簡単なチュートリアル

目次序文1. エラーログ2. バイナリログ1. バイナリログを有効にする2. バイナリログ形式3. ...

ローカル Docker に Postgres 12 + pgadmin をインストールする方法 (Apple M1 をサポート)

目次導入Intel CPUをサポートApple M1のサポートテスト導入このプロジェクトでは最近、P...

MySQLイベント計画タスクに関する簡単な説明

1. イベントが有効になっているかどうかを確認する'%sche%' のような変数を表...

Reactは二次連結(左右連結)を実現する

この記事では、二次リンクを実現するためのReactの具体的なコードを参考までに共有します。具体的な内...

mysql5.7 の新しい json フィールド タイプの使用例の分析

この記事では、MySQL 5.7 で追加された json フィールド タイプの使用方法を例を使って説...

単一のMySQLテーブルを復元する手順

休憩中に、眠気を完全に吹き飛ばす電話がかかってきました。「開発者が更新 SQL を書くときに whe...

Vue を使用してモバイル APK プロジェクトを完了することについての簡単な説明

目次基本設定エントリファイル main.jsアプリ.vue表紙ヘッダー検索バー本体当プロジェクトでは...

JavaScriptはブラウザがIEかどうかを判定します

フロントエンド開発者としては、IEの落とし穴は避けて通れません。他のブラウザはいいのにIEは壊れてい...

MySQL 8.0.18 のインストールと設定方法のグラフィックチュートリアル

この記事は、参考のためにMySQL 8.0.18のインストールと設定のグラフィックチュートリアルを記...

マウスが画像のハイパーリンク上を通過するときに画像のサイズ(幅、高さ)を変更する CSS

マウスが画像の上を通過したときに画像のハイパーリンクを変更する方法:コードをコピーコードは次のとおり...

MySQL binlog ログを開く方法

binlog は、すべての mysql dml 操作を記録するバイナリ ログ ファイルです。 bin...

Nginx ベースの Mencached キャッシュ構成の詳細な説明

導入Memcached は分散キャッシュ システムです。Memcached には認証とセキュリティ制...