セルフマネージド Prometheus を設定して ACK Pro コントロールプレーンのメトリクスをスクレイプし、アラートルールを定義して、設定を検証します。
スクレイプ設定の管理を避けるには、Alibaba Cloud Managed Service for Prometheus を使用してください。メトリクスを自動的に収集し、リアルタイムの Grafana ダッシュボードを提供し、メール、SMS、DingTalk でアラートを送信します。
前提条件
開始する前に、次の項目を満たしていることを確認してください:
-
ACK Pro クラスターの API サーバーにアクセスできるセルフマネージド Prometheus インスタンス。
-
API サーバーの
/metricsパスに対する読み取り権限。 -
クラスター内またはクラスター外にデプロイされた Prometheus インスタンス。
ACK Pro マネージドクラスターは、次のコントロールプレーンコンポーネントのメトリクスを公開します:
| コンポーネント | メトリクスの参照 |
|---|---|
kube-apiserver |
kube-apiserver のメトリクス |
etcd |
etcd のメトリクス |
kube-scheduler |
kube-scheduler のメトリクス |
kube-controller-manager |
kube-controller-manager のメトリクス |
cloud-controller-manager |
cloud-controller-manager のメトリクス |
手順 1:Prometheus スクレイプジョブの追加
各コントロールプレーンコンポーネントに対して、prometheus.yaml にスクレイプジョブを追加します。 デフォルトのグローバル間隔は 15s です。各コンポーネントのジョブでは、API サーバーの負荷を軽減するために 30s を使用します。
Prometheus 設定ドキュメントでは、prometheus.yaml の構文全体を確認できます。
global:
scrape_interval: 15s # デフォルトでは、15 秒ごとにターゲットをスクレイプします。
# 外部システム (フェデレーション、リモートストレージ、Alertmanager) と通信する際に、
# すべての時系列またはアラートにこれらのラベルを付与します。
external_labels:
monitor: 'codelab-monitor'
# スクレイプするエンドポイントを 1 つだけ含むスクレイプ設定:
# ここでは Prometheus 自身です。
scrape_configs:
# ジョブ名は、この設定からスクレイプされた任意の時系列にラベル `job=<job_name>` として追加されます。
- job_name: ack-api-server
......
- job_name: ack-etcd
......
- job_name: ack-scheduler
......
以降のセクションでは、各コンポーネントのスクレイプ設定とアラートルールを示します。Prometheus Operator パターンを使用して Prometheus をデプロイする場合は、ACK App Marketplace の ack-prometheus-operator アドオンのドキュメントと、カスタムスクレイプ設定に関する Prometheus Operator コミュニティドキュメントをご参照ください。
手順 2:クラスター内モニタリングの設定
セルフマネージド Prometheus がクラスター内で実行されている場合は、各スクレイプジョブを API サーバー経由でプロキシとしてルーティングします。
クラスターのネットワークアーキテクチャの特定
クラスターが Elastic Network Interface (ENI) のダイレクト接続を使用しているか、Classic Load Balancer (CLB) の転送を使用しているかを確認します:
kubectl get endpoints kubernetes
-
ENI ダイレクト接続:出力に
10.0.0.1:6443, 10.0.0.2:6443のように 2 つ以上の IP アドレスが表示されます。 Prometheus は各 API サーバーのレプリカに直接接続します。 -
CLB 転送:出力に単一の IP アドレス (CLB の内部 IP) が表示されます。 すべてのトラフィックはロードバランサー経由でルーティングされます。
以下で各スクレイプジョブを設定する際は、この結果に基づいて適切な Endpoints を使用してください。
kube-apiserver
API サーバーは、すべてのコントロールプレーンメトリクスのエントリポイントです。他のコンポーネントのジョブは、プロキシとして API サーバー経由でルーティングされます。
スクレイプ設定:
- job_name: ack-api-server
scrape_interval: 30s
scrape_timeout: 30s
metrics_path: /metrics
scheme: https
kubernetes_sd_configs:
- role: endpoints
namespaces:
names: [default]
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_component]
action: keep
regex: apiserver
- source_labels: [__meta_kubernetes_service_label_provider]
action: keep
regex: kubernetes
- source_labels: [__meta_kubernetes_endpoint_port_name]
action: keep
regex: https
推奨アラートルール:
- alert: AckApiServerWarning
expr: (absent(up{job="ack-api-server",pod!=""}) or (count(up{job="ack-api-server",pod!=""}) <= 1)) == 1
for: 5m
labels:
severity: critical
annotations:
message: "APIServer が利用できません。Prometheus のジョブとターゲットのステータスを確認してください。"
pod!="" フィルターは、サービスレベルのエンドポイントを除外し、実際のコントロールプレーン Pod を対象にします。 <= 1 のしきい値は、正常な API サーバーのレプリカが 1 つ以下の場合にトリガーされ、高可用性が低下していることを示します。for: 5m 句により、短時間の再起動による誤検知を防止します。
etcd
API サーバープロキシを介して etcd メトリクスを収集します。honor_labels: true 設定により、プロキシの元のコンポーネントラベルが保持されます。
スクレイプ設定:
- job_name: ack-etcd
scrape_interval: 30s
scrape_timeout: 30s
metrics_path: /metrics
scheme: https
params:
hosting: ["true"]
job: ["etcd"]
kubernetes_sd_configs:
- role: endpoints
namespaces:
names: [default]
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
tls_config:
insecure_skip_verify: false
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
server_name: kubernetes
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_component]
action: keep
regex: apiserver
- source_labels: [__meta_kubernetes_service_label_provider]
action: keep
regex: kubernetes
- source_labels: [__meta_kubernetes_endpoint_port_name]
action: keep
regex: https
推奨アラートルール:
- alert: AckETCDLeaderMissing
expr: sum_over_time(etcd_server_has_leader[5m]) == 0
for: 5m
labels:
severity: critical
annotations:
message: "過去 5 分間、etcd クラスターにリーダーが存在しません。クラスターが過負荷になっていないか確認してください。"
- alert: AckETCDDown
expr: (absent(up{job="ack-etcd",pod!=""}) or (count(up{job="ack-etcd",pod!=""}) <= 2)) == 1
for: 5m
labels:
severity: critical
annotations:
message: "Etcd が利用できません。Prometheus のジョブとターゲットのステータスを確認してください。"
AckETCDLeaderMissing は、5 分間にわたって etcd リーダーが選出されない場合に発火し、スプリットブレインまたは過負荷のクラスターを示します。AckETCDDown は、etcd がコンセンサスに達するには少なくとも 3 つのメンバーからなるクォーラムが必要であり、メンバーが 2 つ以下ではコンセンサスに達することができないため、しきい値として <= 2 ではなく <= 0 を使用します。
kube-scheduler
スケジューラーのヘルスとスケジューリングレイテンシを監視します。
スクレイプ設定:
- job_name: ack-scheduler
scrape_interval: 30s
scheme: https
params:
hosting: ["true"]
job: ["ack-scheduler"]
kubernetes_sd_configs:
- role: endpoints
namespaces:
names: [default]
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
tls_config:
insecure_skip_verify: false
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
server_name: kubernetes
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_component]
action: keep
regex: apiserver
- source_labels: [__meta_kubernetes_endpoint_port_name]
action: keep
regex: https
推奨アラートルール:
- alert: AckSchedulerWarning
expr: (absent(up{job="ack-scheduler",pod!=""}) or (count(up{job="ack-scheduler",pod!=""}) <= 0)) == 1
for: 3m
labels:
severity: critical
annotations:
message: "Scheduler が利用できません。Prometheus のジョブとターゲットのステータスを確認してください。"
for: 3m の期間が API サーバーおよび etcd のアラートより短いのは、スケジューラーの停止が新しい Pod のスケジューリングを直接ブロックするため、より迅速な検知が必要だからです。
kube-controller-manager (KCM)
ノード、Namespace、Deployment など、Kubernetes のコアオブジェクトに対するコントローラーを監視します。
スクレイプ設定:
- job_name: ack-kcm
scrape_interval: 30s
scheme: https
params:
hosting: ["true"]
job: ["ack-kube-controller-manager"]
kubernetes_sd_configs:
- role: endpoints
namespaces:
names: [default]
authorization:
credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
server_name: kubernetes
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_component]
action: keep
regex: apiserver
- source_labels: [__meta_kubernetes_endpoint_port_name]
action: keep
regex: https
推奨アラートルール:
- alert: AckKCMWarning
expr: (absent(up{job="ack-kcm",pod!=""}) or (count(up{job="ack-kcm",pod!=""}) <= 0)) == 1
for: 3m
labels:
severity: critical
annotations:
message: "KCM が利用できません。Prometheus のジョブとターゲットのステータスを確認してください。"
cloud-controller-manager (CCM)
クラスターを Alibaba Cloud インフラストラクチャと統合する CCM を監視します。このジョブでは、他のコンポーネントで使用する authorization.credentials_file ではなく、認可に bearer_token_file を使用します。
スクレイプ設定:
- job_name: ack-cloud-controller-manager
scrape_interval: 30s
scheme: https
params:
hosting: ["true"]
job: ["ack-cloud-controller-manager"]
kubernetes_sd_configs:
- role: endpoints
namespaces:
names: [default]
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
server_name: kubernetes
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_component]
action: keep
regex: apiserver
- source_labels: [__meta_kubernetes_endpoint_port_name]
action: keep
regex: https
推奨アラートルール:
- alert: AckCCMWarning
expr: (absent(up{job="ack-cloud-controller-manager",pod!=""}) or (count(up{job="ack-cloud-controller-manager",pod!=""}) <= 0)) == 1
for: 3m
labels:
severity: critical
annotations:
message: "CCM が利用できません。Prometheus のジョブとターゲットのステータスを確認してください。"
pod!="" フィルターにより、有効なコントロールプレーン Pod のみがアラート対象となり、短時間のネットワーク中断やローリング再起動中の誤検知を回避できます。
手順 3:Prometheus アラートルールの設定
Prometheus アラートルールのドキュメントでは、構文および for と keep_firing_for 句などの高度なオプションについて説明しています。
設定の検証
Prometheus がすべてのコンポーネントを正常にスクレイプできていることを確認します。 Prometheus がターゲットクラスターの外部で実行されている場合は、kubernetes_sd_configs と api_server エンドポイント、bearer_token、および tls_config を使用してクラスターの API サーバーに対して認証する、クラスター外スクレイプジョブを設定します。詳細については、「Prometheus コミュニティドキュメント」をご参照ください。
-
Prometheus コンソールにログインし、[Graph] ページに移動します。
-
upクエリを実行します。up{job="ack-api-server"}と、他のすべてのコンポーネントジョブが1を返すことを確認します。 -
apiserver_request_totalなどのコンポーネント固有のクエリを実行し、時系列データが正しく反映されていることを確認します。