はじめに
KubernetesのPodがうまく動かない時の個人的なデバッグ方法についてまとめます。
これ以外にも思いついたら追記していきたいと思います。
kubectl get pod
Podの状態を確認します。
1kubectl get pod特に確認するのは下記の項目です。
STATUS: ステータスはどうなっているかREADY: コンテナは全て起動しているかRESTART: 再起動はしているか
kubectl describe pod
より詳しいPodの状態を確認します。
1kubectl describe pod {pod name}特に確認するのは下記の項目です。
State: どんなステータスかLast State: 前回はどんなステータスだったかReason: 前回はなぜコンテナが終了したのかExit Code: 終了した時のexit codeは何だったか
Restart Count: コンテナは何回再起動したかEvents: Podでどんなことが起きたか
Exit Codeは下記を参考にしてください。

Exit Codes in Docker and Kubernetes: The Complete Guide
Everything you need to know about exit codes used by container engines to indicate reasons for container termination.
kubectl logs {pod name}
Podのログを確認します。
1kubectl logs {pod name}標準出力のログであればこれで確認できます。
kubectl logs -p {pod name}
前回終了したPodのログを確認します。
1kubectl logs -p {pod name}Podが再起動した場合に、前回起動していたPodのログを確認できます。
kubectl logs {pod nama} -c {container name}
Pod内にコンテナが複数ある場合に特定のコンテナのログを確認します。
1kubectl logs {pod name} -c {container name}メインとなるコンテナ以外にもコンテナを実行している場合は何か情報が得られるかも知れません。例えば、istio-proxyを入れている場合はトラフィックのログを確認できます。
また、-pオプションと組み合わせて、前回のPodの特定のコンテナのログも確認できます。
1kubectl logs -p {pod name} -c {container name}kubectl exec {pod name} -- {command}
Podのコンテナでコマンドを実行してみます。
1kubectl exec {pod name} -- {command}特定のディレクトリを確認したり、標準出力に出していないログのファイルを確認したりと、コンテナ内の状態が想定通りか確認します。
また、下記のようにシェルを実行すれば、コンテナ内で自由にコマンドを実行できます。
1kubectl exec {pod name} -- /bin/bashkubectl describe quota
リソースクォータを設定している場合はリソースが足りない場合があるので、確認します。
1kubectl describe quotaprobeを外す
readinessProbeやlivenessProbeを設定している場合は、外すことでPodが起動し、何が起きているか調査できるようになることもあります。
参考
- Exit Codes in Containers & Kubernetes | Complete Guide | Komodor
- kubectlチートシート | Kubernetes
- PodとReplicationControllerのデバッグ | Kubernetes
- アプリケーションの自己観察とデバッグ | Kubernetes




