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 binlog を開く手順

Binlog は、MySQL データの変更を記録するために使用されるバイナリ ログ ファイルです。B...

tomcat+nginx を使用してマルチアプリケーション デプロイメントを実装するためのサンプル コード

目次マルチアプリケーションの展開1-Tomcat 構成1.1- プロジェクト構成1.2-サービス構成...

VMware vSAN 入門概要

1. 背景1. vSphere の共有ストレージの背景を簡単に紹介するvSphere の重要な機能は...

ハイパーリンクの表示と開き方

<br />関連記事: ハイパーリンクを表示して開く方法症状<br />ユー...

カルーセルバナーの自動回転効果を実現する純粋な CSS

さっそくコードを見てみましょう * { マージン: 0; パディング: 0; } 。容器 { マージ...

Dockerボリュームマウントの実装方法

最も単純な hello world 出力イメージを作成することは最も簡単なスタートですが、実行中のコ...

vue+elementuiは、共有箇条書きボックスの追加と変更の完全なコードを実装します。

目次1. 新しいII. 変更element-ui は、Ele.me のフロントエンド チームが開発者...

タブ切り替え効果を実現するJavaScript

この記事では、タブ切り替え効果を実現するためのJavaScriptの具体的なコードを参考までに紹介し...

ZFS とは何か? ZFS を使用する理由とその機能

ZFSの歴史Z ファイル システム (ZFS) は、2001 年に Matthew Ahrens と...

vue+django でファイルをダウンロードする例

目次1. 概要2. Django プロジェクト3. Vueプロジェクト1. 概要プロジェクトで、ダウ...

Linuxでディレクトリを効率的に切り替える方法

Linux でディレクトリを切り替えるとなると、誰もが間違いなくcdコマンドを思い浮かべるでしょう。...

N キロメートル以内のデータを検索する MySQL の簡単な例

地球の円周率と半径、検索ポイントの経度と緯度から、検索ポイントと検索データテーブル間の距離はNキロメ...

MySQL alter ignore構文の詳細な説明

今日仕事中に、ビジネス側から次のような質問をされました。テーブルがあり、一意のフィールドを追加する必...

現在のマウススライドの座標を取得するVue+openlayer5メソッド

序文: Vue プロジェクトで現在のマウスの座標を取得するにはどうすればよいでしょうか。ここで共有す...

Node.js を使用して png 画像に透明なピクセルがあるかどうかを判断する方法

背景PNG 画像は jpg 画像よりも多くのストレージスペースを占有しますが、PNG 画像の品質は大...