🔎

EKS コントロールプレーンログ クエリ集

2024/07/08に公開

はじめに

EKS のコントロールプレーンは AWS により管理されています。
このコントロールプレーンのログを取得することで、監査やトラブルシューティングの際に役立ちます。

公式ドキュメントにもサンプルクエリがありますが、使えそうなクエリを整理してみます。
新たに使用したクエリなどは追加していこうかと思います。

コントロールプレーンの有効化

マネジメントコンソールから操作する場合、[クラスター] > [(各自のクラスター名)] > [オブザーバビリティ] > [コントロールプレーンのログ記録] から有効化できます。

コントロールプレーンの種類

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/control-plane-logs.html

  • API サーバー (api)
    クラスターへのAPIリクエストに関するログ。Kubernetes APIを外部に公開するコンポーネント

  • 監査 (audit)
    Kubernetes APIを使用したクラスターアクセス(ユーザ・管理者・システムコンポーネント)に関するログ

  • Authenticator (authenticator)
    クラスターへのRBAC認証リクエストに関するログ
    Authenticator ログは、Amazon EKS に固有

  • コントローラーマネージャー (controllerManager)
    クラスターコントローラーの状態に関するログ
    複数のコントローラープロセスを実行するコンポーネント

  • スケジューラ (scheduler)
    スケジュール決定に関するログ
    PodのNodeへの割り当てなどを管理するコンポーネント

コントロールプレーンログの表示

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/control-plane-logs.html#viewing-control-plane-logs

以下のロググループ/ログストリーム名で表示されます。

  • ロググループ:/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

クエリ集-1

こちらにクエリ例が複数紹介されています。

https://repost.aws/ja/knowledge-center/eks-get-control-plane-logs

掲載されているクエリ

  • クラスター作成者を見つけるクエリ
  • 特定のユーザーが実行したリクエストを見つけるクエリ
  • 特定の 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