Dockerコンテナーから帯域幅をカウントする


13

Dockerコンテナからの帯域幅を追跡する方法を見つけようとしています。

通常--uid-owner、特定のユーザーの帯域幅使用量を追跡するためのマークとして使用します。ただし、Dockerコンテナー内のユーザー--uid-ownerが機能していないため、すべてのプロセスを実行してもです。を使用する代わりに--uid-owner、Dockerが作成する仮想イーサネットデバイスから送信されるすべてのパケットを追跡するだけでした。

しかし、これは結局何もしませんでした。何をしようとしても、パケットはキャッチされません。

まったくの絶望から、私はすべてのチェーンにルールを置くだけでしたが、結果もありませんでした。

Chain PREROUTING (policy ACCEPT 3041 packets, 7849454 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  veth5a36 any     anywhere             anywhere             MARK set 0x1

Chain INPUT (policy ACCEPT 273 packets, 23305 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  veth5a36 any     anywhere             anywhere             MARK set 0x1

Chain FORWARD (policy ACCEPT 2750 packets, 7821109 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  any    veth5a36  anywhere             anywhere             MARK set 0x1
2           0        0 MARK       tcp  --  veth5a36 any     anywhere             anywhere             MARK set 0x1
3           0        0            all  --  veth5a36 eth0    anywhere             anywhere             mark match 0x1

Chain OUTPUT (policy ACCEPT 293 packets, 80020 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  any    veth5a36  anywhere             anywhere             MARK set 0x1

Chain POSTROUTING (policy ACCEPT 3043 packets, 7901129 bytes)
num      pkts      bytes target     prot opt in     out     source               destination
1           0        0 MARK       tcp  --  any    veth5a36  anywhere             anywhere             MARK set 0x1

ドッカーコンテナーからパッケージを正常にマークする方法を教えてもらえますか?できれば使用します--uid-ownerが、この時点で何でも取ります:)

回答:


4

問題は名前空間に関連しています。Dockerはこれらを使用してリソースを分離します。つまり、ホストの合計にはカウントされません。

iptablesホストで実行する場合、基本的にはホストの名前空間のみを調べており、関心のあるパケットはコンテナの名前空間に集計されます。この問題を回避ip netnsするには、ホストのiptablesを実行しますが、コンテナーのネットワーク名前空間で使用できます。

まず、ip netnsやや反感のある直感的なインターフェイスがあります。既存のプロセス(この場合はコンテナ)の名前空間にアタッチするには/var/run/netns/、プロセスの名前空間へのリンクを作成する必要があります。

# ln -sf /proc/`docker inspect -f '{{ .State.Pid }}' YOUR_CONTAINER`/ns/net /var/run/netns/SOME_NAME

(必要になる場合がありますmkdir /var/run/netns

これで、コンテナの名前空間でiptablesを自由に実行できます。

# ip netns exec SOME_NAME iptables -L -nv

これにより、コンテナー内にiptablesのルールセットが出力されることに注意してください。これはおそらく空です。

現在、ユーザーごとのカウンターを保持するためだけに--uid-ownerを使用している場合は、チェーンカウンターはコンテナーにのみ適用され、十分なはずなので、もう必要ありません。

最後に、クリーンアップできます/var/run/netns

ユーザーごとに複数のコンテナ

ユーザーごとに複数のコンテナがあり、それらを一緒に集計する場合は、でコンテナを起動し--net=container:OTHER_CONTAINER_FROM_USERて、名前空間をマージできます。

これには、開いているポートを含むネットワークスタックのすべての側面をマージするという欠点があるため、同じユーザーが同じポートでリッスンする2つのコンテナーを使用できません。

これが禁止的な制限である場合、コンテナを個別に集計し、後でuidに基づいてグループ化できます。

この問題に関する詳細は、こちらをご覧ください


0

正確にはあなたが尋ねたものではありませんが、私はそれが仕事を成し遂げると思います。

Dockerブログからの引用:

インターフェイスレベルのカウンター

各コンテナには仮想イーサネットインターフェイスがあるため、このインターフェイスのTXおよびRXカウンターを直接確認することをお勧めします。

[...]

ただし、現時点では、コンテナ内からメトリックを確認するのが最善の方法です。私は、コンテナ内で特別なエージェントを実行すること、またはそのようなことについて話していません。ホスト環境から実行可能ファイルを実行しますが、コンテナのネットワーク名前空間内で実行します。

コマンドの正確な形式は次のとおりです。

ip netns exec <nsname> <command...>

例えば:

ip netns exec mycontainer netstat -i


2
私はあなたの答えを大幅に再フォーマットしました。将来の答えで同様のスタイルでリソースを引用して、より役立つようにしてみてください。
フエロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.