Prometheus を使用して Config Sync をモニタリングする

このページでは、Config Sync から Prometheus に指標を送信する方法について説明します。

このページでは、Prometheus を使用して Config Sync の指標を表示する方法について説明します。指標をエクスポートするその他の方法については、Cloud Monitoring を使用して Config Sync をモニタリングする、またはカスタム モニタリングを使用して Config Sync をモニタリングするをご覧ください。

Config Sync は指標を自動的に収集して Prometheus にエクスポートします。Cloud Monitoring を構成して、Prometheus からカスタム指標を pull することもできます。これにより、Prometheus と Monitoring の両方でカスタム指標を見ることができます。詳細については、GKE ドキュメントの Prometheus の使用をご覧ください。

指標をスクレイピングする

すべての Prometheus 指標はポート 8675 でスクレイピングできます。指標を取得するには、次のどちらかの方法を使用してクラスタで Prometheus を構成する必要があります。次のいずれかを実行します。

  • Prometheus のドキュメントに沿って操作し、クラスタで指標の取得を構成します。または

  • Prometheus Operator と以下のマニフェストを使用します。この方法を使用すると、Config Sync のすべての指標が 10 秒ごとに取得されます。

    1. マニフェスト ファイルを保持するための一時ディレクトリを作成します。

      mkdir config-sync-monitor
      cd config-sync-monitor
      
    2. curl コマンドを使用して、CoreOS リポジトリから Promtheus Operator マニフェストをダウンロードします。

      curl -o bundle.yaml https://raw.githubusercontent.com/coreos/prometheus-operator/master/bundle.yaml
      

      このマニフェストは default 名前空間を使用するように構成されていますが、これはおすすめしません。次のステップで、monitoring という名前空間を使用するように構成を変更します。別の名前空間を使用する場合は、残りのステップの monitoring の部分をその名前空間で置き換えてください。

    3. 上記のバンドルに記述された ClusterRoleBinding の名前空間を更新するためのファイルを作成します。

      # patch-crb.yaml
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: prometheus-operator
      subjects:
      - kind: ServiceAccount
        name: prometheus-operator
        namespace: monitoring # we are patching from default namespace
      
    4. このパッチを適用してマニフェスト内の他のリソースの名前空間を変更する kustomization.yaml ファイルを作成します。

      # kustomization.yaml
      resources:
      - bundle.yaml
      
      namespace: monitoring
      
      patchesStrategicMerge:
      - patch-crb.yaml
      
    5. monitoring 名前空間が存在しない場合は、作成します。名前空間に別の名前を使用できますが、その場合は、前のステップの YAML マニフェストで namespace の値も変更します。

      kubectl create namespace monitoring
      
    6. 次のコマンドを使用して Kustomize マニフェストを適用します。

      kubectl apply -k .
      
      until kubectl get customresourcedefinitions servicemonitors.monitoring.coreos.com ; \
      do date; sleep 1; echo ""; done

      クラスタで CRD が使用可能になるまで 2 番目のコマンドはブロックされます。

    7. Config Sync から指標を収集する Prometheus サーバーの構成に必要なリソースのマニフェストを作成します。

      # config-sync-monitoring.yaml
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: prometheus-config-sync
        namespace: monitoring
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        name: prometheus-config-sync
      rules:
      - apiGroups: [""]
        resources:
        - nodes
        - services
        - endpoints
        - pods
        verbs: ["get", "list", "watch"]
      - apiGroups: [""]
        resources:
        - configmaps
        verbs: ["get"]
      - nonResourceURLs: ["/metrics"]
        verbs: ["get"]
      ---
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: prometheus-config-sync
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: ClusterRole
        name: prometheus-config-sync
      subjects:
      - kind: ServiceAccount
        name: prometheus-config-sync
        namespace: monitoring
      ---
      apiVersion: monitoring.coreos.com/v1
      kind: Prometheus
      metadata:
        name: config-sync
        namespace: monitoring
        labels:
          prometheus: config-sync
      spec:
        replicas: 2
        serviceAccountName: prometheus-config-sync
        serviceMonitorSelector:
          matchLabels:
            prometheus: config-management
        alerting:
          alertmanagers:
          - namespace: default
            name: alertmanager
            port: web
        resources:
          requests:
            memory: 400Mi
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: prometheus-config-sync
        namespace: monitoring
        labels:
          prometheus: config-sync
      spec:
        type: NodePort
        ports:
        - name: web
          nodePort: 31900
          port: 9190
          protocol: TCP
          targetPort: web
        selector:
          prometheus: config-sync
      --- 
      --- 
      
    8. 次のコマンドを使用してマニフェストを適用します。

      kubectl apply -f config-sync.yaml
      
      until kubectl rollout status statefulset/prometheus-config-sync -n monitoring; \
      do sleep 1; done
      

      Pod が実行されるまで 2 番目のコマンドはブロックされます。

    9. Prometheus サーバーのウェブポートをローカルマシンに転送することでインストールを確認できます。

      kubectl -n monitoring port-forward svc/prometheus-config-sync 9190
      

      http://localhost:9190 で Prometheus のウェブ UI にアクセスできます。

    10. 一時ディレクトリを削除します。

      cd ..
      rm -rf config-sync-monitor
      

