Debian 9でのDocker Swarm(CE)とのスティッキーセッション

前書き

Docker Swarmは、個々のサーバーをコンピューターのクラスターに変えます。スケーリング、高可用性、負荷分散を容易にします。Swarmロードバランサーはラウンドロビンロードバランシング戦略を実装します。これにより、複数のインスタンスで高可用性のセットアップを可能にするために何らかの形式のスティッキーセッションを必要とする(レガシー)ステートフルアプリケーションの正しい機能が妨げられる可能性があります。Docker Enterprise EditionはLayer-7スティッキーセッションをサポートしますが、このガイドでは、Dockerの無料(CE)バージョンに焦点を当てます。スティッキーセッションを実装するには、Traefikを使用します。

前提条件

  • プライベートネットワーキングが有効になっている同じサブネット内に、新しく展開および更新された少なくとも2つのDebian 9インスタンス
  • これらのインスタンスにインストールされているDocker CE
  • インスタンスは同じSwarmの一部であり、プライベートネットワークを介して相互に通信できる必要があります
  • DockerおよびDocker Swarmに関する予備知識
  • sudo権限を持つ非rootユーザー(オプションですが、rootユーザーを使用しないことを強くお勧めします)

このチュートリアルでは、プライベートIPアドレス192.168.0.100とを持つ2つのVultrインスタンスを使用します192.168.0.101。どちらもDocker Swarmマネージャーノードです(これは本番環境には理想的ではありませんが、このチュートリアルには十分です)。

私は誰

このチュートリアルでは、jwilder/whoamiDockerイメージをデモアプリケーションとして使用します。この単純なコンテナーは、応答するコンテナーの名前でREST呼び出しに応答するため、スティッキーセッションが機能しているかどうかを非常に簡単にテストできます。この画像は明らかにデモ目的でのみ使用され、独自のアプリケーションの画像に置き換える必要があります。

whoami-serviceは次のように構成されています。

sudo docker network create whoaminet -d overlay
sudo docker service create --name whoami-service --mode global --network whoaminet --publish "80:8000"  jwilder/whoami
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

続いcurlてでwhoami RESTエンドポイントを実行するとhttp://192.168.0.100/、作業中のDocker Swarmのラウンドロビンロードバランシングを確認できます。

curl http://192.168.0.100
I'm a6a8c9294fc3
curl http://192.168.0.100
I'm ae9d1763b4ad
curl http://192.168.0.100
I'm a6a8c9294fc3
curl http://192.168.0.100
I'm ae9d1763b4ad
curl http://192.168.0.100
I'm a6a8c9294fc3

接続を維持するように設計されており、Docker Swarmロードバランサーは新しい接続ごとに他のコンテナーにのみ切り替えるため、ChromeやFirefoxなどの最新のブラウザーでこれをテストする意味はありません。これをブラウザでテストする場合は、接続が閉じるまで少なくとも30秒待ってから、再度更新する必要があります。

Traefikのセットアップ

TraefikはDocker Swarmをネイティブでサポートし、オンザフライでコンテナーを検出して登録または登録解除でき、内部オーバーレイネットワーク経由でアプリケーションと通信します。Traefikは、アプリケーションの要求の処理を開始する前に、アプリケーションに関するいくつかの情報を必要とします。この情報は、Swarmサービスにラベルを追加することによってTraefikに提供されます。

sudo docker service update --label-add "traefik.docker.network=whoaminet" --label-add "traefik.port=8000" --label-add "traefik.frontend.rule=PathPrefix:/" --label-add "traefik.backend.loadbalancer.stickiness=true" whoami-service

次のリストは、各ラベルの意味を説明しています。

  • traefik.docker.network :Dockerオーバーレイネットワーク。Traefikがサービスと通信します。
  • traefik.port :サービスがリッスンしているポート(これは、公開されたポートではなく、内部的に公開されたポートです)
  • traefik.frontend.rulePathPrefix:/ コンテキストルート ' /'をこのサービスにバインドします
  • traefik.backend.loadbalancer.stickiness :このサービスのスティッキーセッションを有効にします

whoami-service必要なラベルが設定されたので、Traefikサービスをスウォームに追加できます。

sudo docker service create --name traefik -p8080:80 -p9090:8080 --mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock --mode=global --constraint 'node.role == manager' --network whoaminet traefik --docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG

