このトピックでは、Prometheus 用 TKG 拡張機能 v1.3.1 をデプロイする方法について説明します。Prometheus は、システムおよびサービス監視システムです。構成されたターゲットから指定間隔でメトリックを収集し、ルール式を評価し、結果を表示します。何らかの条件が満たされている場合は、アラートをトリガすることがあります。Alertmanager は Prometheus によって生成されたアラートを処理して、受信側のエンドポイントにルーティングします。Tanzu Kubernetes クラスタのメトリックを収集して表示するには、Prometheus 用 TKG 拡張機能をデプロイします。

拡張機能の前提条件

クラスタ監視のための Alertmanager とともに Prometheus 用 TKG 拡張機能 v1.3.1 をデプロイする前に、次の要件を満たす必要があります。 Prometheus の監視には、一般的な要件に加えてデフォルトのパーシステント ストレージ クラスが必要です。デフォルトのパーシステント ストレージ クラスを使用してクラスタを作成するか、拡張機能をデプロイするときに Prometheus 構成ファイルでクラスタを指定することができます。 TKG 拡張機能のパーシステント ストレージの要件の確認を参照してください。

Prometheus 拡張機能のデプロイ

Prometheus 用 TKG 拡張機能は、いくつかのコンテナをインストールします。詳細については、『 https://prometheus.io/』を参照してください。
コンテナ リソースの種類 レプリカ 説明
prometheus-alertmanager デプロイ 1 Prometheus サーバなどのクライアント アプリケーションによって送信されたアラートを処理します。
prometheus-cadvisor DaemonSet 5 実行中のコンテナのリソース使用量とパフォーマンス データを分析して公開します。
prometheus-kube-state-metrics デプロイ 1 ノードのステータスとキャパシティ、レプリカセットのコンプライアンス、ポッド、ジョブ、cron ジョブのステータス、リソース要求、制限を監視します。
prometheus-node-exporter DaemonSet 5 カーネルによって公開されるハードウェアおよび OS メトリックのエクスポータ。
prometheus-pushgateway デプロイ 1 スクレイピングできないジョブからメトリックをプッシュできるサービス。
prometheus-server デプロイ 1 スクレイピング、ルール処理、アラートなどの中核的な機能を提供します。
この拡張機能は、 https://projects.registry.vmware.com/ にある VMware パブリック レジストリからコンテナをプルするように構成されています。プライベート レジストリを使用する場合は、データ値と拡張機能構成に含まれるエンドポイント URL を、対応するものに変更します。 Prometheus 拡張機能の構成を参照してください。
  1. 拡張機能のすべての前提条件を満たしていることを確認します。拡張機能の前提条件を参照してください。
  2. Prometheus 拡張機能のディレクトリに移動します。
    cd /tkg-extensions-v1.3.1+vmware.1/extensions/monitoring/prometheus
  3. tanzu-system-monitoring 名前空間、Prometheus サービス アカウント、およびロール オブジェクトを作成します。
    kubectl apply -f namespace-role.yaml
  4. Prometheus データ値ファイルを作成します。

    サンプル データ値ファイルには、最小構成が含まれています。

    cp prometheus-data-values.yaml.example prometheus-data-values.yaml
  5. prometheus-data-values.yaml を更新して Prometheus 拡張機能を構成します。フィールドとオプションの説明については、Prometheus 拡張機能の構成を参照してください。
    クラスタがデフォルトのパーシステント ストレージ クラスでプロビジョニングされていない場合は、データ値ファイル内で指定できます。また、名前空間にパーシステント ボリュームの要求を格納するのに必要なストレージが確保されている必要があります。
    monitoring:
      prometheus_server:
        image:
          repository: projects.registry.vmware.com/tkg/prometheus
        pvc:
          storage_class: vwt-storage-policy
          storage: "8Gi"
      alertmanager:
        image:
          repository: projects.registry.vmware.com/tkg/prometheus
        pvc:
          storage_class: vwt-storage-policy
          storage: "8Gi"
    ...      
    
  6. prometheus-data-values ファイルを使用して Prometheus シークレットを作成します。
    kubectl create secret generic prometheus-data-values --from-file=values.yaml=prometheus-data-values.yaml -n tanzu-system-monitoring
    

    prometheus-data-values シークレットが tanzu-system-monitoring 名前空間に作成されている。kubectl get secrets -n tanzu-system-monitoring を使用して確認します。

  7. Prometheus 拡張機能をデプロイします。
    kubectl apply -f prometheus-extension.yaml

    成功すると、Prometheus アプリケーションが作成されます:app.kappctrl.k14s.io/prometheus created

  8. Prometheus アプリケーションのステータスを確認します。
    kubectl get app prometheus -n tanzu-system-monitoring
    ステータスが Reconciling から Reconcile succeeded に変わります。ステータスが Reconcile failed の場合は、トラブルシューティングを参照してください。
  9. Prometheus アプリケーションの詳細情報を確認します。
    kubectl get app prometheus -n tanzu-system-monitoring -o yaml
  10. Prometheus DaemonSets を確認します。
    kubectl get daemonsets -n tanzu-system-monitoring
  11. Prometheus のデプロイを確認します。
    kubectl get deployments -n tanzu-system-monitoring

