EKS コントロールプレーンログ クエリ集
はじめに
EKS のコントロールプレーンは AWS により管理されています。
このコントロールプレーンのログを取得することで、監査やトラブルシューティングの際に役立ちます。
公式ドキュメントにもサンプルクエリがありますが、使えそうなクエリを整理してみます。
新たに使用したクエリなどは追加していこうかと思います。
コントロールプレーンの有効化
マネジメントコンソールから操作する場合、[クラスター] > [(各自のクラスター名)] > [オブザーバビリティ] > [コントロールプレーンのログ記録] から有効化できます。
コントロールプレーンの種類
-
API サーバー (api)
クラスターへのAPIリクエストに関するログ。Kubernetes APIを外部に公開するコンポーネント -
監査 (audit)
Kubernetes APIを使用したクラスターアクセス(ユーザ・管理者・システムコンポーネント)に関するログ -
Authenticator (authenticator)
クラスターへのRBAC認証リクエストに関するログ
Authenticator ログは、Amazon EKS に固有 -
コントローラーマネージャー (controllerManager)
クラスターコントローラーの状態に関するログ
複数のコントローラープロセスを実行するコンポーネント -
スケジューラ (scheduler)
スケジュール決定に関するログ
PodのNodeへの割り当てなどを管理するコンポーネント
コントロールプレーンログの表示
以下のロググループ/ログストリーム名で表示されます。
- ロググループ:
/aws/eks/<my-cluster>/cluster
- Kubernetes API サーバーコンポーネントログ (api) :
kube-apiserver-xxxxxxxx
- 監査 (audit) :
kube-apiserver-audit-xxxxxxxx
- 認証システム (authenticator) :
authenticator-xxxxxxxx
- コントローラーマネージャー (controllerManager) :
kube-controller-manager-xxxxxxxx
- スケジューラ (scheduler) :
kube-scheduler-xxxxxxxx
- Kubernetes API サーバーコンポーネントログ (api) :
クエリ集-1
こちらにクエリ例が複数紹介されています。
掲載されているクエリ
- クラスター作成者を見つけるクエリ
- 特定のユーザーが実行したリクエストを見つけるクエリ
- 特定の userAgent が行った API コールを検索するクエリ
- aws-auth ConfigMap に加えられた変更を検出するクエリ
- 拒否されたリクエストを検索するクエリ
- ポッドがスケジュールされているノードを検索するクエリ
- Kubernetes API サーバーリクエストの HTTP 5xx サーバーエラーを見つけるクエリ
- CronJob のトラブルシューティングを行う際、cronjob-controller がする API コールを検索するクエリ
- replicaset-controller が行った API コールを見つけるクエリ
- Kubernetes リソースに対して行われるオペレーションを検索するクエリ
- Kubernetes API サーバーに対して行われたコールの HTTP レスポンスコードの数を取得するクエリ
- [kube-system] 名前空間の DaemonSets/Addons に加えられた変更を見つけるクエリ
- ノードを削除したユーザーを検索するクエリ
クエリ集-2
特定のオブジェクト/リソースにおける監査ログ
fields @logStream, @timestamp, @message
| filter @logStream like /^kube-apiserver-audit/
| sort @timestamp desc
| filter verb == "ACTION" and requestURI like "/api/v1/namespaces/<NAMESPACE>/<RESOURCE_TYPE>/<RESOURCE_NAME>"
削除されたPodの監査ログ
fields @logStream, @timestamp, @message
| filter @logStream like /^kube-apiserver-audit/
| sort @timestamp desc
| filter verb == "delete" and requestURI like "/api/v1/namespaces/<NAMESPACE>/pods/<POD_NAME>"
特定Podに対して行われた変更の監査ログ
fields @logStream, @timestamp, @message
| filter @logStream like /^kube-apiserver-audit/
| sort @timestamp desc
| filter verb != "get" and verb != "watch" and verb != "list"
| filter requestURI like "/api/v1/namespaces/<NAMESPACE>/pods/<POD_NAME>"
Job オブジェクトに対して行われた変更の監査ログ
fields @logStream, @timestamp, @message
| filter @logStream like /^kube-apiserver-audit/
| sort @timestamp desc
| filter requestURI like "/apis/batch/v1"
| filter responseObject.metadata.uid like "<JOB_CONTROLLER_UID>"
| filter verb != "get" and verb != "watch" and verb != "list"
監査ログ以外でのエラーメッセージ(error)検索
fields @timestamp, @message
| filter @message like /error/
| filter @logStream not like /audit/
| sort @timestamp desc
evict が発生した際のログ
fields @logStream, @timestamp, @message
| filter @logStream like /^kube-apiserver-audit/
| sort @timestamp desc
| filter user.username == "eks:node-manager" and requestURI like "eviction" and requestURI like "pod"
evict が発生した際の Pod ごとのイベントカウント数
fields @timestamp, @message
| stats count(*) as count by objectRef.name
| filter @logStream like /audit/
| filter user.username == "eks:node-manager" and requestURI like "eviction" and requestURI like "pod"
| sort count desc
APIサーバーのスケーリングイベント
fields @timestamp, @message
| filter @logStream like /audit/
| filter @message like “Resetting endpoints for master service”
| sort @timestamp asc
EKS add-ons による定期的な監視ログ(更新が行われた場合、patch)
fields @timestamp, @message
| filter @logStream like /^kube-apiserver-audit/
| filter verb="get" and objectRef.resource="daemonsets" and objectRef.name="aws-node" and user.username="eks:addon-manager"
Kubernetes 監査ログから、userAgent 別にグループ化された API リクエストの数をカウント
fields userAgent, requestURI, @timestamp, @message
| filter @logStream like "kube-apiserver-audit"
| stats count(userAgent) as count by userAgent
| sort count desc
[Fargate] Pod が起動している Fargate ノードを特定する
fields @timestamp, requestObject.target.name as nodename, @message
| filter @logStream like /audit/
| filter requestURI like /binding/
| filter objectRef.name = "<POD_NAME>"
| filter objectRef.namespace = "<POD_NAMESPACE>"
| filter verb = "create"
[Fargate] 特定の Fargate ノード上での動作(以下では delete)を行った username を特定する
fields @timestamp, user.username as username, @message
| filter @logStream like /audit/
| filter requestURI like /\/nodes\/<NODE_NAME>/
| filter verb = "delete"
最後に
参考になれば幸いです。
今後も追加していきます。
Discussion