はじめに
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が実行できないようにする、といったようなこれまでのデバッグができなくなってしまう対策もありますが、
このようなデバッグの方法を覚えておくことで安心して対応して対応できますね。