Prometheus のデプロイのトラブルシューティング

デプロイまたは調整が失敗した場合は、kubectl get pods -A を実行してポッドのステータスを確認します。通常の状態では、ポッドは Running です。ステータスが ImagePullBackOff または ImageCrashLoopBackOff の場合、コンテナ イメージをリポジトリからプルすることができていません。データ値と拡張機能 YAML ファイルに記述されている URL を確認し、これらが正確であることを確認します。

コンテナログを確認します。 name-XXXX は、 kubectl get pods -A を実行したときの一意のポッド名です。
kubectl logs pod/prometheus-alertmanager-XXXXX -c prometheus-alertmanager -n tanzu-system-monitoring
kubectl logs pod/prometheus-server-XXXXX -c prometheus-server -n tanzu-system-monitoring

Prometheus 拡張機能の更新

Tanzu Kubernetes クラスタにデプロイされている Prometheus 拡張機能の構成を更新します。

  1. シークレットから Prometheus データ値を取得します。
    kubectl get secret prometheus-data-values -n tanzu-system-monitoring -o 'go-template={{ index .data "values.yaml" }}' | base64 -d > prometheus-data-values.yaml
    
  2. Prometheus データ値のシークレットを更新します。
    kubectl create secret generic prometheus-data-values --from-file=values.yaml=prometheus-data-values.yaml -n tanzu-system-monitoring -o yaml --dry-run | kubectl replace -f-
    
    Prometheus 拡張機能が更新されたデータ値で調整されます。
    注: デフォルトでは、kapp-controller によってアプリケーションが 5 分ごとに同期されます。更新は 5 分以内に有効になります。更新をすぐに有効にするには、 prometheus-extension.yaml 内の syncPeriod の値を小さくし、 kubectl apply -f prometheus-extension.yaml を使用して Fluent Bit 拡張機能を適用します。
  3. 拡張機能のステータスを確認します。
    kubectl get app prometheus -n tanzu-system-monitoring

    Prometheus が更新されると、ステータスが Reconcile Succeeded に変更されます。

  4. 詳細なステータスを確認して、トラブルシューティングを行います。
    kubectl get app prometheus -n tanzu-system-monitoring -o yaml

Prometheus 拡張機能の削除

