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