infra/ansible/roles/prometheus/templates/prometheus.yml.j2
Graham McIntire e1274bc63b
prom: feed home-cluster metrics + provision standard k8s dashboards
Cluster-side:
- Deploy kube-state-metrics (kube-system) for cluster-state series.
- Deploy node-exporter DaemonSet on all 7 nodes via the new monitoring ns
  (privileged PSS, hostNetwork, read-only host mounts).
- Both managed by ArgoCD apps under home/cluster/argocd/apps/.

Prometheus-side:
- Replace direct pod-IP scraping (which can't reach the 10.244.0.0/16 pod
  network from outside the cluster) with API-server-proxy scraping for
  both Services and Pods. Now one target per pod, all healthy.
- Extend external Prometheus RBAC with services/proxy + pods/proxy.

Grafana-side:
- Add file-based dashboard provisioner; ship 5 standard dashboards
  (Node Exporter Full, k8s cluster-via-prometheus, k8s all-in-one,
  k8s monitoring, Prometheus 2.0 overview).

prom.w5isp.com:3000 now shows live data for all 7 cluster nodes plus
the prom host itself.
2026-05-08 10:08:32 -05:00

209 lines
7.6 KiB
Django/Jinja

{{ ansible_managed | comment }}
global:
scrape_interval: {{ prometheus_scrape_interval }}
evaluation_interval: {{ prometheus_evaluation_interval }}
external_labels:
monitor: prom-w5isp
cluster: home-cluster
rule_files:
- {{ prometheus_config_dir }}/rules/*.yml
alerting:
alertmanagers:
- static_configs:
- targets:
{% for t in prometheus_alertmanager_targets %}
- "{{ t }}"
{% endfor %}
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ["127.0.0.1:9090"]
- job_name: node_exporter_local
static_configs:
- targets: ["127.0.0.1:9100"]
labels:
instance: prom.w5isp.com
{% if prometheus_k8s_enabled %}
# ---- Kubernetes home-cluster scraping ----
# Uses a ServiceAccount bearer token + CA cert provisioned out-of-band; see role README.
- job_name: kubernetes-apiservers
kubernetes_sd_configs:
- role: endpoints
api_server: {{ prometheus_k8s_api_server }}
tls_config:
ca_file: {{ prometheus_k8s_ca_file }}
bearer_token_file: {{ prometheus_k8s_token_file }}
scheme: https
tls_config:
ca_file: {{ prometheus_k8s_ca_file }}
bearer_token_file: {{ prometheus_k8s_token_file }}
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
- job_name: kubernetes-nodes
kubernetes_sd_configs:
- role: node
api_server: {{ prometheus_k8s_api_server }}
tls_config:
ca_file: {{ prometheus_k8s_ca_file }}
bearer_token_file: {{ prometheus_k8s_token_file }}
scheme: https
tls_config:
ca_file: {{ prometheus_k8s_ca_file }}
insecure_skip_verify: true
bearer_token_file: {{ prometheus_k8s_token_file }}
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: {{ prometheus_k8s_api_server | regex_replace('^https?://', '') }}
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics
- job_name: kubernetes-cadvisor
kubernetes_sd_configs:
- role: node
api_server: {{ prometheus_k8s_api_server }}
tls_config:
ca_file: {{ prometheus_k8s_ca_file }}
bearer_token_file: {{ prometheus_k8s_token_file }}
scheme: https
tls_config:
ca_file: {{ prometheus_k8s_ca_file }}
insecure_skip_verify: true
bearer_token_file: {{ prometheus_k8s_token_file }}
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: {{ prometheus_k8s_api_server | regex_replace('^https?://', '') }}
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
# Scrape annotated pods via the API server proxy (one target per pod).
# Requires `prometheus.io/scrape: "true"` and `prometheus.io/port: "<n>"` on the Pod.
- job_name: kubernetes-pods
kubernetes_sd_configs:
- role: pod
api_server: {{ prometheus_k8s_api_server }}
tls_config:
ca_file: {{ prometheus_k8s_ca_file }}
bearer_token_file: {{ prometheus_k8s_token_file }}
scheme: https
tls_config:
ca_file: {{ prometheus_k8s_ca_file }}
insecure_skip_verify: true
bearer_token_file: {{ prometheus_k8s_token_file }}
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: "true"
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port]
action: keep
regex: .+
- source_labels: [__meta_kubernetes_pod_phase]
action: keep
regex: Running
- target_label: __address__
replacement: {{ prometheus_k8s_api_server | regex_replace('^https?://', '') }}
- source_labels:
- __meta_kubernetes_namespace
- __meta_kubernetes_pod_name
- __meta_kubernetes_pod_annotation_prometheus_io_port
- __meta_kubernetes_pod_annotation_prometheus_io_path
regex: (.+);(.+);(.+);(.+)
target_label: __metrics_path__
replacement: /api/v1/namespaces/$1/pods/$2:$3/proxy$4
- source_labels:
- __meta_kubernetes_namespace
- __meta_kubernetes_pod_name
- __meta_kubernetes_pod_annotation_prometheus_io_port
- __meta_kubernetes_pod_annotation_prometheus_io_path
regex: (.+);(.+);(.+);
target_label: __metrics_path__
replacement: /api/v1/namespaces/$1/pods/$2:$3/proxy/metrics
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
target_label: namespace
- source_labels: [__meta_kubernetes_pod_name]
target_label: pod
- source_labels: [__meta_kubernetes_pod_node_name]
target_label: instance
# Scrape annotated services via the API server proxy. Pod IPs (10.244.0.0/16)
# aren't routable from outside the cluster, so we tunnel through the apiserver.
# Requires `prometheus.io/scrape: "true"` and `prometheus.io/port: "<n>"` on the Service.
# `prometheus.io/path` is optional; defaults to /metrics.
- job_name: kubernetes-services
kubernetes_sd_configs:
- role: service
api_server: {{ prometheus_k8s_api_server }}
tls_config:
ca_file: {{ prometheus_k8s_ca_file }}
bearer_token_file: {{ prometheus_k8s_token_file }}
scheme: https
tls_config:
ca_file: {{ prometheus_k8s_ca_file }}
insecure_skip_verify: true
bearer_token_file: {{ prometheus_k8s_token_file }}
relabel_configs:
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
action: keep
regex: "true"
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_port]
action: keep
regex: .+
- target_label: __address__
replacement: {{ prometheus_k8s_api_server | regex_replace('^https?://', '') }}
# With a path annotation, use it; otherwise fall through to the next rule (default /metrics).
- source_labels:
- __meta_kubernetes_namespace
- __meta_kubernetes_service_name
- __meta_kubernetes_service_annotation_prometheus_io_port
- __meta_kubernetes_service_annotation_prometheus_io_path
regex: (.+);(.+);(.+);(.+)
target_label: __metrics_path__
replacement: /api/v1/namespaces/$1/services/$2:$3/proxy$4
- source_labels:
- __meta_kubernetes_namespace
- __meta_kubernetes_service_name
- __meta_kubernetes_service_annotation_prometheus_io_port
- __meta_kubernetes_service_annotation_prometheus_io_path
regex: (.+);(.+);(.+);
target_label: __metrics_path__
replacement: /api/v1/namespaces/$1/services/$2:$3/proxy/metrics
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
target_label: namespace
- source_labels: [__meta_kubernetes_service_name]
target_label: service
{% endif %}
{% for sc in prometheus_extra_scrape_configs %}
- job_name: {{ sc.job_name }}
static_configs:
- targets:
{% for t in sc.targets %}
- "{{ t }}"
{% endfor %}
{% if sc.labels is defined %}
labels:
{% for k, v in sc.labels.items() %}
{{ k }}: "{{ v }}"
{% endfor %}
{% endif %}
{% endfor %}