Tanzu Kubernetes クラスタから Prometheus 拡張機能を削除します。
注: 手順を順番に実行します。Prometheus アプリケーションが完全に削除される前に、名前空間、サービス アカウント、ロール オブジェクトを削除しないでください。これを行うと、システム エラーが発生する可能性があります。
注意: Prometheus と Grafana は同じ名前空間を使用します。名前空間を削除すると、そこにデプロイされている拡張機能があった場合、その拡張機能が損なわれます。Grafana がデプロイされている場合は、Grafana を削除する前に名前空間を削除しないでください。
  1. Prometheus 拡張機能のディレクトリに移動します。
    cd /extensions/monitoring/prometheus/
  2. Prometheus アプリケーションを削除します。
    kubectl delete app prometheus -n tanzu-system-monitoring

    予期される結果:app.kappctrl.k14s.io "prometheus" deleted

  3. Prometheus アプリケーションが削除されていることを確認します。
    kubectl get app prometheus -n tanzu-system-monitoring

    予期される結果:apps.kappctrl.k14s.io "prometheus" not found

  4. tanzu-system-monitoring 名前空間と、Prometheus サービスのアカウントおよびロール オブジェクトを削除します。
    注意: Grafana がデプロイされている場合は、この手順を実行しません。
    kubectl delete -f namespace-role.yaml
  5. Prometheus を再デプロイする場合は、シークレット prometheus-data-values を削除します。
    kubectl delete secret prometheus-data-values -n tanzu-system-monitoring

    予期される結果:secret "prometheus-data-values" deleted

Prometheus 拡張機能のアップグレード

既存の Prometheus 拡張機能がデプロイされている場合は、最新バージョンにアップグレードできます。
  1. Prometheus の構成マップをエクスポートし、バックアップとして保存します。
    kubectl get configmap prometheus -n tanzu-system-monitoring -o 'go-template={{ index .data "prometheus.yaml" }}' > prometheus-configmap.yaml
    
  2. 既存の Prometheus 環境を削除します。Prometheus 拡張機能の削除を参照してください。
  3. Prometheus 拡張機能をデプロイします。Prometheus 拡張機能のデプロイを参照してください。

Prometheus 拡張機能の構成

Prometheus の構成は、 /extensions/monitoring/prometheus/prometheus-data-values.yaml で設定されます。
表 1. Prometheus 構成パラメータ
パラメータ 説明 タイプ デフォルト
monitoring.namespace Prometheus がデプロイされる名前空間 文字列 tanzu-system-monitoring
monitoring.create_namespace フラグは、monitoring.namespace で指定された名前空間を作成するかどうかを示します boolean false
monitoring.prometheus_server.config.prometheus_yaml Prometheus に渡される Kubernetes クラスタ監視構成の詳細 yaml ファイル prometheus.yaml
monitoring.prometheus_server.config.alerting_rules_yaml Prometheus で定義された詳細なアラート ルール yaml ファイル alerting_rules.yaml
monitoring.prometheus_server.config.recording_rules_yaml Prometheus で定義された詳細なレコード ルール yaml ファイル recording_rules.yaml
monitoring.prometheus_server.service.type Prometheus を公開するサービスのタイプ。サポートされている値:ClusterIP 文字列 ClusterIP
monitoring.prometheus_server.enable_alerts.kubernetes_api Prometheus で Kubernetes API の SLO アラートを有効にする boolean true
monitoring.prometheus_server.sc.aws_type AWS 上の storageclass に定義された AWS タイプ 文字列 gp2
monitoring.prometheus_server.sc.aws_fsType AWS 上の storageclass に定義された AWS ファイル システム タイプ 文字列 ext4
monitoring.prometheus_server.sc.allowVolumeExpansion ボリュームの拡張が AWS 上の storageclass に許可されているかどうかを定義します boolean true
monitoring.prometheus_server.pvc.annotations ストレージ クラスの注釈 マップ {}
monitoring.prometheus_server.pvc.storage_class パーシステント ボリュームの要求に使用するストレージ クラス。これはデフォルトで null で、デフォルトのプロビジョナが使用されます 文字列 null
monitoring.prometheus_server.pvc.accessMode パーシステント ボリューム要求に対しアクセス モードを定義します。サポートされている値:ReadWriteOnce、ReadOnlyMany、ReadWriteMany 文字列 ReadWriteOnce
monitoring.prometheus_server.pvc.storage パーシステント ボリューム要求に対しストレージ サイズを定義します 文字列 8Gi
monitoring.prometheus_server.deployment.replicas prometheus レプリカの数 整数型 1
monitoring.prometheus_server.image.repository Prometheus イメージを含むリポジトリの場所。デフォルトは、パブリック VMware レジストリです。プライベート リポジトリを使用している場合は(エアギャップ環境など)、この値を変更します。 文字列 projects.registry.vmware.com/tkg/prometheus
monitoring.prometheus_server.image.name Prometheus イメージの名前 文字列 prometheus
monitoring.prometheus_server.image.tag Prometheus イメージ タグ。バージョンをアップグレードしている場合は、この値の更新が必要になることがあります。 文字列 v2.17.1_vmware.1
monitoring.prometheus_server.image.pullPolicy Prometheus イメージ プル ポリシー 文字列 IfNotPresent
monitoring.alertmanager.config.slack_demo Alertmanager のスラック通知構成 文字列
slack_demo:
  name: slack_demo
  slack_configs:
  - api_url: https://hooks.slack.com
    channel: '#alertmanager-test'