利用可能な Prometheus 指標

Config Sync は以下の指標を収集し、Prometheus を通じて取得できるようにします。[ラベル] 列には、各指標に適用可能なすべてのラベルが一覧表示されます。ラベルのない指標は時間の経過に伴う単一の測定を表す一方、ラベルのある指標はラベル値の組み合わせごとに 1 つずつ、つまり複数の測定を表します。

この表が古くなった場合は、Prometheus のユーザー インターフェースで接頭辞によって指標をフィルタリングできます。該当する指標はすべて接頭辞 config_sync_ で始まります。

名前 タイプ ラベル 説明
config_sync_api_duration_seconds_bucket ヒストグラム status、operation API サーバー呼び出しのレイテンシの分布(各サイクルの期間ごとにバケットに分散)
config_sync_api_duration_seconds_count ヒストグラム status、operation API サーバー呼び出しのレイテンシの分布(期間は無視)
config_sync_api_duration_seconds_sum ヒストグラム status、operation すべての API サーバー呼び出しの期間の合計
config_sync_apply_duration_seconds_bucket ヒストグラム commit、status 信頼できる情報源から宣言されたリソースをクラスタに適用するレイテンシの分布(各サイクルの期間ごとにバケットに分散)
config_sync_apply_duration_seconds_count ヒストグラム commit、status 信頼できる情報源から宣言されたリソースをクラスタに適用するレイテンシの分布(期間は無視)
config_sync_apply_duration_seconds_sum ヒストグラム commit、status 信頼できる情報源から宣言されたリソースをクラスタに適用するときのすべてのレイテンシの期間の合計
config_sync_apply_operations_total カウンタ operation、status、controller リソースを信頼できる情報源からクラスタに同期するために実行されたオペレーションの数
config_sync_cluster_scoped_resource_count ゲージ resourcegroup ResourceGroup 内のクラスタ スコープのリソース数
config_sync_crd_count ゲージ resourcegroup ResourceGroup の CRD の数
config_sync_declared_resources ゲージ commit Git 内で宣言され、解析されているリソースの数。
config_sync_internal_errors_total カウンタ ソース Config Sync によってトリガーされた内部エラーの数。内部エラーが発生していない場合、指標が表示されないことがあります
config_sync_kcc_resource_count ゲージ resourcegroup ResourceGroup の Config Connector リソースの数
config_sync_last_apply_timestamp ゲージ commit、status 最新の適用オペレーションのタイムスタンプ
config_sync_last_sync_timestamp ゲージ commit、status Git から最後に同期が行われた時刻のタイムスタンプ
config_sync_parser_duration_seconds_bucket ヒストグラム status、trigger、source 信頼できる情報源からクラスタと同期する際のさまざまなステージのレイテンシの分布
config_sync_parser_duration_seconds_count ヒストグラム status、trigger、source 信頼できる情報源からクラスタと同期する際のさまざまなステージのレイテンシの分布(期間は無視)
config_sync_parser_duration_seconds_sum ヒストグラム status、trigger、source 信頼できる情報源からクラスタと同期する際のさまざまなステージのレイテンシの合計
config_sync_pipeline_error_observed ゲージ name、reconciler、component RootSync と RepoSync のカスタム リソースのステータス。値が 1 の場合は、失敗であることを示します。
config_sync_ready_resource_count ゲージ resourcegroup ResourceGroup の準備完了リソースの総数
config_sync_reconcile_duration_seconds_bucket ヒストグラム status 調整ツール マネージャーによって処理される調整イベントのレイテンシの分布(各呼び出しの期間ごとにバケットに分散)
config_sync_reconcile_duration_seconds_count ヒストグラム status 調整ツール マネージャーによって処理される調整イベントのレイテンシの分布(期間は無視)
config_sync_reconcile_duration_seconds_sum ヒストグラム status 調整ツール マネージャーによって処理されるすべての調整イベントのレイテンシの期間の合計
config_sync_reconciler_errors ゲージ component、errorclass 信頼できる情報源からクラスタにリソースを同期するときに発生したエラーの数
config_sync_remediate_duration_seconds_bucket ヒストグラム status リメディエーター調整イベントのレイテンシの分布(期間ごとにバケットに分散)
config_sync_remediate_duration_seconds_count ヒストグラム status リメディエーター調整イベントのレイテンシの分布(期間は無視)
config_sync_remediate_duration_seconds_sum ヒストグラム status リメディエーター調整イベントのレイテンシの期間の合計
config_sync_resource_count ゲージ resourcegroup ResourceGroup で追跡されるリソースの数
config_sync_resource_conflicts_total カウンタ commit キャッシュに保存されたリソースとクラスタ リソースの不一致が原因で発生したリソース競合の数。リソースの競合が発生していない場合、指標が表示されないことがあります
config_sync_resource_fights_total カウンタ 同期の頻度が高すぎるリソースの数。リソースの競合が発生していない場合、指標が表示されないことがあります
config_sync_resource_group_total ゲージ ResourceGroup CR の数
config_sync_resource_ns_count ゲージ resourcegroup ResourceGroup のリソースで使用される Namespace の数
config_sync_rg_reconcile_duration_seconds_bucket ヒストグラム stallreason ResourceGroup CR の調整の時間分布(期間ごとにバケットに分散)
config_sync_rg_reconcile_duration_seconds_count ヒストグラム stallreason ResourceGroup CR の調整の時間分布(期間は無視)
config_sync_rg_reconcile_duration_seconds_sum ヒストグラム stallreason ResourceGroup CR のすべての調整時間の合計
config_sync_kustomize_build_latency_bucket ヒストグラム kustomize build 実行時間のレイテンシ分布(各オペレーションの期間ごとにバケットに分散)
config_sync_kustomize_build_latency_count ヒストグラム kustomize build 実行時間のレイテンシ分布(期間は無視)
config_sync_kustomize_build_latency_sum ヒストグラム すべての kustomize build 実行時間の合計
config_sync_kustomize_ordered_top_tier_metrics ゲージ top_tier_field Resources、Generator、SecretGenerator、ConfigMapGenerator、Transformer、Validator の使用
config_sync_kustomize_builtin_transformers ゲージ k8s_builtin_transformer Kubernetes オブジェクトのメタデータに関連する組み込み Transformer の使用
config_sync_kustomize_resource_count ゲージ kustomize build によって出力されるリソースの数
config_sync_kustomize_field_count ゲージ field_name kustomization ファイルで特定のフィールドが使用されている回数
config_sync_kustomize_patch_count ゲージ patch_field フィールド patchespatchesStrategicMergepatchesJson6902 内のパッチの数
config_sync_kustomize_base_count ゲージ base_source リモートベースとローカルベースの数
kustomize_deprecating_field_count ゲージ deprecating_field サポートが終了する可能性のあるフィールドの使用
kustomize_simplification_adoption_count ゲージ simplification_field 簡素化 Transformer のイメージ、レプリカ、代替措置の使用
kustomize_helm_inflator_count ゲージ helm_inflator Kustomize での Helm の使用(組み込みフィールドまたはカスタム関数のいずれか)

