EKS オブザーバビリティ:重要なメトリクス
現在の状況
モニタリングは、インフラストラクチャとアプリケーションの所有者が、システムの過去と現在の状態を確認し理解するための解決策として定義されます。 これは、定義されたメトリクスやログの収集に焦点を当てています。
モニタリングは長年にわたって進化してきました。 最初は、問題のデバッグやトラブルシューティングのためにデバッグログやダンプログを使用することから始まりました。 その後、syslog や top などのコマンドラインツールを使用した基本的なモニタリングへと進化し、さらにダッシュボードでの可視化が可能になりました。 クラウドの出現と規模の拡大に伴い、現在では過去に比べてより多くのものを追跡しています。
業界はオブザーバビリティへとシフトしており、これはインフラストラクチャとアプリケーションの所有者がシステムを積極的にトラブルシューティングおよびデバッグできるようにする解決策として定義されています。 オブザーバビリティは、メトリクスから導き出されたパターンの観察により重点を置いています。
メトリクス、なぜ重要なのか?
メトリクスは、作成された時間順に保持される一連の数値データです。 環境内のサーバー数、ディスク使用量、1 秒あたりの処理リクエスト数、またはこれらのリクエストの完了にかかる遅延時間など、あらゆるものを追跡するために使用されます。 メトリクスは、システムのパフォーマンスを示すデータです。
小規模なクラスターであれ大規模なクラスターであれ、システムの健全性とパフォーマンスに関する洞察を得ることで、改善が必要な領域を特定し、問題のトラブルシューティングとトレースを行い、ワークロード全体のパフォーマンスと効率を向上させることができます。 これらの変更は、クラスターにかける時間とリソースに影響を与え、直接コストに反映されます。
メトリクス収集
EKS クラスターからメトリクスを収集するには、3つのコンポーネントが必要です:
- ソース:このガイドに記載されているようなメトリクスの発生源。
- エージェント:EKS 環境で実行されるアプリケーションで、多くの場合エージェントと呼ばれます。メトリクスの監視データを収集し、2番目のコンポーネントにこのデータをプッシュします。このコンポーネントの例として、AWS Distro for OpenTelemetry (ADOT) や CloudWatch エージェントがあります。
- 送信先:監視データの保存と分析ソリューションで、このコンポーネントは通常、時系列形式のデータに最適化されたデータサービスです。このコンポーネントの例として、Amazon Managed Service for Prometheus や AWS CloudWatch があります。
注:このセクションでは、設定例は AWS Observability Accelerator の関連セクションへのリンクになっています。これは、EKS メトリクス収集の実装に関する最新のガイダンスと例を確実に得られるようにするためです。
マネージドオープンソースソリューション
AWS Distro for OpenTelemetry (ADOT) は、OpenTelemetry プロジェクトのサポートされているバージョンで、ユーザーが相関のあるメトリクスとトレースを Amazon Managed Service for Prometheus や AWS CloudWatch などの様々なモニタリングデータ収集ソリューションに送信できるようにします。
ADOT は EKS マネージドアドオン を通じて EKS クラスターにインストールでき、(この ページに記載されているような) メトリクスやワークロードトレースを収集するように設定できます。
AWS は ADOT アドオンが Amazon EKS と互換性があることを検証しており、最新のバグ修正とセキュリティパッチで定期的に更新されています。
ADOT + AMP
AWS Distro for OpenTelemetry (ADOT)、Amazon Managed Service for Prometheus (AMP)、および Amazon Managed Grafana (AMG) を迅速に導入して稼働させる最も簡単な方法は、AWS Observability Accelerator の インフラストラクチャモニタリングの例 を利用することです。アクセラレータの例では、すぐに使えるメトリクス収集、アラートルール、Grafana ダッシュボードを備えたツールとサービスを環境にデプロイします。
ADOT 用 EKS マネージドアドオン のインストール、設定、運用に関する追加情報については、AWS のドキュメントを参照してください。
ソース
EKS メトリクスは、全体的なソリューションの異なるレイヤーの複数の場所から作成されます。以下の表は、重要なメトリクスセクションで言及されているメトリクスソースをまとめたものです。
エージェント: AWS Distro for OpenTelemetry
AWS は、AWS EKS ADOT マネージドアドオンを通じて、EKS クラスター上での ADOT のインストール、設定、運用を推奨しています。このアドオンは ADOT オペレーター/コレクターのカスタムリソースモデルを利用し、クラスター上で複数の ADOT コレクターのデプロイ、設定、管理を可能にします。このアドオンのインストール、高度な設定、運用に関する詳細情報は、このドキュメントをご覧ください。
注意: AWS EKS ADOT マネージドアドオンの Web コンソールは、ADOT アドオンの高度な設定に使用できます。
ADOT コレクターの設定には 2 つのコンポーネントがあります。
- コレクターのデプロイメントモード(デプロイメント、デーモンセットなど)を含むコレクター設定。
- メトリクス収集に必要なレシーバー、プロセッサー、エクスポーターを含むOpenTelemetry パイプライン設定。設定スニペットの例:
config: |
extensions:
sigv4auth:
region: <YOUR_AWS_REGION>
service: "aps"
receivers:
#
# Prometheus レシーバーのスクレイプ設定
# これは、コミュニティの Helm チャートを使用して Prometheus をインストールする際に使用される設定と同じです
#
prometheus:
config:
global:
scrape_interval: 60s
scrape_timeout: 10s
scrape_configs:
- job_name: kubernetes-apiservers
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- action: keep
regex: default;kubernetes;https
source_labels:
- __meta_kubernetes_namespace
- __meta_kubernetes_service_name
- __meta_kubernetes_endpoint_port_name
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true
...
...
exporters:
prometheusremotewrite:
endpoint: <YOUR AMP WRITE ENDPOINT URL>
auth:
authenticator: sigv4auth
logging:
loglevel: warn
extensions:
sigv4auth:
region: <YOUR_AWS_REGION>
service: aps
health_check:
pprof:
endpoint: :1888
zpages:
endpoint: :55679
processors:
batch/metrics:
timeout: 30s
send_batch_size: 500
service:
extensions: [pprof, zpages, health_check, sigv4auth]
pipelines:
metrics:
receivers: [prometheus]
processors: [batch/metrics]
exporters: [logging, prometheusremotewrite]
完全なベストプラクティスのコレクター設定、ADOT パイプライン設定、Prometheus スクレイプ設定は、Observability Accelerator の Helm チャートとして見つけることができます。
送信先: Amazon Managed Service for Prometheus
ADOT コレクターパイプラインは、Prometheus Remote Write 機能を利用してメトリクスを AMP インスタンスにエクスポートします。以下は設定スニペットの例です。AMP WRITE ENDPOINT URL に注目してください。
exporters:
prometheusremotewrite:
endpoint: <YOUR AMP WRITE ENDPOINT URL>
auth:
authenticator: sigv4auth
logging:
loglevel: warn
完全なベストプラクティスのコレクター設定、ADOT パイプライン設定、および Prometheus スクレイプ設定は、Observability Accelerator の Helm Chart として見つけることができます。
AMP の設定と使用に関するベストプラクティスはこちらにあります。
関連するメトリクスとは何か?
以前はほとんどメトリクスが利用できなかった時代は過ぎ去り、現在では逆に何百ものメトリクスが利用可能です。 関連するメトリクスを特定できることは、オブザーバビリティを重視したシステムを構築する上で重要です。
このガイドでは、利用可能なメトリクスの異なるグループを概説し、インフラストラクチャとアプリケーションにオブザーバビリティを組み込む際に注目すべきメトリクスを説明します。 以下のメトリクスリストは、ベストプラクティスに基づいて監視することをおすすめするメトリクスのリストです。
以下のセクションに記載されているメトリクスは、AWS Observability Accelerator Grafana ダッシュボード と Kube Prometheus Stack ダッシュボード で強調されているメトリクスに加えて推奨されるものです。
コントロールプレーンのメトリクス
Amazon EKS コントロールプレーンは AWS によって管理され、AWS が管理するアカウントで実行されます。 これは、etcd や Kubernetes API サーバーなどの Kubernetes コンポーネントを実行するコントロールプレーンノードで構成されています。 Kubernetes は、Pod、デプロイメント、名前空間な どの起動や終了といったクラスター内のアクティビティをユーザーに通知するために、さまざまなイベントを発行します。 Amazon EKS コントロールプレーンは、コアコンポーネントが適切に機能し、クラスターに必要な基本的なアクティビティを実行できることを確認するために追跡する必要がある重要なコンポーネントです。
コントロールプレーン API サーバーは数千のメトリクスを公開しています。 以下の表は、監視することをお勧めする重要なコントロールプレーンメトリクスを示しています。
名前 | メトリクス | 説明 | 理由 |
---|---|---|---|
API サーバーの総リクエスト数 | apiserver_request_total | 各動詞、ドライラン値、グループ、バージョン、リソース、スコープ、コンポーネント、HTTP レスポンスコードごとに分類された API サーバーリクエストのカウンター。 | |
API サーバーのレイテンシー | apiserver_request_duration_seconds | 各動詞、ドライラン値、グループ、バージョン、リソース、サブリソース、スコープ、コンポーネントごとの秒単位のレスポンスレイテンシー分布。 | |
リクエストレイテンシー | rest_client_request_duration_seconds | 秒単位のリクエストレイテンシー。動詞と URL ごとに分類。 | |
総リクエスト数 | rest_client_requests_total | ステータスコード、メソッド、ホストごとに分類された HTTP リクエスト数。 | |
API サーバーリクエスト時間 | apiserver_request_duration_seconds_bucket | Kubernetes API サーバーへの各リクエストのレイテンシーを秒単位で測定。 | |
API サーバーリクエストレイテンシー合計 | apiserver_request_latencies_sum | K8s API サーバーがリクエストを処理するのに要した総時間を追跡する累積カウンター。 | |
API サーバーに登録されたウォッチャー | apiserver_registered_watchers | 特定のリソースに対して現在登録されているウォッチャーの数。 | |
API サーバーのオブジェクト数 | apiserver_storage_object | 最後のチェック時に種類ごとに分類された保存オブジェクトの数。 | |
アドミッションコントローラーのレイテンシー | apiserver_admission_controller_admission_duration_seconds | 名前で識別され、各操作と API リソース、タイプ(検証または許可)ごとに分類されたアドミッションコントローラーのレイテンシーヒストグラム(秒単位)。 | |
etcd のレイテンシー | etcd_request_duration_seconds | 各操作とオブジェクトタイプの etcd リクエストレイテンシー(秒単位)。 | |
etcd の DB サイズ | apiserver_storage_db_total_size_in_bytes | etcd データベースのサイズ。 | これにより、etcd データベースの使用状況を事前に監視し、制限を超えることを回避できます。 |
クラスターステートメトリクス
クラスターステートメトリクスは kube-state-metrics
(KSM) によって生成されます。KSM はクラスター内でポッドとして実行されるユーティリティで、Kubernetes API サーバーをリッスンし、クラスターの状態と Kubernetes オブジェクトに関する洞察を Prometheus メトリクスとして提供します。これらのメトリクスを利用可能にするには、KSM をインストールする必要があります。これらのメトリクスは、Kubernetes がポッドのスケジューリングを効果的に行うために使用され、デプロイメント、レプリカセット、ノード、ポッドなどの様々なオブジェクトの健全性に焦点を当てています。クラスターステートメトリクスは、ステータス、キャパシティ、可用性に関するポッド情報を公開します。クラスターのパフォーマンスを追跡し、問題を先取りし、クラスターの健全性を監視できるよう、クラスターのタスクスケジューリングのパフォーマンスを把握することが不可欠です。約 X 個のクラスターステートメトリクスが公開されていますが、以下の表は追跡すべき重要なメトリクスを示しています。
名前 | メトリクス | 説明 |
---|---|---|
ノードステータス | kube_node_status_condition | ノードの現在の健全性状態。ノードの状態のセットと、各状態に対する true 、false 、または unknown を返します |
希望するポッド数 | kube_deployment_spec_replicas または kube_daemonset_status_desired_number_scheduled | デプロイメントまたは DaemonSet に指定されたポッドの数 |
現在のポッド数 | kube_deployment_status_replicas または kube_daemonset_status_current_number_scheduled | デプロイメントまたは DaemonSet で現在実行中のポッドの数 |
ポッドキャパシティ | kube_node_status_capacity_pods | ノードで許可される最大ポッド数 |
利用可能なポッド数 | kube_deployment_status_replicas_available または kube_daemonset_status_number_available | デプロイメントまたは DaemonSet で現在利用可能なポッドの数 |
利用不可能なポッド数 | kube_deployment_status_replicas_unavailable または kube_daemonset_status_number_unavailable | デプロイメントまたは DaemonSet で現在利用不可能なポッドの数 |
ポッドの準備状態 | kube_pod_status_ready | ポッドがクライアントリクエストに応答する準備ができているかどうか |
ポッドステータス | kube_pod_status_phase | ポッドの現在のステータス。値は pending/running/succeeded/failed/unknown のいずれか |
ポッド待機理由 | kube_pod_container_status_waiting_reason | コンテナが待機状態にある理由 |
ポッド終了ステータス | kube_pod_container_status_terminated | コンテナが現在終了状態にあるかどうか |
スケジューリング待ちのポッド数 | pending_pods | ノード割り当てを待機しているポッドの数 |
ポッドスケジューリング試行回数 | pod_scheduling_attempts | ポッドのスケジューリングを試みた回数 |