次のリストに示すように、このコマンドは一度に多くのことを実行します。

  • --name traefik :新しいDockerサービスの名前はTraefikです
  • -p8080:80:ポートはすでにwhoami-serviceによって使用されているため、Traefikのポート80をポートごとに公開します808080
  • -p9090:8080 :Traefik独自のWebインターフェースを移植して公開 9090
  • --mount ... :Dockerソケットをコンテナーにマウントして、TraefikがホストのDockerランタイムにアクセスできるようにします
  • --global :高可用性の理由から、各マネージャーノードにTraefikコンテナーが必要です
  • --constraint 'node.role == manager':ワーカーノードはTraefikに必要な情報を提供できないため、マネージャーノードでのみTraefikを実行する必要があります。たとえばdocker service ls、ワーカーノードでは機能しないため、Traefikは実行されているサービスを検出することもできません。
  • --network whoaminet:Traefikをと同じネットワークにwhoami-service接続します。それ以外の場合は接続できません。以前、Traefikにこのネットワークを介してこのtraefik.docker.networkラベルでサービスに接続するように指示しました
  • traefik :このサービスに最新のTraefik Dockerイメージを使用するようdockerに指示する
  • --docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG:コマンドライン引数がTraefikに直接渡され、Docker Swarmモードで実行できるようになりました。DEBUGここではオプションですが、セットアップ中およびこのチュートリアルでは興味深いです

あとは、Debianファイアウォールで必要なポートを開くだけです。

sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --dport 9090 -j ACCEPT

使い方

Traefikが起動するとすぐに、Traefikが2つのwhoamiコンテナーを検出したことをログで確認できます。また、スティッキーセッションを処理するために使用するCookie名を出力しています。

time="2018-11-25T13:17:30Z" level=debug msg="Configuration received from provider docker: {\"backends\":{\"backend-whoami-service\":{\"servers\":{\"server-whoami-service-1-a179b2e38a607b1127e5537c2e614b05\":{\"url\":\"http://10.0.0.5:8000\",\"weight\":1},\"server-whoami-service-2-df8a622478a5a709fcb23c50e689b5b6\":{\"url\":\"http://10.0.0.4:8000\",\"weight\":1}},\"loadBalancer\":{\"method\":\"wrr\",\"stickiness\":{}}}},\"frontends\":{\"frontend-PathPrefix-0\":{\"entryPoints\":[\"http\"],\"backend\":\"backend-whoami-service\",\"routes\":{\"route-frontend-PathPrefix-0\":{\"rule\":\"PathPrefix:/\"}},\"passHostHeader\":true,\"priority\":0,\"basicAuth\":null}}}"
time="2018-11-25T13:17:30Z" level=debug msg="Wiring frontend frontend-PathPrefix-0 to entryPoint http"
time="2018-11-25T13:17:30Z" level=debug msg="Creating backend backend-whoami-service"
time="2018-11-25T13:17:30Z" level=debug msg="Adding TLSClientHeaders middleware for frontend frontend-PathPrefix-0"
time="2018-11-25T13:17:30Z" level=debug msg="Creating load-balancer wrr"
time="2018-11-25T13:17:30Z" level=debug msg="Sticky session with cookie _a49bc"
time="2018-11-25T13:17:30Z" level=debug msg="Creating server server-whoami-service-1-a179b2e38a607b1127e5537c2e614b05 at http://10.0.0.5:8000 with weight 1"
time="2018-11-25T13:17:30Z" level=debug msg="Creating server server-whoami-service-2-df8a622478a5a709fcb23c50e689b5b6 at http://10.0.0.4:8000 with weight 1"
time="2018-11-25T13:17:30Z" level=debug msg="Creating route route-frontend-PathPrefix-0 PathPrefix:/"
time="2018-11-25T13:17:30Z" level=info msg="Server configuration reloaded on :80"
time="2018-11-25T13:17:30Z" level=info msg="Server configuration reloaded on :8080"

カールするhttp://192.168.0.100:8080と、新しいCookie _a49bcが設定されていることがわかります。