Prometheus のデバッグ手順の例

次の例では、Prometheus 指標、オブジェクトのステータス フィールド、オブジェクトのアノテーションを使用して Config Sync 関連の問題を検出し、診断する際のパターンについて説明します。まず、概要レベルのモニタリングで問題を検出し、その後、検索条件を調整して詳細を確認して、問題の根本原因を診断します。

ステータスで構成ファイルをクエリする

reconciler プロセスは概要レベルの指標を提供します。これは、クラスタでの Config Sync の全体的な状態を把握する際に役立ちます。これにより、エラーが発生しているかどうかを確認できます。また、エラーに対するアラートも設定できます

config_sync_reconciler_errors

リコンサイラで指標をクエリする

Config Sync で RootSync API と RepoSync API を使用している場合は、RootSync オブジェクトと RepoSync オブジェクトをモニタリングできます。RootSync オブジェクトと RepoSync オブジェクトは、クラスタ上で Config Sync がどのように機能しているかを理解する有用な分析情報を提供します。ほとんどの指標は reconciler 名でタグ付けされるため、エラーが発生したことを確認し、Prometheus でアラートを設定できます。

フィルタリングに使用できる利用可能な指標ラベルの完全なリストをご覧ください。

Prometheus では、RootSync または RepoSync に次のフィルタを使用できます。

