##fluentdにログを転送できない!
docker内で動作するfluentdに対して別のfluentdからログを転送したいのだがどうもうまくいかない。
転送元のログには下記のメッセージ。
「no nodes are available」
##fluentdのハートビート
どうもfluentdは転送先のサーバーの死活監視にハートビートと呼ぶUDPパケットを送っているらしい。
エラーメッセージからも転送先サーバーを確認できていないようなので、どうもこのあたりが怪しそうだとあたりがついた。
##Dockerのポートを確認
「sudo docker ps」でポートを確認してみると・・・
0.0.0.0:24224->24224/tcp
と表示が。
あ、tcpに限定されているっぽい。
どうもdockerは
docker run -p 24224:24224
のようにしてrunするとtcpしかマッピングされないようだ。
##udpを開くには?
こんな感じにtcp/udpを指定できるらしい。
docker run -p 24224:24224/tcp -p 24224:24224/udp
これで動かしたところしっかりdocker内のfluentdにログを転送できました。
##2014/9/18追記 dockerコンテナ間でのfluentd転送
転送元がdockerコンテナの場合、out_forwardにdockerのホストのIPを指定すると、転送先のudpポートを開いても転送されませんでした。
dockerコンテナのIPを指定した場合は転送されます。dockerの仮想ブリッジを経由することでハートビートパケットの応答パケットが転送元に届かなくなるためと思われます。
fluentdのout_forwardにheartbeat_type tcpを指定することで、ハートビートをtcpに変更することができます。
これを使うことで、転送先をホストのIPに指定しても転送できました。
パフォーマンスにいくらか影響を与えそうではありますが、udpを自由に開けない環境ではheartbeat_typeでtcpを使うのが簡単そうです。