Kubernetes デバッグ時関連のコマンド集

## 概要

K8SでRailsアプリケーションを運用していて、デバッグ時に頻繁に使用するコマンドをまとめました。
毎回調べ直すのが面倒なので、チートシートとして執筆しました :memo:

## 基本設定

### コンテキスト操作

| コマンド | 説明 |
|----------|------|
| `kubectl config current-context` | 現在のコンテキスト確認 |
| `kubectl config get-contexts` | コンテキスト一覧表示 |
| `kubectl config use-context <context-name>` | コンテキスト切り替え |

### namespace確認

| コマンド | 説明 |
|----------|------|
| `kubectl config view --minify \| grep namespace` | デフォルトnamespace確認 |
| `kubectl get pods -n staging` | stagingのPod一覧表示 |
| `kubectl get pods -n production` | productionのPod一覧表示 |

## Pod操作

### Pod情報確認

| コマンド | 説明 |
|----------|------|
| `kubectl get pods` | Pod一覧表示 |
| `kubectl get pods -n <namespace>` | 指定namespace内のPod一覧 |
| `kubectl get pods -o wide` | Pod詳細情報（IP、Node等含む） |
| `kubectl describe pod <pod-name>` | Pod詳細情報とイベント確認 |
| `kubectl get pod <pod-name> -o yaml` | PodのYAML設定表示 |

### Pod状態確認

| コマンド | 説明 |
|----------|------|
| `kubectl get pods --show-labels` | Podの状態とリスタート回数確認 |
| `kubectl get pods --field-selector=status.phase!=Running` | 異常なPodをフィルタリング |
| `kubectl top pods` | Podのリソース使用状況確認 |
| `kubectl top pods -n <namespace>` | 指定namespaceのPodリソース使用状況確認 |

## ログ確認

### 基本ログ確認

| コマンド | 説明 |
|----------|------|
| `kubectl logs <pod-name>` | Podのログ表示 |
| `kubectl logs <pod-name> -n <namespace>` | 指定namespace内のPodログ |
| `kubectl logs <pod-name> -f` | リアルタイムでログ監視 |
| `kubectl logs <pod-name> --tail=100` | 最新100行のみ表示 |
| `kubectl logs <pod-name> --since=1h` | 1時間以内のログのみ表示 |

### 複数コンテナ・前回起動分のログ

| コマンド | 説明 |
|----------|------|
| `kubectl logs <pod-name> -c <container-name>` | 複数コンテナがある場合のコンテナ指定 |
| `kubectl logs <pod-name> --previous` | Pod再起動前のログ確認（クラッシュ原因調査等） |
| `kubectl logs -l app=<app-name> -f` | 複数Podのログを同時確認 |

## Railsアプリケーション操作

### Rails Console実行

| コマンド | 説明 |
|----------|------|
| `kubectl exec -it <pod-name> -- rails console` | Railsコンソール起動 |
| `kubectl exec -it <pod-name> -n <namespace> -- rails console` | 指定namespace内でRailsコンソール起動 |
| `kubectl exec -it <pod-name> -- rails console -e production` | 本番環境でのRailsコンソール起動 |

### Rails関連コマンド実行

| コマンド | 説明 |
|----------|------|
| `kubectl exec -it <pod-name> -- rails db:migrate` | データベースマイグレーション実行 |
| `kubectl exec -it <pod-name> -- rails <task-name>` | Railsタスク実行 |
| `kubectl exec -it <pod-name> -- rails db:seed` | シードデータ投入 |
| `kubectl exec -it <pod-name> -- rails routes` | ルート確認 |

### データベース操作

| コマンド | 説明 |
|----------|------|
| `kubectl exec -it <pod-name> -- rails dbconsole` | データベースコンソール起動 |
| `kubectl exec -it <pod-name> -- rails runner "puts ActiveRecord::Base.connection.execute('SELECT 1').first"` | データベース接続確認 |

## Pod内部操作

### Pod内でシェル実行

| コマンド | 説明 |
|----------|------|
| `kubectl exec -it <pod-name> -- /bin/bash` | bashシェル起動 |
| `kubectl exec -it <pod-name> -- /bin/sh` | shシェル起動（bashが使えない場合） |
| `kubectl exec -it <pod-name> -n <namespace> -- /bin/bash` | 指定namespace内でシェル実行 |
| `kubectl exec -it <pod-name> -c <container-name> -- /bin/bash` | 複数コンテナがある場合のコンテナ指定 |

### ファイル操作

| コマンド | 説明 |
|----------|------|
| `kubectl cp <pod-name>:/path/to/file /local/path` | Pod内のファイルをローカルにコピー |
| `kubectl cp /local/path <pod-name>:/path/to/file` | ローカルファイルをPod内にコピー |
| `kubectl cp <namespace>/<pod-name>:/path/to/file /local/path` | 指定namespace内でファイルコピー |

