ログ集約
オブザーバビリティのベストプラクティスガイドのこのセクションでは、AWS ネイティブサービスを使用した Amazon EKS ロギングに関連する以下のトピックについて詳しく説明します:
- Amazon EKS ロギングの概要
- Amazon EKS コントロールプレーンのロギング
- Amazon EKS データプレーンのロギング
- Amazon EKS アプリケーションのロギング
- AWS ネイティブサービスを使用した Amazon EKS と他のコンピューティングプラットフォームからの統合ログ集約
- まとめ
はじめに
Amazon EKS のログは、コントロールプレーンのログ、ノードのログ、アプリケーションのログの 3 つのタイプに分類で きます。Kubernetes コントロールプレーン は、Kubernetes クラスターを管理し、監査と診断目的のログを生成するコンポーネントのセットです。Amazon EKS では、異なるコントロールプレーンコンポーネントのログを有効化し、CloudWatch に送信できます。
Kubernetes は、Pod を実行する各 Kubernetes ノードで kubelet
や kube-proxy
などのシステムコンポーネントも実行します。これらのコンポーネントは各ノード内にログを書き込み、CloudWatch と Container Insights を設定して各 Amazon EKS ノードのログを取得できます。
コンテナは Kubernetes クラスター内で Pod としてグループ化され、Kubernetes ノードで実行されるようにスケジュールされます。ほとんどのコンテナ化されたアプリケーションは標準出力と標準エラーに書き込みを行い、コンテナエンジンはその出力をログドライバーにリダイレクトします。Kubernetes では、コンテナログはノードの /var/log/pods
ディレクトリにあります。CloudWatch と Container Insights を設定して、各 Amazon EKS Pod のログを取得できます。
Kubernetes でコンテナログを集中ログ集約システムに送信する一般的なアプローチには、以下の 3 つがあります:
- Fluentd DaemonSet のようなノードレベルのエージェント。これが推奨パターンです。
- Fluentd サイドカーコンテナのようなサイドカーコンテナ。
- ログ収集システムへの直接書き込み。このアプローチでは、アプリケーションがログの送信を担当します。これは最も推奨されないオプションです。なぜなら、Fluentd のようなコミュニティが構築したソリューションを再利用する代わりに、アプリケーションコードにログ集約システムの SDK を含める必要があるためです。このパターンは、関心の分離 の原則にも反します。この原則によれば、ログの実装はアプリケーションから独立しているべきです。これにより、アプリケーションに影響を与えたり変更したりすることなく、ログインフラストラクチャを変更できます。
これから、Amazon EKS ログの各カテゴリについて詳しく見ていき、Amazon EKS と他のコンピューティングプラットフォームからの統合ログ集約についても説明します。
Amazon EKS コントロールプレーンのロギング
Amazon EKS クラスターは、Kubernetes クラスター用の高可用性のシングルテナントコントロールプレーンと、コンテナを実行する Amazon EKS ノードで構成されています。 コントロールプレーンノードは AWS が管理するアカウントで実行されます。 Amazon EKS クラスターのコントロールプレーンノードは CloudWatch と統合されており、特定のコントロールプレーンコンポーネントのロギングを有効にすることができます。 各 Kubernetes コントロールプレーンコンポーネントインスタンスのログが提供されます。 AWS はコントロールプレーンノードの健全性を管理し、Kubernetes エンドポイントのサービスレベルアグリーメント (SLA) を提供します。
Amazon EKS コントロールプレーンのロギング は、以下のクラスターコントロールプレーンのログタイプで構成されています。 各ログタイプは、Kubernetes コントロールプレーンのコンポーネントに対応しています。 これらのコンポーネントの詳細については、Kubernetes ドキュメントの Kubernetes Components を参照してください。
- API サーバー (
api
) – クラスターの API サーバーは、Kubernetes API を公開するコントロールプレーンコンポーネントです。クラスター起動時またはその直後に API サーバーのログを有効にすると、API サーバーの起動に使用されたフラグがログに含まれます。詳細については、Kubernetes ドキュメントのkube-apiserver
と 監査ポリシー を参照してください。 - 監査 (
audit
) – Kubernetes 監査ログは、クラスターに影響を与えた個々のユーザー、管理者、またはシステムコンポーネントの記録を提供します。詳細については、Kubernetes ドキュメントの Auditing を参照してください。 - 認証機能 (
authenticator
) – 認証機能のログは Amazon EKS 固有のものです。これらのログは、IAM 認証情報を使用して Kubernetes の ロールベースアクセス制御 (RBAC) 認証を行うために Amazon EKS が使用するコントロールプレーンコンポーネントを表します。詳細については、クラスター管理 を参照してください。 - コントローラーマネージャー (
controllerManager
) – コントローラーマネージャーは、Kubernetes に付属するコアコントロールループを管理します。詳細については、Kubernetes ドキュメントの kube-controller-manager を参照してください。 - スケジューラー (
scheduler
) – スケジューラーコンポーネントは、クラスター内の Pod をいつどこで実行するかを管理します。詳細については、Kubernetes ドキュメントの kube-scheduler を参照してく ださい。
コントロールプレーンログの有効化と無効化 のセクションに従って、AWS コンソールまたは AWS CLI を使用してコントロールプレーンログを有効にしてください。
CloudWatch コンソールからコントロールプレーンログを照会する
Amazon EKS クラスターでコントロールプレーンのログ記録を有効にすると、/aws/eks/cluster-name/cluster
ロググループで EKS コントロールプレーンログを確認できます。詳細については、クラスターコントロールプレーンログの表示 を参照してください。cluster-name
をクラスターの名前に置き換えてください。
CloudWatch Logs Insights を使用して、EKS コントロールプレーンのログデータを検索できます。詳細については、CloudWatch Insights を使用したログデータの分析 を参照してください。重要な点として、クラスターでコントロールプレーンのログ記録を有効にした後でのみ、CloudWatch Logs でログイベントを表示できます。CloudWatch Logs Insights でクエリを実行する時間範囲を選択する前に、コントロールプレーンのログ記録が有効になっていることを確認してください。以下のスクリーンショットは、クエリ出力を含む EKS コントロールプレーンログのクエリ例を示しています。
図: CloudWatch Logs Insights
CloudWatch Logs Insights での一般的な EKS ユースケースのサンプルクエリ
クラスター作成者を見つけるには、kubernetes-admin ユーザーにマッピングされている IAM エンティティを検索します。
fields @logStream, @timestamp, @message| sort @timestamp desc
| filter @logStream like /authenticator/
| filter @message like "username=kubernetes-admin"
| limit 50
出力例:
@logStream, @timestamp @messageauthenticator-71976 ca11bea5d3083393f7d32dab75b,2021-08-11-10:09:49.020,"time=""2021-08-11T10:09:43Z"" level=info msg=""access granted"" arn=""arn:aws:iam::12345678910:user/awscli"" client=""127.0.0.1:51326"" groups=""[system:masters]"" method=POST path=/authenticate sts=sts.eu-west-1.amazonaws.com uid=""heptio-authenticator-aws:12345678910:ABCDEFGHIJKLMNOP"" username=kubernetes-admin"