# Querying RootSync
config_sync_reconciler_errors{configsync_sync_name=ROOT_SYNC_NAME}

# Querying RepoSync
config_sync_reconciler_errors{configsync_sync_name=REPO_SYNC_NAME}

ステータスでインポートと同期オペレーションをクエリする

Prometheus では、次のクエリを使用できます。

# Check for errors that occurred when sourcing configs.
config_sync_reconciler_errors{component="source"}

# Check for errors that occurred when syncing configs to the cluster.
config_sync_reconciler_errors{component="sync"}

また、ソースと同期プロセスに関する指標を確認することもできます。

config_sync_parser_duration_seconds{status="error"}
config_sync_apply_duration_seconds{status="error"}
config_sync_remediate_duration_seconds{status="error"}

Google Cloud Managed Service for Prometheus でリソースをモニタリングする

Google Cloud Managed Service for Prometheus は、Google Cloud の Prometheus 指標向けのフルマネージド マルチクラウド ソリューションです。データ収集では、マネージド収集(推奨モード)とセルフデプロイによるデータ収集の 2 つのモードがサポートされています。マネージド収集モードで Google Cloud Managed Service for Prometheus を使用して Config Sync のモニタリングを設定するには、次の手順を完了します。

  1. マネージド収集の設定の手順に沿って、クラスタでマネージド Prometheus を有効にします。

  2. 次のサンプル マニフェストを pod-monitoring-config-sync-monitoring.yaml として保存します。このマニフェストは、config-management-monitoring Namespace にある otel-collector-* Pod のポート 8675 で Config Sync 指標をスクレイピングするように PodMonitoring リソースを構成します。PodMonitoring リソースは、Kubernetes ラベルセレクタを使用して otel-collector-* Pod を検索します。

    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: config-sync-monitoring
      namespace: config-management-monitoring
    spec:
      selector:
        matchLabels:
          app: opentelemetry
          component: otel-collector
      endpoints:
      - port: 8675
        interval: 10s
    
  3. マニフェストをクラスタに適用します。

    kubectl apply -f pod-monitoring-config-sync-monitoring.yaml
    

  4. Cloud Monitoring の Managed Service for Prometheus データの手順に沿って、Google Cloud コンソールの Cloud Monitoring の [Metrics Explorer] ページで、Prometheus データがエクスポートされていることを確認します。