【k8s】デバッグに役立つkubectlコマンド ~ kubectl debug ~

◾️はじめに

https://dk521123.hatenablog.com/entry/2022/01/12/110555

の続き。

 最近、バグ調査のために、kubectlコマンドを使っている。
デバッグに役立つコマンドとして以下「【0】デバッグに役立つkubectlコマンド」として
あげてみた。

その中で「kubectl debug」コマンドが、今回のテーマ。

目次

【0】デバッグに役立つkubectlコマンド
【1】kubectl debugコマンド
 1)特徴
【2】構文
 1)オプション
【3】使用上の注意
 1)本番環境で kubectl debug を使いたい場合の対応案
【4】サンプル
 例1:curlコマンドを打てるエフェメラルコンテナを作成する場合
 例2:curlコマンドを打って、終了する場合

【0】デバッグに役立つkubectlコマンド

* もっとあるかもしれないけど、ひとまず使って役立ったのは以下。
Commands Explanation
kubectl get/describe Podなどの状態などの情報を取得
kubectl debug デバッグ用のサイドカーコンテナを立ち上げる(★今回のテーマ)
kubectl exec コンテナ内に入る
kubectl cp コンテナ-Client内のファイル移動
kubectl logs コンテナのログを取得
* 以下の公式ドキュメントも参照するといいかも

https://kubernetes.io/ja/docs/tasks/debug/debug-cluster/kubectl-node-debug/
https://kubernetes.io/ja/docs/tasks/debug/debug-application/debug-running-pod/

【1】kubectl debugコマンド

* デバッグ用の一時的なコンテナを立ち上げるコマンド
* From Kubernetes v1.25 stable

cf. エフェメラルコンテナ(Ephemeral Container) = 一時的なコンテナ

1)特徴

* デバッグ対象のPodと同じネットワーク、同じボリュームを
 それぞれのローカルネットワーク、ローカルボリュームとして参照可能

【2】構文

* 公式ドキュメントは以下。

https://kubernetes.io/docs/reference/kubectl/generated/kubectl_debug/

# kubectl debug --stdin --tty <デバッグ対象のPod名> -n <namespace> ¥
# --image=<image_id> --target=<デバッグ対象のコンテナ名>

# -i/--interactive: 
# kubectl debug -it <デバッグ対象のPod名> -n <namespace> --image=<image_id>
kubectl debug -it demo-app -n demo --image=busybox:1.28

# kubectl debug -it <デバッグ対象のPod名> -n <namespace> --image=<image_id> -- <打ちたいコマンド>
kubectl debug demo-app -it -n demo --image=curlimages/curl -- curl localhost:8080

1)オプション

Options Explanation
--attach=true/false 新しいコンテナにアタッチする・しない(デフォルトはする)
--share-processes Pod内のコンテナが、Pod内の他のコンテナのプロセスを参照
--copy-to <Copy先のPod名> 対象Podをコピーしてアタッチする

【3】使用上の注意

(自分の理解としては)
デフォルトは、デバッグ用の別Pod名を一時的に立ち上げるものじゃない
 => 内部的には対象Podのspecを書き換えている
 => デフォルトだとアタッチされて、デタッチもできない(kubectl delete podするしかない)
 => 何回も kubectl debug しまくってたら、どんどんエフェメラルコンテナがアタッチされ
  kubectl delete pod で対応するしか無くなる(本番環境ではやらない方がいい)

複数回打った後のkubectl execコマンド出力例

# 「debugger-xxxx (ephem)」ってコマンド回数分だけ表示される、、、
$ kubectl exec -it demo-app -n demo -- bash
Defaulted container "xxxxx" out of: xxxxx, debugger-xxxx (ephem), debugger-xxxx (ephem), ...
debugger-xxxx (ephem), debugger-xxxx (ephem), debugger-xxxx (ephem)

1)本番環境で kubectl debug を使いたい場合の対応案

# --copy-to を使う
kubectl debug -it demo-app --copy-to demo-app-for-debug --share-processes --image alpine -- sh

【4】サンプル

例1:curlコマンドを打てるエフェメラルコンテナを作成する場合

kubectl debug demo-app -it --image=radial/busyboxplus:curl

# この後、エフェメラルコンテナにログインした状態になる
curl localhost:8080
curl localhost:8080
...

補足:--image=radial/busyboxplus:curl
https://hub.docker.com/layers/radial/busyboxplus/curl/images/a68c05ab1112fd90ad7b14985a48520e9d26dbbe00cb9c09aa79fdc0ef46b372

例2:curlコマンドを打って、終了する場合

kubectl debug demo-app -it -n demo --image=curlimages/curl -- curl localhost:8080

関連記事

Kubernetes ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2020/04/27/224624
KubernetesWindows / 環境構築編 ~
https://dk521123.hatenablog.com/entry/2020/05/01/000000
Kubernetes ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/05/04/013529
kubectlコマンド ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/01/12/110555
デバッグに役立つkubectlコマンド ~ kubectl logs ~
https://dk521123.hatenablog.com/entry/2025/03/15/231209
デバッグに役立つkubectlコマンド ~ kubectl get/describe/api-resources ~
https://dk521123.hatenablog.com/entry/2025/03/21/151944
Kubernetes ~ ConfigMap ~
https://dk521123.hatenablog.com/entry/2025/03/11/000418
Kubernetes ~ トラブルシュート方法 ~
https://dk521123.hatenablog.com/entry/2025/02/13/233043
screenコマンド
https://dk521123.hatenablog.com/entry/2024/01/03/015517
tmuxコマンド ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/11/13/020744
tmuxコマンド ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2024/01/08/171950
watchコマンド
https://dk521123.hatenablog.com/entry/2024/03/24/232633