[JP] How to troubleshoot using the namespace of a container

Follow
Table of Contents

背景

問題をトラブルシューティングする場合、発生した問題と一致する再現環境が必要です。ただしコンテナー環境を利用する場合では、コンテナー内でツールとシェル環境が簡単に利用できない可能性があり再現環境の構築が困難になります。

手順

上記の課題を解決するために以下二つの手順があります。

Sidecar container を利用

問題を持つコンテナーが属するNamespaceで新しいsidecarコンテナーを実行すると、このsidecarコンテナーを用いてトラブルシュッティングすることができます。

sidecarコンテナーは、親コンテナーと同じVolumeをAttachしながら、同じNetworkとPIDのNamespaceを使用して起動できます。

  • トラブルシューティングするContainerのIDまたは名前を設定します。

ID=<container ID or name>

  • 同じNetwork、PIDのNamespaceとVolumeを使用しsidecarコンテナーを実行します。

docker run -it --net=container:$ID --pid=container:$ID --volumes-from=$ID alpine sh

  • これから問題があるcontainerやPodと同じコンテキスト内で、alpineコンテナーのコマンドでトラブルシュッティングをすることができます。

例えば、Podにネットワークの問題が発生した場合、Sidecar Containerに入り、コマンドを実行しながらネットワーク環境の設定を確認したりトラブルシュッティングすることができます。

必要に応じて、alpine containerを別のイメージを置き換えてください。

親コンテナーと同じVolumeをAttachできますが、親コンテナーのRead/Writeレイヤのアクセスはできません。同じファイルシステムをアクセスしたい場合は下記のnsenterの例をご参考ください。

nsenter を利用

nsenterコマンドを使用して、ノード上で利用可能なコマンドを使用できます。nsenterコマンドは、ほとんどのLinuxディストリビューションでデフォルト的にインストールされています。たとえば、Ubuntuでは、util-linuxパッケージによって提供されます。

  • トラブルシューティングするContainerのIDまたは名前を設定します。

ID=<container ID or name>

  • Container内の初めてのプロセス(PID 1)の番号を取得します。

PID=$(docker inspect --format '{{ .State.Pid }}' $ID)

  • nsenterを使ってContainer/Podの全種類のNamespaceで、ノード上のコマンドを実行することができます。

nsenter -a -t $PID <command>

例えば、ネットワークの問題をトラブルシュッティングする時、ノード上にあるコマンド、tcpdump、curl、digやmtrなどが使用可能になります。

-a パラメータは最近のnsenterで利用可能だが、もしこのパラメータが使えなかったら、単独のNamespaceに入るようにパラメータをしてしてください。詳細についてはnsenter --helpをご参考ください。

Was this article helpful?
0 out of 0 found this helpful

Comments

0 comments

Please sign in to leave a comment.