Docker クロスサーバー通信オーバーレイソリューション (パート 1) Consul 単一インスタンス

Docker クロスサーバー通信オーバーレイソリューション (パート 1) Consul 単一インスタンス

シナリオ

会社のマイクロサービスがオンライン化しようとしています。マイクロサービスは Docker コンテナを使用してデプロイされます。同じホストに、すべてのサービスがデプロイされています。Nacos に登録されている IP と PORT は、Dockerfile で定義されたイントラネット IP とポート番号です。問題はないようです。ゲートウェイ経由で呼び出すこともできます。大きな前提があることに注意してください。

すべてのサービス コンテナーは同じホストにデプロイする必要があります。

サービス インスタンスが同じホストに展開されていない場合、たとえば、ゲートウェイ サービスがサーバー A にあり、サービス a がサーバー B にあり、両方とも Nacos (または他の登録センター) に登録されている場合、報告される IP アドレスはすべてイントラネットからのものです。外部からの要求が届くと、ゲートウェイは Nacos のサービス リストからサービス a の対応するイントラネット IP アドレスを見つけますが、呼び出しは失敗します。

ps: イントラネットはどのように接続できるのでしょうか...

タスク

マイクロサービスコンテナは異なるサーバー上に存在し、相互に呼び出すことができる

アイデア

  • 報告された IP はイントラネットからのものであるため、ホスト マシンの IP とポートを報告するように依頼します。
  • Dockerのホストネットワークモードの使用
  • シェル経由でコンテナをデプロイするときに、ホストIPと設定されたマッピングポート番号を取得するようにデプロイスクリプトを変更します。
  • Dockerネットワークを相互運用可能にする

分析する

以下は、上記の「アイデア」セクションに従って問題を説明するものです。

1. 公式ドキュメントと Github を確認した結果、2 つの解決策が見つかりました。

  • IPポートを固定し、ホストIPとポートを設定ファイルにハードコードする:解決したようだが、問題は水平方向に拡張できないこと - ほとんど使えない
  • 複数のネットワーク カード環境により間違った IP ポートが報告されないようにネットワーク カードを修正しました: 役に立たないです。コンテナーに入った後、 ifconfig内部ネットワーク カードがeth0loの 2 つしかないことを検出しました。対応するネットワーク カードの IP は内部ネットワーク IP です。それでも役に立たないです。

2. Dockerのホストネットワークモードを使用すると、今回報告されたIPは確かにホストIPですが、ポート番号が間違っていることがわかります... Javaパラメータを使用して、シェルを介してマップされるポート番号を渡すと、理論的には可能です。唯一の欠点は、 docker psポート番号を直接確認できなくなり、 docker inspect追加で使用しなければならないことです。

3. マッピングされたポート番号は取得できますが、ホストのネットワーク カード名が異なり、ハードコードされた後は柔軟性がありません。一部がeth0で一部がens33の場合はどうなるでしょうか。予測できない状況は他にもたくさんあります! ——使えるかもしれない

4. 成熟したDockerコンテナネットワークを介して共有しますが、パフォーマンスの低下は多少あります - 完全に利用可能です

コンセプトと選択

最も信頼性の高い方法は、Docker ネットワーク共有を使用することです。検索エンジンの助けを借りて、オーバーレイを使用して効果を実現することにしました。

Overlay の簡単な説明は次のとおりです。

コンテナが 2 つのホスト間で通信する場合、オーバーレイ ネットワーク モードを使用して通信を行います。ホストを使用する場合は、物理 IP アドレスを直接使用してホスト間通信を実現することもできます。オーバーレイは、IP アドレス 10.0.2.3 などの仮想ネットワークを作成します。このオーバーレイ ネットワーク モードでは、サービス ゲートウェイに類似したアドレスがあり、パケットを物理サーバーのアドレスに転送し、ルーティングとスイッチングを通じて最終的に別のサーバーの IP アドレスに到達します。

オーバーレイ ネットワークを実装するには、ネットワーク、エンドポイント、IP などのネットワーク ステータス情報を保存する KV データベースを導入する必要があります。 Consul、Etcd、ZooKeeperはすべてDockerでサポートされているKVデータベースです。

ここではConsulを使用しています。他のKVデータベースと比較して、Consulが提供するインターフェースは管理に便利なので、ここではOverlayを実装するためにConsulを使用しています。

各サーバーの Docker デーモンが独自の IP アドレスを Consul に登録することで、Docker イントラネットを共有できます。ここで共有されるイントラネットはオーバーレイ ネットワーク モードです。登録された Docker 環境内で同じオーバーレイ ネットワークを使用しているコンテナのみが相互に通信できます。

