はじめに
kubernetesクラスター上で動作しているPodのデバッグ方法としてkubectl exec
を用いる方法があります。
ですがこのコマンドはデバッグ対象のPodのコンテナ上で実行するため、kubectl exec
ではコンテナにデバッグを行うための環境がなかった場合、デバッグが難しくなる問題 があります。
kubernetesではこのような問題を回避するためにkubectl debug pod
というコマンドがありますので紹介をしてみたいと思います。
kubectl execとの違い
まずkubetl exec
とkubectl debug pod
との違いを簡単に説明したいと思います。
kubectl execの仕組み
簡潔にまとめると、Pod内のコンテナでコマンドを実行する動作 になります。
コンテナ内で使えるコマンドのみ使用することができます。
例としてimageにnginx:latest
のコンテナが動作しているPodがあるとします。
このコンテナではnginxに関連するコマンド(例:nginx -V
など)を使用することができますが、ps
等のコマンドはインストールしなければ使用することができません。
なのでデバッグの際にps
をkubectl exec
コマンドで見ようとしても見れないのです。
$ kubectl exec -n test-nginx -it test-nginx-b-78fbdc67f4-74c8v -- ps -aux
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ps": executable file not found in $PATH: unknown
command terminated with exit code 126
コンテナ内で使用できるコマンドであれば確認は可能です。
$ kubectl exec -n test-nginx -it test-nginx-b-78fbdc67f4-74c8v -- date
Sun Feb 27 17:30:17 UTC 2022
kubectl debug podの仕組み
ではkubectl debug pod
は何をするのかというと、エフェメラルコンテナという一時的に使用するコンテナを追加してシェルに入るコマンド になります。
まず稼働中として、コンテナが一つ動いているPodがあるとします。
このコンテナの目的はアプリケーションを動かすことなので、アプリケーションの動作に関係ないコマンドはインストールされていません。
そのためtop
を使用したい!となった時にはコンテナ内のシェルに入り、apt
等でtopコマンドをインストールする必要がありますが、
もしセキュリティの観点でPodが設定した外部と通信できない仕組みにしていたりなど、外部からコマンドをインストールすることができない場合があります。
このような問題の解決のためにkubectl debug pod
でエフェメラルコンテナを作成します。
エフェメラルコンテナはこのように、特定のPod内にコンテナを追加します。
このようにすることで以下のような嬉しい点があります。
- アプリケーションのコンテナを汚さない
- busyboxなど、任意のimageを使用できる
特にbusyboxが使えるようになるのは嬉しいですね。
kubectl debug podの使い方
まだ正式な機能ではないため、実際にクラスター上で使用するときには別途作業が必要になるので忘れないようにしましょう。
kubernetesの公式ドキュメントから引用ですが、このように使用します。
$ kubectl debug -it ephemeral-demo --image=busybox --target=ephemeral-demo
If you don't see a command prompt, try pressing enter.
/ #
このようにすることで、ephemeral-demo
というpod内にbusybox
のコンテナを起動し、shellを呼び出すことができます。
--container [コンテナ名]
を指定することでエフェメラルコンテナの名前を指定することができ、
--target [コンテナ名]
を指定することで、プロセス名前空間を共有するコンテナを指定できます。
ここで気づくと思いますが、kubectl debug pod
はエフェメラルコンテナの作成とシェルの実行なので、動作の一部にkubectl exec
と同じことをおこなっていますね。
まとめ
kubectl debug pod
について調べてみました。
このコマンドはエフェメラルコンテナと呼ばれる一時的なコンテナを作成するものであり、
kubectl debug pod
とkubectl exec
との違いは、コマンドを呼び出す場所の違いでした。
kubectl exec
は任意のPodのコンテナでコマンドを実行するようになっており↓
kubectl debug pod
はエフェメラルコンテナの作成と、作成したコンテナでコマンドを実行するようになっていました。
最近ではコンテナのセキュリティ対策としてshellが実行できないようにする、といったようなこれまでのデバッグができなくなってしまう対策もありますが、
このようなデバッグの方法を覚えておくことで安心して対応して対応できますね。