monitoring.alertmanager.config.email_receiver Alertmanager の E メール通知構成 文字列
email_receiver:
  name: email-receiver
  email_configs:
  - to: [email protected]
    send_resolved: false
    from: [email protected]
    smarthost: smtp.eample.com:25
    require_tls: false
monitoring.alertmanager.service.type Alertmanager を公開するサービスのタイプ。サポートされている値:ClusterIP 文字列 ClusterIP
monitoring.alertmanager.image.repository Alertmanager イメージを含むリポジトリの場所。デフォルトは、パブリック VMware レジストリです。プライベート リポジトリを使用している場合は(エアギャップ環境など)、この値を変更します。 文字列 projects.registry.vmware.com/tkg/prometheus
monitoring.alertmanager.image.name Alertmanager イメージの名前 文字列 alertmanager
monitoring.alertmanager.image.tag Alertmanager イメージ タグ。バージョンをアップグレードしている場合は、この値の更新が必要になることがあります。 文字列 v0.20.0_vmware.1
monitoring.alertmanager.image.pullPolicy Alertmanager イメージ プル ポリシー 文字列 IfNotPresent
monitoring.alertmanager.pvc.annotations ストレージ クラスの注釈 マップ {}
monitoring.alertmanager.pvc.storage_class パーシステント ボリュームの要求に使用するストレージ クラス。これはデフォルトで null で、デフォルトのプロビジョナが使用されます。 文字列 null
monitoring.alertmanager.pvc.accessMode パーシステント ボリューム要求に対しアクセス モードを定義します。サポートされている値:ReadWriteOnce、ReadOnlyMany、ReadWriteMany 文字列 ReadWriteOnce
monitoring.alertmanager.pvc.storage パーシステント ボリューム要求に対しストレージ サイズを定義します 文字列 2Gi
monitoring.alertmanager.deployment.replicas alertmanager レプリカの数 整数型 1
monitoring.kube_state_metrics.image.repository kube-state-metircs イメージを含むリポジトリ。デフォルトは、パブリック VMware レジストリです。プライベート リポジトリを使用している場合は(エアギャップ環境など)、この値を変更します。 文字列 projects.registry.vmware.com/tkg/prometheus
monitoring.kube_state_metrics.image.name kube-state-metircs イメージの名前 文字列 kube-state-metrics
monitoring.kube_state_metrics.image.tag kube-state-metircs イメージ タグ。バージョンをアップグレードしている場合は、この値の更新が必要になることがあります。 文字列 v1.9.5_vmware.1
monitoring.kube_state_metrics.image.pullPolicy kube-state-metircs イメージ プル ポリシー 文字列 IfNotPresent
monitoring.kube_state_metrics.deployment.replicas kube-state-metrics レプリカの数 整数型 1
monitoring.node_exporter.image.repository node-exporter イメージを含むリポジトリ。デフォルトは、パブリック VMware レジストリです。プライベート リポジトリを使用している場合は(エアギャップ環境など)、この値を変更します。 文字列 projects.registry.vmware.com/tkg/prometheus
monitoring.node_exporter.image.name node-exporter イメージの名前 文字列 node-exporter
monitoring.node_exporter.image.tag node-exporter イメージ タグ。バージョンをアップグレードしている場合は、この値の更新が必要になることがあります。 文字列 v0.18.1_vmware.1
monitoring.node_exporter.image.pullPolicy node-exporter イメージ プル ポリシー 文字列 IfNotPresent
monitoring.node_exporter.hostNetwork ポッドが hostNetwork: true に設定されている場合は、そのポッドで、ネットワークの名前空間とノードのネットワーク リソースを使用できます。 boolean false
monitoring.node_exporter.deployment.replicas node-exporter レプリカの数 整数型 1
monitoring.pushgateway.image.repository pushgateway イメージを含むリポジトリ。デフォルトは、パブリック VMware レジストリです。プライベート リポジトリを使用している場合は(エアギャップ環境など)、この値を変更します。 文字列 projects.registry.vmware.com/tkg/prometheus
monitoring.pushgateway.image.name pushgateway イメージの名前 文字列 pushgateway
monitoring.pushgateway.image.tag pushgateway イメージ タグ。バージョンをアップグレードしている場合は、この値の更新が必要になることがあります。 文字列 v1.2.0_vmware.1
monitoring.pushgateway.image.pullPolicy pushgateway イメージ プル ポリシー 文字列 IfNotPresent
monitoring.pushgateway.deployment.replicas pushgateway レプリカの数 整数型 1
monitoring.cadvisor.image.repository cadvisor イメージを含むリポジトリ。デフォルトは、パブリック VMware レジストリです。プライベート リポジトリを使用している場合は(エアギャップ環境など)、この値を変更します。 文字列 projects.registry.vmware.com/tkg/prometheus
monitoring.cadvisor.image.name cadvisor イメージの名前 文字列 cadvisor
monitoring.cadvisor.image.tag cadvisor イメージ タグ。バージョンをアップグレードしている場合は、この値の更新が必要になることがあります。 文字列 v0.36.0_vmware.1
monitoring.cadvisor.image.pullPolicy cadvisor イメージ プル ポリシー 文字列 IfNotPresent
monitoring.cadvisor.deployment.replicas cadvisor レプリカの数 整数型 1
monitoring.ingress.enabled prometheus および alertmanager に対し ingress を有効または無効にします boolean

