5.13. Prometheus による組み込みモニタリングの設定
本書では、Prometheus Operator を使用して Operator SDK が提供する組み込みの監視サポートについて説明し、Go ベースおよび Ansible ベースの Operator の作成者向けの使用法を詳説します。
5.13.1. Prometheus Operator のサポート
Prometheus はオープンソースのシステムモニタリングおよびアラートツールキットです。Prometheus Operator は、 OpenShift Container Platform などの Kubernetes ベースのクラスターで実行される Prometheus クラスターを作成し、設定し、管理します。
ヘルパー関数は、デフォルトで Operator SDK に存在し、Prometheus Operator がデプロイされているクラスターで使用できるように生成された Go ベースの Operator にメトリックを自動的にセットアップします。
5.13.2. Go ベースの Operator のカスタムメトリックの公開
Operator の作成者は、controller-runtime/pkg/metricsライブラリーのグローバル Prometheus レジストリーを使用してカスタムメトリックを公開できます。
前提条件
- Operator SDK を使用して生成される Go ベースの Operator
- Prometheus Operator。デフォルトで OpenShift Container Platform クラスターにデプロイされます
手順
Operator SDK プロジェクトで、
config/default/kustomization.yamlファイルの次の行のコメントを解除します。../prometheus
カスタムコントローラークラスを作成して、Operator からの追加のメトリックを公開します。次の例では、
widgetsとwidget Failuresコレクターをグローバル変数として宣言してコントローラーのパッケージのinit()関数に登録します。例5.18
controllers/memcached_controller_test_metrics.goファイルpackage controllers import ( "github.com/prometheus/client_golang/prometheus" "sigs.k8s.io/controller-runtime/pkg/metrics" ) var ( widgets = prometheus.NewCounter( prometheus.CounterOpts{ Name: "widgets_total", Help: "Number of widgets processed", }, ) widgetFailures = prometheus.NewCounter( prometheus.CounterOpts{ Name: "widget_failures_total", Help: "Number of failed widgets", }, ) ) func init() { // Register custom metrics with the global prometheus registry metrics.Registry.MustRegister(widgets, widgetFailures) }mainコントローラークラスの調整ループの任意の部分から、これらのコレクターに記録し、これをもとにメトリックのビジネスロジックを決定します。例5.19
controllers/memcached_controller.goファイルfunc (r *MemcachedReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { ... ... // Add metrics widgets.Inc() widgetFailures.Inc() return ctrl.Result{}, nil }Operator をビルドし、プッシュします。
$ make docker-build docker-push IMG=<registry>/<user>/<image_name>:<tag>
Operator をデプロイします。
$ make deploy IMG=<registry>/<user>/<image_name>:<tag>
ロールおよびロールバインディング定義を作成して、Operator のサービスモニターが OpenShift Container Platform クラスターの Prometheus インスタンスによってスクレイプされるようにします。
サービスアカウントに namespace のメトリックをスクレイプする権限が指定されるように、ロールを割り当てる必要があります。
例5.20
config/prometheus/role.yamlロールapiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: prometheus-k8s-role namespace: <operator_namespace> rules: - apiGroups: - "" resources: - endpoints - pods - services - nodes - secrets verbs: - get - list - watch例5.21
config/prometheus/rolebinding.yamlロールバインディングapiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: prometheus-k8s-rolebinding namespace: memcached-operator-system roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: prometheus-k8s-role subjects: - kind: ServiceAccount name: prometheus-k8s namespace: openshift-monitoringデプロイされた Operator にロールとロールバインディングを適用します。
$ oc apply -f config/prometheus/role.yaml
$ oc apply -f config/prometheus/rolebinding.yaml
スクレイプするネームスペースのラベルを設定します。これにより、そのネームスペースの OpenShift クラスターモニタリングが有効になります。
$ oc label namespace <operator_namespace> openshift.io/cluster-monitoring="true"
検証
-
OpenShift Container Platform Web コンソールでメトリックを照会および表示します。カスタムコントローラークラスで設定された名前 (
widgets_totalやwidget_failures_totalなど) を使用できます。
5.13.3. Ansible ベースの Operator のカスタムメトリックの公開
Ansible ベースの Operator を作成する Operator 作成者は、Operator SDK のosdk_metricsモジュールを使用して、カスタムの Operator および Operand メトリックの公開、イベントの発行、ログのサポートが可能です。
前提条件
- Operator SDK を使用して生成される Ansible ベースの Operator
- Prometheus Operator。デフォルトで OpenShift Container Platform クラスターにデプロイされます
手順
Ansible ベースの Operator を生成します。この例では、
testmetrics.comドメインを使用しています。$ operator-sdk init \ --plugins=ansible \ --domain=testmetrics.commetricsAPI を作成します。この例では、Testmetricsという名前のkindを使用しています。$ operator-sdk create api \ --group metrics \ --version v1 \ --kind Testmetrics \ --generate-roleroles/testmetrics/tasks/main.ymlファイルを編集し、osdk_metricsモジュールを使用して Operator プロジェクトのカスタムメトリックを作成します。例5.22
roles/testmetrics/tasks/main.ymlファイルの例--- # tasks file for Memcached - name: start k8sstatus k8s: definition: kind: Deployment apiVersion: apps/v1 metadata: name: '{{ ansible_operator_meta.name }}-memcached' namespace: '{{ ansible_operator_meta.namespace }}' spec: replicas: "{{size}}" selector: matchLabels: app: memcached template: metadata: labels: app: memcached spec: containers: - name: memcached command: - memcached - -m=64 - -o - modern - -v image: "docker.io/memcached:1.4.36-alpine" ports: - containerPort: 11211 - osdk_metric: name: my_thing_counter description: This metric counts things counter: {} - osdk_metric: name: my_counter_metric description: Add 3.14 to the counter counter: increment: yes - osdk_metric: name: my_gauge_metric description: Create my gauge and set it to 2. gauge: set: 2 - osdk_metric: name: my_histogram_metric description: Observe my histogram histogram: observe: 2 - osdk_metric: name: my_summary_metric description: Observe my summary summary: observe: 2
検証
クラスターで Operator を実行します。たとえば、デプロイメントとして実行メソッドを使用するには、次のようにします。
Operator イメージをビルドし、これをレジストリーにプッシュします。
$ make docker-build docker-push IMG=<registry>/<user>/<image_name>:<tag>
Operator をクラスターにインストールします。
$ make install
Operator をデプロイします。
$ make deploy IMG=<registry>/<user>/<image_name>:<tag>
Testmetricsカスタムリソース (CR) を作成します。CR 仕様を定義します。
例5.23
config/samples/metrics_v1_testmetrics.yamlファイルの例apiVersion: metrics.testmetrics.com/v1 kind: Testmetrics metadata: name: testmetrics-sample spec: size: 1
オブジェクトを作成します。
$ oc create -f config/samples/metrics_v1_testmetrics.yaml
Pod の詳細を取得します。
$ oc get pods
出力例
NAME READY STATUS RESTARTS AGE ansiblemetrics-controller-manager-<id> 2/2 Running 0 149m testmetrics-sample-memcached-<id> 1/1 Running 0 147m
エンドポイントの詳細を取得します。
$ oc get ep
出力例
NAME ENDPOINTS AGE ansiblemetrics-controller-manager-metrics-service 10.129.2.70:8443 150m
カスタムメトリックトークンをリクエストします。
$ token=`oc create token prometheus-k8s -n openshift-monitoring`
メトリック値を確認します。
my_counter_metric値を確認します。$ oc exec ansiblemetrics-controller-manager-<id> -- curl -k -H "Authoriza tion: Bearer $token" 'https://10.129.2.70:8443/metrics' | grep my_counter
出力例
HELP my_counter_metric Add 3.14 to the counter TYPE my_counter_metric counter my_counter_metric 2
my_gauge_metric値を確認します。$ oc exec ansiblemetrics-controller-manager-<id> -- curl -k -H "Authoriza tion: Bearer $token" 'https://10.129.2.70:8443/metrics' | grep gauge
出力例
HELP my_gauge_metric Create my gauge and set it to 2.
my_histogram_metricとmy_summary_metricの値を確認します。$ oc exec ansiblemetrics-controller-manager-<id> -- curl -k -H "Authoriza tion: Bearer $token" 'https://10.129.2.70:8443/metrics' | grep Observe
出力例
HELP my_histogram_metric Observe my histogram HELP my_summary_metric Observe my summary