curl -v http://192.168.0.100:8080
* About to connect() to 192.168.0.100 port 8080 (#0)
*   Trying 192.168.0.100...
* Connected to 192.168.0.100 (192.168.0.100) port 8080 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 192.168.0.100:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Length: 17
< Content-Type: text/plain; charset=utf-8
< Date: Sun, 25 Nov 2018 13:18:40 GMT
< Set-Cookie: _a49bc=http://10.0.0.5:8000; Path=/
<
I'm a6a8c9294fc3
* Connection #0 to host 192.168.0.100 left intact

以降の呼び出しで、このCookieをTraefikに送信すると、常に同じコンテナに転送されます。

curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3

Cookieには、Traefikが要求を送信する必要があるコンテナーの内部IPアドレスしか含まれていません。cookieの値をに変更するとhttp://10.0.0.4:8000、リクエストは他のコンテナに効果的に転送されます。CookieがTraefikに再送信されなかった場合、スティッキーセッションは機能せず、リクエストはアプリケーションのコンテナとTraefikコンテナの間で分散されます。

Debian 9上のDocker CEでレイヤー7スティッキーセッションをセットアップするために必要なのはこれだけです。



Leave a Comment

RancherOSにRancherサーバーをインストールする

RancherOSにRancherサーバーをインストールする

概要RancherOSは、システムサービスを実行するためのPID 0としてシステムDockerデーモンを実行する、信じられないほど軽量なオペレーティングシステム(わずか約60 MB)です。

Ubuntu 18.04にDocker CEをインストールする

Ubuntu 18.04にDocker CEをインストールする

はじめにDockerは、コンテナーとして実行されるプログラムをデプロイできるアプリケーションです。それは人気のあるGoプログラミング言語で書かれました

Ubuntu 14.04へのDockerのインストール

Ubuntu 14.04へのDockerのインストール

別のシステムを使用していますか?Dockerは、コンテナーとして実行されるプログラムをデプロイできるアプリケーションです。それは人気のある囲碁programminで書かれました

Dockerを使用してNode.jsアプリケーションをデプロイする

Dockerを使用してNode.jsアプリケーションをデプロイする

この記事では、Dockerコンテナー内にノードアプリケーションをデプロイする方法を示します。注:このチュートリアルでは、Dockerがインストールされており、

Alpine Linux 3.9.0でDocker Swarmを作成する

Alpine Linux 3.9.0でDocker Swarmを作成する

はじめにこのガイドでは、複数のAlpine Linux 3.9.0サーバーとPortainerを使用してDockerスウォームを作成および構成する方法について説明します。ご注意ください

CentOS 7にHarbourをインストールする方法

CentOS 7にHarbourをインストールする方法

Harbourは、Dockerイメージを格納および配布するオープンソースのエンタープライズクラスのレジストリサーバーです。HarbourはオープンソースのDockerディストリビューションを拡張しますb

CentOS 7でKubernetesを使ってみる

CentOS 7でKubernetesを使ってみる

Kubernetesは、サーバーのクラスタ全体でコンテナ化されたアプリケーションを管理するためにGoogleが開発したオープンソースのプラットフォームです。それは10年に基づいて構築され、

Ubuntu 16.04にRancherをインストールする

Ubuntu 16.04にRancherをインストールする

別のシステムを使用していますか?はじめにRancherは、コンテナーを実行し、プライベートコンテナーサービスを構築するためのオープンソースプラットフォームです。牧場主がベース

CentOS 7にKubeadmを使用してKubernetesをデプロイする

CentOS 7にKubeadmを使用してKubernetesをデプロイする

概要この記事は、kubernetesクラスターをkubeadmですぐに稼働できるようにすることを目的としています。このガイドでは、2台のサーバーを

CoreOSへのdocker-composeのインストール

CoreOSへのdocker-composeのインストール

この記事では、CoreOSにdocker-composeをインストールする方法について説明します。CoreOSでは、/ usr /フォルダーは不変なので、標準の/ usr / local / binパスは使用できません。

CentOS 7にRancherをインストールする

CentOS 7にRancherをインストールする

別のシステムを使用していますか?はじめにRancherは、コンテナーを実行し、プライベートコンテナーサービスを構築するためのオープンソースプラットフォームです。牧場主がベース

Docker-composeを使用してPHPアプリケーションをデプロイする

Docker-composeを使用してPHPアプリケーションをデプロイする

PHPアプリケーションは通常、Webサーバー、リレーショナルデータベースシステム、および言語インタープリター自体で構成されます。このチュートリアルでは、レバラギンになります

CentOS 7へのDockerのインストール

CentOS 7へのDockerのインストール

別のシステムを使用していますか?Dockerは、仮想コンテナー内でのソフトウェアのデプロイメントを可能にするアプリケーションです。それは囲碁プログラムで書かれました

Ubuntu 14.04でのLXCコンテナの安全なデプロイと管理

Ubuntu 14.04でのLXCコンテナの安全なデプロイと管理

LXCコンテナー(Linuxコンテナー)は、単一のホスト上で複数の分離されたLinuxシステムを実行するために使用できるLinuxのオペレーティングシステム機能です。テス

Ubuntu 16.04でDockerを介してSentryをセットアップする

Ubuntu 16.04でDockerを介してSentryをセットアップする

別のシステムを使用していますか?はじめにSentryは、エラー追跡のためのオープンソースのソリューションです。Sentryは例外やその他の有用なメッセージをあちこちで追跡します

Dockerの使用方法:最初のDockerコンテナーの作成

Dockerの使用方法:最初のDockerコンテナーの作成

このチュートリアルでは、Dockerの基本的な使い方について説明します。Dockerがすでにインストールされていると思います。このチュートリアルの手順は、

Dockerによる負荷分散

Dockerによる負荷分散

Webアプリケーションを実行する場合、通常、マルチスレッドを使用するようにソフトウェアを変換することなく、リソースを最大限に活用したいと思いますo

CoreOSで、独自のDockerレジストリをセットアップする

CoreOSで、独自のDockerレジストリをセットアップする

私たちは皆、アプリケーションコンテナーを作成、管理、および複数のマシンに分散するプラットフォームであるDockerを知っています。Docker Inc.が提供するサービスt

Dockerを使用してCentOS 7でSQL Server 2017(MS-SQL)を開始する

Dockerを使用してCentOS 7でSQL Server 2017(MS-SQL)を開始する

前提条件Dockerエンジン1.8以降。最低4GBのディスク容量。4GB以上のRAM。ステップ1. DockerをインストールするSQL-Serverをインストールするには、Docker mus

ヘルスケア2021における人工知能の影響

ヘルスケア2021における人工知能の影響

ヘルスケアにおけるAIは、過去数十年から大きな飛躍を遂げました。したがって、ヘルスケアにおけるAIの未来は、日々成長を続けています。

macOS Catalina 10.15.4サプリメントの更新により、解決するよりも多くの問題が発生しています

macOS Catalina 10.15.4サプリメントの更新により、解決するよりも多くの問題が発生しています

最近、Appleは問題を修正するための補足アップデートであるmacOS Catalina 10.15.4をリリースしましたが、このアップデートにより、Macマシンのブリックにつながる問題がさらに発生しているようです。詳細については、この記事をお読みください

原子力が必ずしも悪ではないことを証明する5つの例

原子力が必ずしも悪ではないことを証明する5つの例

原子力は、過去の出来事のために私たちが決して尊重しないことを常に軽蔑していますが、それは必ずしも悪ではありません。詳細については、投稿をお読みください。

AIはどのようにしてプロセス自動化を次のレベルに引き上げることができますか?

AIはどのようにしてプロセス自動化を次のレベルに引き上げることができますか?

これを読んで、人工知能が小規模企業の間でどのように人気を博しているか、そして人工知能がどのように成長し、競合他社に優位に立つ可能性を高めているかを理解してください。

ジャーナリングファイルシステムとは何ですか、そしてそれはどのように機能しますか?

ジャーナリングファイルシステムとは何ですか、そしてそれはどのように機能しますか?

私たちのコンピューターは、ジャーナリングファイルシステムと呼ばれる組織化された方法ですべてのデータを保存します。これは、検索を押すとすぐにコンピューターがファイルを検索して表示できるようにする効率的な方法です。https://wethegeek.com/?p = 94116&preview = true

ビッグデータは人工知能をどのように変えていますか?

ビッグデータは人工知能をどのように変えていますか?

ビッグデータと人工知能は流行語ですが、それらがどのように相互に関連しているか知っていますか?さて、この記事を最後まで読んで、同じことを知ってください。

LiteCartショッピングカートプラットフォームをUbuntu 16.04にインストールする方法

LiteCartショッピングカートプラットフォームをUbuntu 16.04にインストールする方法

LiteCartは、PHP、jQuery、およびHTML 5で記述された無料のオープンソースのショッピングカートプラットフォームです。シンプルで軽量、使いやすいeコマースソフトウォー

DebianでNFS共有をセットアップする

DebianでNFS共有をセットアップする

NFSはネットワークベースのファイルシステムであり、コンピューターはコンピューターネットワークを介してファイルにアクセスできます。このガイドでは、NFを介してフォルダーを公開する方法について説明します

Fedora 28にMatomo Analyticsをインストールする方法

Fedora 28にMatomo Analyticsをインストールする方法

別のシステムを使用していますか?Matomo(旧Piwik)は、Google Analyticsのオープンな代替手段であるオープンソースの分析プラットフォームです。Matomoのソースはoでホストされています

UbuntuでNginxをセットアップしてライブHLSビデオをストリーミングする

UbuntuでNginxをセットアップしてライブHLSビデオをストリーミングする

HTTPライブストリーミング(HLS)は、Apple Inc.によって実装された非常に堅牢なストリーミングビデオプロトコルです。HLSは、ファイアウォール、プロキシ、