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
とwidgetFailures
コレクターをグローバル変数として宣言してコントローラーのパッケージの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: memcached-operator-system 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.com
metrics
API を作成します。この例では、Testmetrics
という名前のkind
を使用しています。$ operator-sdk create api \ --group metrics \ --version v1 \ --kind Testmetrics \ --generate-role
roles/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 を実行します。たとえば、"run as a deployment" メソッドを使用するには、次のようにします。
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