在 servcie 中配置 annotation,通过 endpoints 发现是一种比较好的方式。
为 service 配置 annotation:
annotations:
prometheus.io/scrape: "true"
prometheus.io/scheme: "http"
prometheus.io/path: "/metrics"
prometheus.io/port: "8888"
在 prometheus 中配置 endpoints 发现,通过 endpoints 发现的 target 会把对应 service、pod 的 annotation 一同带过来,所以下面的配置中可以使用 __meta_kubernetes_service_annotation...
:
- job_name: 'kubernetes-service-endpoints'
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
# kubernetes 服务单独在 kubernetes-apiservers 中采集
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_service_name]
action: replace
target_label: kubernetes_service_name
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] # 如果 prometheus.io/scrape: "true" 则采集
action: keep
regex: true
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
action: replace
target_label: __scheme__
regex: (https?)
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] # metrics 路径
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__,__meta_kubernetes_service_annotation_prometheus_io_port] # 采集地址
action: replace
target_label: __address__
regex: (.+)(?::\d+);(\d+)
replacement: $1:$2
然后在 prometheus 的 Service Discovery 和 Targets 中可以发现对应的 pod。