## デバッグ・トラブルシューティング

### リソース使用状況確認

| コマンド | 説明 |
|----------|------|
| `kubectl top nodes` | Node使用状況確認 |
| `kubectl top pods --sort-by=cpu` | Pod使用状況確認（CPU順） |
| `kubectl top pods --sort-by=memory` | Pod使用状況確認（メモリ順） |
| `kubectl top pods -n <namespace>` | 指定namespaceのリソース確認 |

### イベント確認

| コマンド | 説明 |
|----------|------|
| `kubectl get events` | namespace内の全イベント確認 |
| `kubectl get events -n <namespace>` | 指定namespaceのイベント確認 |
| `kubectl get events --sort-by=.metadata.creationTimestamp` | 時系列順でイベント表示 |
| `kubectl describe pod <pod-name>` | 特定Podのイベント確認 |

### Pod再起動・削除

| コマンド | 説明 |
|----------|------|
| `kubectl delete pod <pod-name>` | Podの再起動（実際は削除後に自動再作成） |
| `kubectl delete pod <pod-name> --grace-period=0 --force` | 強制削除 |
| `kubectl delete pod <pod-name> -n <namespace>` | 指定namespaceでPod削除 |

## Service・Ingress確認

### Service操作

| コマンド | 説明 |
|----------|------|
| `kubectl get services` | Service一覧確認 |
| `kubectl get svc` | Service一覧確認（短縮形） |
| `kubectl describe service <service-name>` | Service詳細確認 |
| `kubectl get endpoints <service-name>` | Serviceへの接続確認 |

### ポートフォワード

| コマンド | 説明 |
|----------|------|
| `kubectl port-forward <pod-name> 3000:3000` | ローカルポートからPodへのフォワード |
| `kubectl port-forward service/<service-name> 3000:80` | ローカルポートからServiceへのフォワード |
| `kubectl port-forward <pod-name> 3000:3000 &` | バックグラウンドで実行 |

## デプロイメント操作

### デプロイメント確認

| コマンド | 説明 |
|----------|------|
| `kubectl get deployments` | デプロイメント一覧 |
| `kubectl get deploy` | デプロイメント一覧（短縮形） |
| `kubectl describe deployment <deployment-name>` | デプロイメント詳細確認 |
| `kubectl get replicasets` | レプリカセット確認 |
| `kubectl get rs` | レプリカセット確認（短縮形） |

### デプロイメント更新

| コマンド | 説明 |
|----------|------|
| `kubectl set image deployment/<deployment-name> <container-name>=<new-image>` | イメージ更新 |
| `kubectl rollout restart deployment/<deployment-name>` | デプロイメント再起動 |
| `kubectl rollout status deployment/<deployment-name>` | ロールアウト状況確認 |
| `kubectl rollout undo deployment/<deployment-name>` | ロールバック |

## 設定情報確認

### ConfigMap・Secret確認

| コマンド | 説明 |
|----------|------|
| `kubectl get configmaps` | ConfigMap一覧 |
| `kubectl get cm` | ConfigMap一覧（短縮形） |
| `kubectl describe configmap <configmap-name>` | ConfigMap内容確認 |
| `kubectl get configmap <configmap-name> -o yaml` | ConfigMapのYAML表示 |
| `kubectl get secrets` | Secret一覧 |
| `kubectl get secret <secret-name> -o yaml` | Secret内容確認（Base64デコードされて表示） |

## よく使う組み合わせコマンド

### Railsアプリのヘルスチェック

| コマンド | 説明 |
|----------|------|
| `kubectl get pods -l app=<app-name> && kubectl logs -l app=<app-name> --tail=50` | Podの状態とログを同時確認 |
| `kubectl exec -it <pod-name> -- rails runner "puts Rails.env"` | Rails環境確認 |
| `kubectl exec -it <pod-name> -- curl localhost:3000/health` | アプリケーションの動作確認 |

### デバッグセッション開始

| 順序 | コマンド | 説明 |
|------|----------|------|
| 1 | `kubectl get pods -o wide` | Pod状態確認 |
| 2 | `kubectl describe pod <pod-name>` | 異常Pod特定 |
| 3 | `kubectl logs <pod-name> --tail=100 -f` | ログ確認 |
| 4 | `kubectl exec -it <pod-name> -- /bin/bash` | Pod内でデバッグ |

## まとめ

K8S環境でRailsアプリをデバッグする際によく使うコマンドをまとめました！
覚えることが多いなぁ...

特にrails consoleの起動方法やログ確認は頻繁に使うので、覚えておくと作業効率が上がりますね