5.10. Prometheus による組み込みモニターリングの設定

以下では、Prometheus Operator を使用して Operator SDK いよって提供されるビルトインされたモニタリングサポートについて説明し、Operator 作成者がどのように使用できるかについて詳しく説明します。

5.10.1. Prometheus Operator のサポート

Prometheus はオープンソースのシステムモニタリングおよびアラートツールキットです。Prometheus Operator は、 OpenShift Container Platform などの Kubernetes ベースのクラスターで実行される Prometheus クラスターを作成し、設定し、管理します。

ヘルパー関数は、デフォルトで Operator SDK に存在し、Prometheus Operator がデプロイされているクラスターで使用できるように生成された Go ベースの Operator にメトリクスを自動的にセットアップします。

5.10.2. メトリクスヘルパー

Operator SDK を使用して生成される Go ベース Operator では、以下の関数が実行中のプログラムについての一般的なメトリクスを公開します。

func ExposeMetricsPort(ctx context.Context, port int32) (*v1.Service, error)

これらのメトリクスは controller-runtime ライブラリー API から継承されます。メトリクスはデフォルトで 0.0.0.0:8383/metrics で提供されます。

Service オブジェクトは、メトリクスポートが公開された状態で作成されます。これはその後 Prometheus によってアクセスされます。Service オブジェクトは、リーダー Pod の root オーナーが削除されるとガベージコレクションの対象になります。

以下のサンプルは、Operator SDK を使用して生成されるすべての Operator の cmd/manager/main.go ファイルにあります。

import(
    "github.com/operator-framework/operator-sdk/pkg/metrics"
    "machine.openshift.io/controller-runtime/pkg/manager"
)

var (
    // Change the below variables to serve metrics on a different host or port.
    metricsHost       = "0.0.0.0" 1
    metricsPort int32 = 8383 2
)
...
func main() {
    ...
    // Pass metrics address to controller-runtime manager
    mgr, err := manager.New(cfg, manager.Options{
        Namespace:          namespace,
        MetricsBindAddress: fmt.Sprintf("%s:%d", metricsHost, metricsPort),
    })

    ...
    // Create Service object to expose the metrics port.
    _, err = metrics.ExposeMetricsPort(ctx, metricsPort)
    if err != nil {
        // handle error
        log.Info(err.Error())
    }
    ...
}
1
メトリクスの公開に使用されるホスト。
2
メトリクスの公開に使用されるポート。

5.10.2.1. メトリクスポートの変更

Operator の作成者は、メトリクスが公開されるポートを変更できます。

前提条件

  • Operator SDK を使用して生成される Go ベースの Operator
  • Prometheus Operator がデプロイされた Kubernetes ベースのクラスター

手順

  • 生成された Operator の cmd/manager/main.go ファイルで、以下の行の metricsPort の値を変更します。

    var metricsPort int32 = 8383

5.10.3. サービスモニター

ServiceMonitor は、Prometheus Operator によって提供されるカスタマーリソースであり、 Service オブジェクトで Endpoints を検出し、Prometheus がこれらの Pod を監視するように設定します。

Operator SDK を使用して生成される Go ベースの Operator では、GenerateServiceMonitor() ヘルパー関数は Service オブジェクトを取り、これに基づいて ServiceMonitor オブジェクトを生成することができます。

関連情報

5.10.3.1. サービスモニターの作成

Operator の作成者は、新規に作成されるサービスを受け入れる metrics.CreateServiceMonitor() ヘルパー関数を使用して、作成されたモニターリングサービスのサービスターゲット検出を追加できます。

前提条件

  • Operator SDK を使用して生成される Go ベースの Operator
  • Prometheus Operator がデプロイされた Kubernetes ベースのクラスター

手順

  • metrics.CreateServiceMonitor() ヘルパー関数を Operator コードに追加します。

    import(
        "k8s.io/api/core/v1"
        "github.com/operator-framework/operator-sdk/pkg/metrics"
        "machine.openshift.io/controller-runtime/pkg/client/config"
    )
    func main() {
    
        ...
        // Populate below with the Service(s) for which you want to create ServiceMonitors.
        services := []*v1.Service{}
        // Create one ServiceMonitor per application per namespace.
        // Change the below value to name of the Namespace you want the ServiceMonitor to be created in.
        ns := "default"
        // restConfig is used for talking to the Kubernetes apiserver
        restConfig := config.GetConfig()
    
        // Pass the Service(s) to the helper function, which in turn returns the array of ServiceMonitor objects.
        serviceMonitors, err := metrics.CreateServiceMonitors(restConfig, ns, services)
        if err != nil {
            // Handle errors here.
        }
        ...
    }