ps: 作成後、オーバーレイネットワークを使用しないクロスサーバーコンテナはpingできません

ちょっとしたテスト

シングルノード Consul は Docker イメージを使用してオーバーレイ ネットワークを実装します

環境説明

サーバーOSホストIP Dockerバージョンネットワークカード名
Ubuntu サーバー 18.04 LTS 192.168.87.133 18.09.6 ens33
Ubuntu サーバー 18.04 LTS 192.168.87.139 18.09.7 ens33
使用する Consul のバージョンは 1.5.2 で、これは現在 Docker Hub 上で最も脆弱性が小さいバージョンです。

このテスト環境はSystemdで管理されるLinuxディストリビューションに適しています

Consul は非公式の progrium/consul を使用しませんでした。主な理由は、このイメージが古すぎるためです。4 年前に脆弱性があった場合、間に合うように修正できなかったため、<hub.docker.com> にアクセスして、公式の落とし穴をすべて調査しました。 💔

予防

Dockerを実行する各ホストは異なるホスト名を持つ必要があります。

$ sudo hostnamectl set-hostname 新しいホスト名

同じホスト名の場合、同じ名前のホストDockerは相互に通信できなくなります。

実践

イメージを使用して133サーバー上でConsulを起動できるように準備します。まず、Dockerデーモンの起動パラメータを133サーバーを指すように構成します。

サーバー133と139のdocker.serviceをそれぞれ変更します。

$ ifconfig
#干渉するネットワーク カードは削除され、ネットワーク カードの名前は ens33 です
ens33: flags=4163<UP、BROADCAST、RUNNING、MULTICAST> mtu 1500
        inet 192.168.87.133 ネットマスク 255.255.255.0 ブロードキャスト 192.168.87.255
        inet6 fe80::20c:29ff:fe02:e00a プレフィックス長 64 スコープID 0x20<リンク>
        ether 00:0c:29:02:e0:0a txqueuelen 1000 (イーサネット)
        RXパケット 156739 バイト 233182466 (233.1 MB)
        RXエラー 0 ドロップ 0 オーバーラン 0 フレーム 0
        TX パケット 45173 バイト 2809606 (2.8 MB)
        TXエラー 0 ドロップ 0 オーバーラン 0 キャリア 0 衝突 0

$ vim /etc/docker/daemon.json 

保存して終了します。

  • cluster-store : 設定された Consul のリーダー アドレス。単一のユニットは直接書き込むことができます。他のソフトウェアはプロトコルに注意する必要があります。
  • cluster-advertise : リスニングネットワークカードとポートを指定し、サブスクリプションメッセージを受信するためのIP:PORTも指定します。

別の方法としては、次に示すように、docker.service を直接変更します。

$ cd /etc/systemd/system/multi-user.target.wants
$ sudo vim docker.service

ExecStart=という単語を見つけて、この行の末尾に次のコードを追加します。

--cluster-store=consul://192.168.87.133:8500 --cluster-advertise=ens33:2375

効果は以下のとおりです。

操作効果は上記の方法と一致している

次にコマンドを実行してdockerサービスを再起動します。他のサーバーの操作方法も同様です。ネットワークカードの名前に注意してください。

$ sudo systemctl daemon-reload && sudo systemctl dockerを再起動します

133サーバーでConsulサービスを開始する

docker run -d --network ホスト -h consul --name=consul --restart=always -e CONSUL_BIND_INTERFACE=ens33 consul:1.5.2

ホストモードを使用する理由は、一部のポートがマップされないのを防ぐためです。Consulに外部ネットワークカードを認識させる唯一の方法はホストモードです。以下は非ホスト方式です。

$ docker run -di -h consul -p 8500:8500 --name=consul consul:1.5.2

Dockerオーバーレイ共有ネットワークを作成する

$ docker ネットワーク作成 -d オーバーレイ my_overlay

通常のネットワークを作成する場合との違いは、オーバーレイモードネットワークが指定されていることです。 -d --driverと書くこともできます。

Consulのページにアクセスしてください。私の場合は192.168.87.133:8500です。

設定はキー/値で行います。

docker -> ノードをクリック

上記の2つのノードは、2つのdockerデーモンによって登録された値です。

テスト

先ほど作成したオーバーレイネットワークを使用して、2つのサーバーに2つの新しい Centos コンテナを作成します。

133 サーバー

$ docker run -di --network my_overlay --name mycentos1 centos:7

139 台のサーバー

$ docker run -di --network my_overlay --name mycentos2 centos:7

--net--networkと表記されます。 --で始まるものは省略できます=

133サーバー上のmycentos1コンテナのIPを表示する

