高度なトラブルシューティング: Kubernetesのログ、イベント、メトリクスの深掘り
Kubernetesは、アプリケーションのデプロイと管理方法に革命をもたらし、比類なきスケーラビリティと回復力(レジリエンス)を提供します。しかし、分散システムの複雑さは、トラブルシューティングを困難な作業にする可能性もあります。Podがクラッシュしたとき、デプロイメントがスケールしないとき、またはアプリケーションが応答しなくなったとき、どこを見ればよく、利用可能なデータをどう解釈すればよいかを知ることが最も重要です。
この記事では、Kubernetesのオブザーバビリティ(可観測性)と高度なトラブルシューティングの3つの柱であるログ、イベント、メトリクスについて深く掘り下げます。これらの診断ツールを習得することで、複雑な問題を診断できるだけでなく、クラスターの健全性を積極的に監視し、問題を予測し、コンテナ化されたアプリケーションのスムーズな運用を確保できるようになります。実践的なコマンドを探索し、一般的な出力を解釈し、最も見つけにくい問題の根本原因を特定するために情報を相関させる戦略について議論します。
Kubernetesログ: デバッグの基盤
ログは、アプリケーションまたはシステムプロセスが何を行っているかの詳細な記録です。Kubernetesでは、ログはPod内で実行されているコンテナによって生成されます。アプリケーションが期待どおりに動作していない場合、ログはしばしば最初に確認すべき場所となります。
コンテナログへのアクセス
kubectl logsコマンドは、Podからログを取得するための主要なツールです。これは多機能であり、いくつかの便利なオプションを提供しています。
-
Pod内の単一コンテナからログを取得する:
bash kubectl logs <pod-name>
Podにコンテナが1つしかない場合、このコマンドは直接機能します。 -
マルチコンテナPod内の特定のコンテナからログを取得する:
bash kubectl logs <pod-name> -c <container-name> -
クラッシュしたコンテナの以前のインスタンスからログを表示する:
コンテナがエラーのために再起動した場合、--previousフラグを使用して再起動前のログを表示できます。
bash kubectl logs <pod-name> --previous -
リアルタイムでログを追跡する:
tail -fと同様に、-f(または--follow)フラグを使用すると、生成される新しいログエントリをストリーミングでき、ライブの問題のデバッグに非常に役立ちます。
bash kubectl logs -f <pod-name> -c <container-name> -
時間でログをフィルタリングする:
末尾からの行数を取得する(--tail)か、特定の期間からのログを取得する(--since)かを指定できます。
bash kubectl logs <pod-name> --tail=100 # 最後の100行 kubectl logs <pod-name> --since=1h # 過去1時間のログ
中央集権的なログソリューション
kubectl logsは即時のデバッグに優れていますが、大規模で長期的なログ管理には実用的ではありません。本番環境では、中央集権的なログソリューションが不可欠です。これらのソリューションは通常、以下を含みます:
- ログエージェント: 各ノードでエージェント(例: Fluentd, Fluent Bit, Filebeat)を実行して、すべてのPodからのログを収集します。
- ログストレージとインデックス作成: ログを中央リポジトリ(例: Elasticsearch, Loki, Splunk)に保存します。
- ログの可視化と分析: ログを検索、フィルタリング、可視化するためのインターフェース(例: Kibana, Grafana, Splunk UI)を提供します。
ログのベストプラクティス
- 構造化ログ: ログを構造化された形式(例: JSON)で出力し、中央集権的なログシステムで簡単に解析およびクエリできるようにします。
- 適切なログレベル: メッセージを分類し、冗長性を制御するために、さまざまなログレベル(DEBUG, INFO, WARN, ERROR, FATAL)を使用します。
- 機密情報の回避: 機密データ(パスワード、PII)を直接ログに記録しないでください。
Kubernetesイベント: クラスターの語り部
Kubernetesイベントは、クラスター内で発生する状態変更と操作の記録です。これらは、Kubernetes自体が意図した状態に応じて何を行っているか(または行えていないか)についての重要な洞察を提供します。イベントは、Podがスケジュールされない理由、イメージがプルされない理由、またはボリュームがマウントされない理由を理解するのに非常に役立ちます。
Kubernetesイベントへのアクセス
-
クラスター全体のイベント:
bash kubectl get events
このコマンドは、現在の名前空間のすべての最近のイベントを表示します。クラスター全体にわたるイベントを確認するには、--all-namespacesを追加できます。典型的なイベント出力は次のようになります:
```
LAST SEEN TYPE REASON OBJECT MESSAGE
3m21s Normal Scheduled pod/my-app-789c6f66-abcde Successfully assigned default/my-app-789c6f66-abcde to node01
3m20s Normal Pulling pod/my-app-789c6f66-abcde Pulling image "