Replace shared redis-exporter VMPodScrape with per-app scrapes
ci/woodpecker/pr/vector-test Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
ci/woodpecker/pr/kubeconform Pipeline was successful

Per review: drop the cross-namespace label-selector approach. Each app now
carries its own VMPodScrape next to its redis/valkey manifests, selecting on
the deployment's existing pod labels (mirroring the arrstack exportarr
pattern), so no opt-in monitoring.unkin.net/redis-exporter label is needed.

- Remove the monitoring.unkin.net/redis-exporter pod label from the
  artifactapi/authentik/litellm redis and gitea/netbox valkey deployments
- Delete apps/base/observability/vmpodscrape-redis.yaml
- Add a local-namespace VMPodScrape (port metrics, path /metrics) to
  artifactapi, authentik, litellm (app=redis), gitea (app=gitea-valkey),
  netbox (app=netbox-valkey), and jellyfin (valkey-operator node labels)
This commit is contained in:
2026-08-23 17:27:09 +10:00
parent a2cf77cace
commit 9b154d38f4
20 changed files with 107 additions and 49 deletions
+1
View File
@@ -18,4 +18,5 @@ resources:
- ui-hpa.yaml
- vaultauth.yaml
- vaultstaticsecret.yaml
- vmpodscrape.yaml
- vpa.yaml
@@ -13,7 +13,6 @@ spec:
metadata:
labels:
app: redis
monitoring.unkin.net/redis-exporter: "true"
spec:
containers:
- name: redis
+16
View File
@@ -0,0 +1,16 @@
---
# Scrape the redis_exporter sidecar (:9121) on the redis pod. Picked up by the
# observability VMAgent (selectAllByDefault). Pod-level rather than
# VMServiceScrape because the redis Service doesn't expose the metrics port.
apiVersion: operator.victoriametrics.com/v1beta1
kind: VMPodScrape
metadata:
name: redis-exporter
namespace: artifactapi
spec:
selector:
matchLabels:
app: redis
podMetricsEndpoints:
- port: metrics
path: /metrics
+1
View File
@@ -18,4 +18,5 @@ resources:
- redis-service.yaml
- vaultauth.yaml
- vaultstaticsecret.yaml
- vmpodscrape.yaml
- vpa.yaml
@@ -15,7 +15,6 @@ spec:
metadata:
labels:
app: redis
monitoring.unkin.net/redis-exporter: "true"
spec:
containers:
- name: redis
+16
View File
@@ -0,0 +1,16 @@
---
# Scrape the redis_exporter sidecar (:9121) on the redis pod. Picked up by the
# observability VMAgent (selectAllByDefault). Pod-level rather than
# VMServiceScrape because the redis Service doesn't expose the metrics port.
apiVersion: operator.victoriametrics.com/v1beta1
kind: VMPodScrape
metadata:
name: redis-exporter
namespace: authentik
spec:
selector:
matchLabels:
app: redis
podMetricsEndpoints:
- port: metrics
path: /metrics
+1
View File
@@ -10,6 +10,7 @@ resources:
- valkey-deployment.yaml
- valkey-pvc.yaml
- valkey-service.yaml
- vmpodscrape.yaml
- vaultauth.yaml
- vaultstaticsecret.yaml
- gateway.yaml
-1
View File
@@ -27,7 +27,6 @@ spec:
app: gitea-valkey
app.kubernetes.io/name: gitea
app.kubernetes.io/component: valkey
monitoring.unkin.net/redis-exporter: "true"
spec:
securityContext:
fsGroup: 999
+16
View File
@@ -0,0 +1,16 @@
---
# Scrape the redis_exporter sidecar (:9121) on the gitea-valkey pod. Picked up
# by the observability VMAgent (selectAllByDefault). Pod-level rather than
# VMServiceScrape because the valkey Service doesn't expose the metrics port.
apiVersion: operator.victoriametrics.com/v1beta1
kind: VMPodScrape
metadata:
name: valkey-exporter
namespace: gitea
spec:
selector:
matchLabels:
app: gitea-valkey
podMetricsEndpoints:
- port: metrics
path: /metrics
+1
View File
@@ -21,5 +21,6 @@ resources:
- pdb.yaml
- service.yaml
- valkey.yaml
- vmpodscrape.yaml
- gateway.yaml
- httproute.yaml
+2 -3
View File
@@ -28,9 +28,8 @@ spec:
# redis_exporter sidecar (:9121, port name `metrics`) on every ValkeyNode pod;
# the operator manages a dedicated _exporter ACL user for it. Image overridden
# from the operator default (bare dockerhub oliver006/redis_exporter:v1.80.0)
# to the artifactapi-proxied pin. Scraped by the valkey-operator VMPodScrape in
# apps/base/observability (operator pods get fixed labels only, so they need
# their own selector rather than monitoring.unkin.net/redis-exporter).
# to the artifactapi-proxied pin. Scraped by the valkey-exporter VMPodScrape
# in vmpodscrape.yaml alongside this file.
exporter:
enabled: true
image: artifactapi.k8s.syd1.au.unkin.net/dockerhub/oliver006/redis_exporter:v1.89.0
+19
View File
@@ -0,0 +1,19 @@
---
# Scrape the operator-injected redis_exporter sidecar (:9121, port name
# `metrics`) on the jellyfin-valkey ValkeyNode pods. The valkey-operator gives
# its pods fixed labels only (no pod-label passthrough on the ValkeyCluster CR),
# so select on the operator-managed labels. Picked up by the observability
# VMAgent (selectAllByDefault).
apiVersion: operator.victoriametrics.com/v1beta1
kind: VMPodScrape
metadata:
name: valkey-exporter
namespace: jellyfin
spec:
selector:
matchLabels:
app.kubernetes.io/managed-by: valkey-operator
app.kubernetes.io/component: valkey-node
podMetricsEndpoints:
- port: metrics
path: /metrics
+1
View File
@@ -16,6 +16,7 @@ resources:
- services.yaml
- vaultauth.yaml
- vaultstaticsecret.yaml
- vmpodscrape.yaml
- vpa.yaml
configMapGenerator:
-1
View File
@@ -15,7 +15,6 @@ spec:
metadata:
labels:
app: redis
monitoring.unkin.net/redis-exporter: "true"
spec:
containers:
- name: redis
+16
View File
@@ -0,0 +1,16 @@
---
# Scrape the redis_exporter sidecar (:9121) on the redis pod. Picked up by the
# observability VMAgent (selectAllByDefault). Pod-level rather than
# VMServiceScrape because the redis Service doesn't expose the metrics port.
apiVersion: operator.victoriametrics.com/v1beta1
kind: VMPodScrape
metadata:
name: redis-exporter
namespace: litellm
spec:
selector:
matchLabels:
app: redis
podMetricsEndpoints:
- port: metrics
path: /metrics
+1
View File
@@ -10,6 +10,7 @@ resources:
- valkey-deployment.yaml
- valkey-pvc.yaml
- valkey-service.yaml
- vmpodscrape.yaml
- vaultauth.yaml
- vaultstaticsecret.yaml
- gateway.yaml
-1
View File
@@ -27,7 +27,6 @@ spec:
app: netbox-valkey
app.kubernetes.io/name: netbox
app.kubernetes.io/component: valkey
monitoring.unkin.net/redis-exporter: "true"
spec:
securityContext:
fsGroup: 999
+16
View File
@@ -0,0 +1,16 @@
---
# Scrape the redis_exporter sidecar (:9121) on the netbox-valkey pod. Picked up
# by the observability VMAgent (selectAllByDefault). Pod-level rather than
# VMServiceScrape because the valkey Service doesn't expose the metrics port.
apiVersion: operator.victoriametrics.com/v1beta1
kind: VMPodScrape
metadata:
name: valkey-exporter
namespace: netbox
spec:
selector:
matchLabels:
app: netbox-valkey
podMetricsEndpoints:
- port: metrics
path: /metrics
@@ -9,5 +9,4 @@ resources:
- gateway.yaml
- httproute.yaml
- vmpodscrape-cnpg.yaml
- vmpodscrape-redis.yaml
- vmpodscrape-traefik.yaml
@@ -1,40 +0,0 @@
---
# Scrape metrics (:9121) from every redis/valkey pod carrying a redis_exporter
# sidecar in any namespace. Raw redis/valkey Deployments opt in via the
# monitoring.unkin.net/redis-exporter pod label. Picked up by the observability
# VMAgent (selectAllByDefault).
apiVersion: operator.victoriametrics.com/v1beta1
kind: VMPodScrape
metadata:
name: redis-exporters
namespace: observability
spec:
namespaceSelector:
any: true
selector:
matchLabels:
monitoring.unkin.net/redis-exporter: "true"
podMetricsEndpoints:
- port: metrics
path: /metrics
---
# valkey-operator-managed ValkeyCluster pods (e.g. jellyfin-valkey) get fixed
# operator labels only -- the ValkeyCluster CR has no pod-label passthrough, so
# they cannot carry monitoring.unkin.net/redis-exporter and need their own
# selector. The operator's exporter sidecar also listens on :9121 with a port
# named `metrics`.
apiVersion: operator.victoriametrics.com/v1beta1
kind: VMPodScrape
metadata:
name: valkey-operator-clusters
namespace: observability
spec:
namespaceSelector:
any: true
selector:
matchLabels:
app.kubernetes.io/managed-by: valkey-operator
app.kubernetes.io/component: valkey-node
podMetricsEndpoints:
- port: metrics
path: /metrics