2017-02-23 18 views
1

数日前、私はドッカー構成し、ポートマッピングとカフカドッカーコンテナを設定しようとしたと私は完全には理解していない興味深い振る舞いを発見:なぜカフカブローカーはそれ自体に接続しますか?

カフカのブローカーは、自身に接続するように思えます。どうして ?

私のセットアップは、次のとおりです。

  • のUbuntu 14.04、ドッカー1.13.1、ポート9092上の1.5.2
  • カフカ0.10リッスンをドッカーは、作曲、このポートは、コンテナで公開されています。ドッカー作曲で
  • 私はローカルポートにコンテナポート9092からポートマッピングを持っている4005
  • ブローカーは私から見えるはずですので、私は私のドッカーホスト・マシンとadvertised.listenersで作曲からローカルポートのホスト名(docker-host:4005)を構成し企業ネットワーク。 、advertised.listenersにポートとホスト名の様々な組み合わせを試した後

    Topic metadata fetch included errors: {topic_name=LEADER_NOT_AVAILABLE}

    :これにより

は私が/カフカからフェッチ/データを送信しようとすると、すべての試みは、で終わる設定しました私は唯一の組み合わせがlocalhost:9092であることを発見しました。ホスト名またはポートを変更しようとすると、上記のエラーが発生しました。
これは、Kafkaがadvertised.listenersで設定されたアドレスに接続しようとしていると思いました。これは、トピックのメタデータと何らかの形で関連しています。私はドッカー容器内だから、

  • リダイレクトトラフィック
    sed -r -i "s/#(listeners)=(.*)/\1=PLAINTEXT:\/\/0.0.0.0:4005/g" $KAFKA_HOME/config/server.properties(宣伝正確として)すべてのインターフェイスとポートをリッスンするように
    echo "127.0.0.1 $ADVERTISED_HOST" >> /etc/hosts
  • のconfigureカフカをループバックする「ドッキングウィンドウ・ホスト」へ
  • "ドッカーホスト"と外部ポートを広告する
    sed -r -i "s/#(advertised.listeners)=(.*)/\1=PLAINTEXT:\/\/$ADVERTISED_HOST:4005/g" $KAFKA_HOME/config/server.properties

そして今は魅力的です。

私はまだ理解していないしかし:

  1. なぜカフカブローカーはadvertised.listenersで設定されたアドレスを経由して自分自身に接続する必要があるのでしょうか?
  2. これを無効にする方法、または少なくとも「リスナー」プロパティ(デフォルトのKafkaポート)からのアドレスを使用するように設定する方法はありますか?

UPD 価値に言及するが、動作しない設定を以下:カフカは0.0.0.0:9092をリッスンし、アドバタイズされたリスナーがdocker-host:4005に設定されています。
この場合、消費者または生産者がカフカに接続するたびに、LEADER_NOT_AVAILABLEを受信します。 状態SYN_SENTのdocker-host:4005に対するnetstat(コンテナ内)の接続もあります。

UPD 2 はカフカと同様の問題があるように見えるが、AWS内部hereが記載されています。
私の場合、異なるカフカポートを使いたいという違いがあります。

UPD 3 [OK]を、セットアップが動作しません最初UPD段落で述べた理由である - UFW、ホストマシンを経由して自身にドッキングウィンドウコンテナから行くいくつかの理由がブロックトラフィック用。

答えて

0

なぜカフカブローカーは、advertised.listenersに設定された のアドレスで自分自身に接続する必要があるのですか?

Kafkaブローカーは、最初にクライアントによって接続されたときに、クライアントが将来ブローカーと通信するために使用する予定のアドレスを返信します。これは、advertised.listenersプロパティで設定されているものです。このプロパティを設定しない場合は、代わりにリスナーの値が使用されます(2番目の質問に答えます)。

したがって、リモートクライアントがyourhost:9092に接続し、ポートを転送したためにKafkaブローカーに接続すると、ブローカーは「あなたはlocalhost:9092で私に連絡できます」と応答し、クライアントそこに次のパケットを送信します。 ここでメタデータは実際には関連していません。 私の考える解決策は、Kafkaにローカルインターフェイスでリッスンし、社内ネットワークの誰かが接続するホストにadvertised.listenersを設定することです。 ブローカーが自分自身に接続する必要があるかどうかは100%わかりません。あなたの設定は/ etc/hostsファイルに外部ホスト名を入力しなくてもうまくいくと思います。

「リスナー」プロパティ(デフォルトのカフカポート)のアドレス を使用するように設定する方法はありますか?

はそれを(私の更新の質問を参照してください)私は別のアドレスとポートを構成ししかしとき、

+0

こんにちはSönkeの上に、あなたの答えのおかげで、あなたは右の「リスナー」と「advertised.listener」の意味について見ますまだ動作しません。 – Grigory

関連する問題