Prometheus で探索対象の ServiceMonitor を広げる
Kubernetes クラスタで Prometheus を導入し,ServiceMonitor を作って監視対象を定義したところ,一向に Target として追加されないことがありました。
ServiceMonitor が作られているだけでは不十分で,Prometheus の探索する対象に入っている必要があります。それがどこで定義されているかを調べました。
以下のような ServiceMonitor を考えます。
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: example-service-monitor
namespace: prometheus
labels:
app: prometheus
spec:
# 省略
ServiceMonitor のある Namespace
まず探索対象の ServiceMonitor が存在する Namespace を指定します。
定義箇所
Prometheus リソースの spec.serviceMonitorNamespaceSelector です。
LabelSelector 形式で定義するので,matchExpressions と matchLabelsが使えます。
デフォルトでは Prometheus リソースが存在する Namespace のみ探索します。
Namespace 名の列挙による指定
Namespace 名の列挙で指定する場合,各 Namespace の kubernetes.io/metadata.name というラベルに名称が入っているので,これを利用して完全一致で列挙します。
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
spec:
serviceMonitorNamespaceSelector:
matchExpressions:
- key: kubernetes.io/metadata.name
operator: In
values:
- monitoring
- prometheus
- default
kube-prometheus-stack の場合
kube-prometheus-stack で Prometheus を立ち上げている場合, prometheus.prometheusSpec.serviceMonitorNamespaceSelector という変数で指定できます。上記の例では matchExpressions 以下を値にします。
ServiceMonitor のラベル
次に ServiceMonitor に付けられたラベルで絞り込みます。
定義箇所
Prometheus リソース の spec.serviceMonitorSelector です。
Namespace と同様に LabelSelector 形式で定義します。
デフォルトではすべての ServiceMonitor が選択されます。
ServiceMonitor に付けられたラベルによる絞り込み
例えば app: prometheus というラベルが付いた ServiceMonitor を絞り込みたい場合は,matchLabels を使って以下のように記述します。
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
spec:
serviceMonitorSelector:
matchLabels:
app: prometheus
kube-prometheus-stack の場合
kube-prometheus-stack で Prometheus を立ち上げている場合, prometheus.prometheusSpec.serviceMonitorSelector という変数で指定できます。上記の例では matchLabels 以下を値にします。
prometheus.prometheusSpec.seviceMonitorSelector が空で,prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues が true であれば,Helm の release を元にしたラベルが適用されます。
文中のリンク以外に参考にしたページ
Discussion