$ docker 検査 -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" mycentos1
10.0.1.2

139サーバー上のmycentos2コンテナのIPを表示する

$ docker 検査 -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" mycentos2
10.0.1.3

サーバー133からサーバー139のmycentos2のイントラネットIPにそれぞれpingを実行します。

Pingは逆の場合と同じですが、外部からアクセスすることはできず、同じオーバーレイネットワーク上のコンテナを介してアクセスします。信じられない場合は、次のように試してみましょう。

133 サーバー

$ docker exec -it mycentos1 bash
# 10.0.1.3にpingする

アクセスは成功し、パケット損失はなく、逆も同様です。スペースが限られているため、テストは行いません。

これは、少なくとも現在のサービスが実際に相互接続されていることを示しています。次の記事では、本番環境向けのクラスタリング方法を開発します。

引用

テクニカルトーク | Docker オーバーレイ ネットワークの実装

Dockerコンテナオーバーレイネットワーク

Docker クロスホスト ネットワーク - オーバーレイ

22 日目: Docker ネットワークの紹介 (パート 3)

領事KV

Docker ハブ 領事

Github docker-library/ドキュメント

Github ドッカーコンスル

この記事はHellxzによる学習・実践記事です。BubukouやMamiなどのサードパーティのクローラーWebサイトのクロールは禁止されています。

これで、Docker クロスサーバー通信オーバーレイ ソリューション (パート 1) - Consul 単一インスタンスに関するこの記事は終了です。関連する Docker オーバーレイ ネットワーク コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Dockerにおけるオーバーレイネットワークの詳細な説明
  • Docker クロスホストネットワーク (オーバーレイ) の実装
  • Dockerオーバーレイネットワークの構築方法
  • Docker でオーバーレイ ネットワークの実験環境を構築する

<<:  HTML(CSSスタイル仕様)を読む必要があります

>>:  CSSは6つの適応型2列レイアウト方法を実装しています

推薦する

Vue プロジェクトのパッケージ化、マージ、圧縮により、Web ページの応答速度を最適化します。

目次序文1. リクエスト内容が大きすぎる解決: CDN の紹介リクエストリソースを圧縮する1. HT...

Python ベースの MySQL レプリケーション ツールの詳細な説明

目次1. はじめに2回目の練習2.1 インストールと設定2.2 コアクラスの紹介2.3 使い方は? ...

Vue+SpringBoot で Alipay サンドボックス決済を実装するためのサンプルコード

まず、Alipay サンドボックスから一連のものをダウンロードします。多くのブログで取り上げられてお...

面接官はReactのライフサイクルについてよく質問します

ReactライフサイクルReactのライフサイクルを理解するのに役立つ2つの図React ライフサイ...

Vueフォームバインディングとコンポーネントの詳細な説明

目次1. 双方向データバインディングとは1. データの双方向バインディングを実装する必要があるのはな...

MySQLクエリ条件のnot inとinの違いと理由

まずSQLを書く SELECT DISTINCT from_id タラから cod.from_id ...

VMware ESXi のインストールと使用記録(ダウンロード付き)

目次1. ESXiをインストールする2. ESXiをセットアップする3. ESXiを起動するESXi...

MySQL が大規模トランザクションを避けるべき理由とその解決方法

何が大問題ですか?長時間実行され、長時間コミットされないトランザクションは、大規模トランザクションと...

モバイルインターネット時代: レスポンシブウェブデザインが一般的なトレンドに

今はモバイルインターネットが急速に発展している時代です。スマートフォンやタブレットはますます普及し、...

Tomcat コアコンポーネントとアプリケーションアーキテクチャの詳細な説明

目次Web コンテナとは何ですか? HTTP の性質HTTP リクエスト応答の例クッキーとセッション...

vue3のテレポート瞬間移動機能の使い方を詳しく解説

vue3テレポート瞬間移動機能の使用は参考用です。具体的な内容は次のとおりです。テレポートは通常、瞬...

音楽プレーヤーアプリ(アプリケーションソフトウェア)の分析と再設計 美しい音楽プレーヤーインターフェースの設計方法

無線インタラクションにずっと興味があったので、今回は実践してみようと思います〜この分析と評価は iO...

MySQL 結合クエリ構文と例

接続クエリ:これは、2 つのクエリ (またはテーブル) の各行をペアで接続した結果です。つまり、1 ...

デザイナーの「職業病」について

デザイナーは世界で最も繊細で感情的な人々だと私はいつも感じています。私がこう言うときに優越感を感じる...

素晴らしい CSS ナビゲーション バーの下線効果

中国初のカッター github.com/chokcocoまず、ここに画像があります。純粋な CSS ...