CLOSE_WAIT は Kubernetes ノードには表示されません。

CLOSE_WAIT は Kubernetes ノードには表示されません。

エラーのデバッグ中に、(コンテナ内の)1つのプロセスが状態への接続がtcp: out of memoryたくさんあることがわかりました。CLOSE_WAIT08/proc/XXX/net/tcp

ただし、netstat と ss の両方がこれらの漏洩した接続を表示しません。

133: 0E03540A: 9D9C 804CC2AD: 01BB 08 00000000: 00059D7A 00: 00000000 00000000 0 0 316215 1 ffff8f6
0 0 A:83 16 80A7E940:01BB 08 00000000:00000000 00:00000000 00000000 0 0 255647 1 ffff8f67c9592600 20 4 1 10 -1
135: 0E03540A: 8874 808C7D4A: 01BB 08 00000000: 00037EED 00: 00000000 00000000 0 0 33160 3 -1 13 6
: 0E03540A:E226 804CC2AD:01BB 08 00000000:0005E30B 00:00000000 00000000 0 0 215782 1 ffff8f67bd1edf00 20 4 0 10 -1
137: 0E03540A: DAEC 804CC2AD: 01BB 08 00000000: 0005B41A 00:00 00 1 ffff8f6 7daf9af8 0 20 4 0 10 -1 138: 0E03540A
: 9AEA 8005FB8E: 01BB 08 00000000: 000D6360 00 :00000000 00000000 0 0 243082 1 ffff8f67db637200 20 4 30 10 -1
140: 0E03540A:BAE4 800FB000 00:00000000 00000000 0 0 245062 1 ffff8f67640f8980 20 4 1 10 -1
141: 0E03540A: 9754 804CC2AD: 01BB 08 00000000: 00003186 00:00000000 00000000 0 0 298890 1 ffff8f676e1a5f00 20 4 1 10 -1
142: 0E03 0000000: 000658C9 0 0:00000000 00000000 0 0 299343 1 ffff8f68dcef5580 20 4 0 10 -1
143 : 0E03540A: CB24 804CC2AD: 01BB 08 00000000:0005BBB4 00:00000000 00000000 0 0 316285 1 ffff8f677201930 1
82 04 80A7E940 :01BB 08 00 000000:0005DD3A 00:00000000 00000000 0 0 217390 1 ffff8f67dbc20000 20 4 0 10 - 1
145: 0E03540A: 8BC8 80016642: 01BB 08 00000000: 00059847 00: 00000000 00000000 0 0 27508 10 -1
146: 0E 03540A: C612 800 5FB8E:01BB 08 00000000:0003EC48 00:00000000 00000000 0 0 252281 1 ffff8f67cf014280 20 4 1 10-1

netstatがこれらの接続を表示しないのはなぜですか?各プロセスの詳細を掘り下げることなくどのようにこれを達成できますか?

答え1

ホストでこれを見ると、コンテナのネットワーク名前空間ではなく初期ネットワーク名前空間にあります。これらの接続または状態は、初期ネットワーク名前空間のネットワークスタックで処理されないため、表示できません。プロセスディレクトリ内のアイテムを追跡すると、そのアイテムが/procプロセスの観点から表示されることがあります...時には関連する名前空間情報が表示されることがありますが、ツールはこの情報を使用することを意図していません。

したがって、まず調査中のプロセスのネットワーク名前空間に切り替える必要があります。

とても簡単です(使用ユーザー):

nsenter -t XXX --net -- ss -tn

または、プロセスを探します(コンテナではなく初期pidネームスペースに示されているように)。

nsenter -t XXX --net -- ss -tnp state CLOSE-WAIT

通常、人々はプロセスではなくPod(または他の技術のコンテナ)に基づいて検索します。さまざまなコンテナテクノロジを使用すると、コンテナプロセス名(LXClxc-info -Hp -n containernameやDockerdocker inspect --format '{{.State.Pid}}' containernameなど)からPIDを取得できますが、バックエンドがDockerでない場合にKubernetesがこの情報を提供できるかどうかはわかりません。

また、一部のツールではこれより少し難しいです。たとえば、新しいネットワーク名前空間を反映/sysするためにインターフェイスビューを再インストールする必要がある/sys/class/netためです。今すぐ変更する必要がある2つの名前空間があります。ターゲットプロセスの名前空間と一時インストール名前空間(初期コードを壊さないようにしたり、必須コマンドがない可能性があるターゲットを使用したくない場合)。とにかくss、コマンドは純粋にソケットでのみ実行され、これは必要ありません。

たとえば、未使用のbrctl showコマンドが正しく機能するには、次のコマンドが必要です。

nsenter -t XXX --net -- unshare --mount -- sh -c 'mount -t sysfs sysfs /sys; brctl show'

関連情報