false

ingress を使用するには、このフィールドを true に設定して、Contourをデプロイします。Prometheus にアクセスするには、/etc/hosts をワーカー ノードの IP アドレスにマッピングするエントリを使用して、ローカル prometheus.system.tanzu を更新します。

monitoring.ingress.virtual_host_fqdn Prometheus および Alertmanager にアクセスするホスト名 文字列 prometheus.system.tanzu
monitoring.ingress.prometheus_prefix prometheus のパス プリフィックス 文字列 /
monitoring.ingress.alertmanager_prefix alertmanager のパス プリフィックス 文字列 /alertmanager/
monitoring.ingress.tlsCertificate.tls.crt 独自の TLS 証明書を使用する場合は、ingress のオプション証明書。自己署名証明書はデフォルトで生成されます 文字列 Generated cert
monitoring.ingress.tlsCertificate.tls.key 独自の TLS 証明書を使用する場合は、ingress のオプション証明書プライベート キー。 文字列 Generated cert key
表 2. Prometheus_Server Configmap の構成可能フィールド
パラメータ 説明 タイプ デフォルト
evaluation_interval ルールを評価する頻度 duration 1m
scrape_interval ターゲットを取得する頻度 duration 1m
scrape_timeout 取得要求がタイムアウトになるまでの期間 duration 10s
rule_files ルール ファイルは glob のリストを指定します。ルールとアラートは、一致するすべてのファイルから読み取られます yaml ファイル
scrape_configs 取得構成のリスト。 リスト
job_name デフォルトで取得されたメトリックに割り当てられたジョブ名 文字列
kubernetes_sd_configs Kubernetes サービス検出構成のリスト。 リスト
relabel_configs ターゲット再ラベル付け構成のリスト。 リスト
action 正規表現の一致に基づいて実行するアクション。 文字列
regex 抽出された値が一致する正規表現。 文字列
source_labels ソース ラベルは、既存のラベルから値を選択します。 文字列
scheme 要求に使用されるプロトコル スキームを構成します。 文字列
tls_config 取得要求の TLS 設定を構成します。 文字列
ca_file API サーバ証明書を検証する CA 証明書。 ファイル名
insecure_skip_verify サーバ証明書の検証を無効にします。 boolean
bearer_token_file オプションのベアラー トークン ファイル認証情報。 ファイル名
replacement 正規表現が一致する場合に正規表現の置き換えが実行される置き換え値。 文字列
target_label 結果値が置換アクションで書き込まれるラベル。 文字列
表 3. Alertmanager Configmap の構成可能フィールド
パラメータ 説明 タイプ デフォルト
resolve_timeout ResolveTimeout は、アラートに EndsAt が含まれていない場合に alertmanager によって使用されるデフォルト値です duration 5m
smtp_smarthost E メールが送信される SMTP ホスト。 duration 1m
slack_api_url スラック Webhook URL。 文字列 global.slack_api_url
pagerduty_url API 要求の送信先の pagerduty URL。 文字列 global.pagerduty_url
テンプレート カスタム通知テンプレート定義を読み取るためのファイル ファイルのパス
group_by アラートをラベルでグループ化します 文字列
group_interval グループに追加された新しいアラートに関する通知を送信するまでの待機時間を設定 duration 5m
group_wait アラートのグループに関する通知を最初に送信するまでの待機時間 duration 30s
repeat_interval 通知がアラートに対してすでに正常に送信されている場合に再送信するまでの待機時間 duration 4h
receivers 通知受信者のリスト。 リスト
severity インシデントの重要度。 文字列
channel 通知の送信先となるチャネルまたはユーザー。 文字列
html E メール通知の HTML 本文。 文字列
text E メール通知のテキスト本文。 文字列
send_resolved 解決済みアラートについて通知するかどうか。 ファイル名
email_configs E メール統合の構成 boolean
ポッドの注釈により、取得プロセスの適切な管理が可能になります。これらの注釈は、ポッド メタデータの一部である必要があります。Services、DaemonSets などのその他のオブジェクトで設定されている場合は無効になります。
表 4. Prometheus ポッドの注釈
ポッドの注釈 説明
prometheus.io/scrape デフォルトの構成ではすべてのポッドが取得されます。false に設定した場合、この注釈はポッドを取得プロセスから除外します。
prometheus.io/path メトリック パスが /metrics ではない場合、この注釈を使用して定義します。
prometheus.io/port ポッドをポッドの宣言されたポートではなく、指示されたポートで取得します(宣言がない場合、デフォルトはポートなしターゲットです)。
以下の DaemonSet マニフェストは、ポート 9102 ですべてのポッドを取得するように Prometheus に指示します。
apiVersion: apps/v1beta2 # for versions before 1.8.0 use extensions/v1beta1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: weave
  labels:
    app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
      annotations:
        prometheus.io/scrape: 'true'
        prometheus.io/port: '9102'
    spec:
      containers:
      - name: fluentd-elasticsearch
        image: gcr.io/google-containers/fluentd-elasticsearch:1.20