Files
homelab/kubernetes/apps/monitoring/helmrelease-blackbox-exporter.yaml
T
atlas-botandClaude Opus 5.5 21a7583523
ci/woodpecker/pr/ci-manifests-test Pipeline was successful
ci/woodpecker/pr/ci-scripts-test Pipeline was successful
ci/woodpecker/pr/pr-review Pipeline was successful
ci: cite YAML by anchor instead of line number, and guard it (REN-183)
Comments that pointed at other YAML as `file.yaml:N` went stale on any
edit above the cited line; three drift fixes had been merged by hand
(REN-181). The cited block now carries `# anchor: <name>` and the
comment cites `path.yaml#<name>`.

- Sweep: all 32 line-number citations in YAML comments converted.
  Several were already stale at head and now point at the right block
  (see PR). Vendored files (Flux gotk-components, IMC CRD) get no
  anchor; those two citations name the object/schema path instead.
- Guard: scripts/ci/yaml-citations.sh in ci-manifests-test.yml; fails
  on a line-number citation or a path#name whose file/anchor is gone.
  Self-test in ci-scripts-test.yml.
- CONTRIBUTING.md: the convention in three lines.

Comment-only under kubernetes/: every file parses to identical objects
before and after, so Flux applies nothing and no ConfigMap data changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26 08:44:54 +00:00

146 lines
5.6 KiB
YAML

apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: blackbox-exporter
# anchor: namespace
namespace: monitoring
spec:
interval: 30m
chart:
spec:
chart: prometheus-blackbox-exporter
version: ">=9.0.0"
sourceRef:
kind: HelmRepository
name: prometheus-community
namespace: monitoring
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
values:
serviceMonitor:
enabled: true
defaults:
labels:
# Not required for discovery — serviceMonitorSelector is empty — but
# kept for consistency with the other monitors. The Probes in
# monitoring-rules/probes-blackbox.yaml do need it; probeSelector
# still matches on release.
release: kube-prometheus-stack
interval: 30s
# Helm DOES deep-merge this map with the chart's default (that is why
# the chart's http_2xx is still in the rendered ConfigMap alongside
# the additions below) — but the chart's default ships exactly ONE
# module, http_2xx. http_post_2xx/tcp_connect/icmp/dns exist only in
# upstream blackbox_exporter's EXAMPLE config, which this chart does
# not use. So every module a Probe references must be declared right
# here; otherwise the exporter answers that /probe with 400 Bad
# Request and the target goes down with no probe_* metrics at all.
config:
modules:
# WAN-path probe of the public edge by proxy IP. Probing the NAME
# from in-cluster is useless twice over: CoreDNS/k8s_gateway
# resolves public names straight to the cluster VIP, and the LAN
# hairpin DNAT rewrites the proxy IPs on most VLANs — but NOT on
# the Server/Ingress VLANs the nodes sit on (deliberately absent
# from unifi_nat_hairpin.tf), so an IP-literal probe from this
# exporter genuinely leaves via the WAN and comes back through
# the netcup reverse-proxy edge. SNI + Host are pinned to the
# served domain because the target is an IP literal.
http_2xx_wan_edge:
prober: http
timeout: 10s
http:
fail_if_not_ssl: true
tls_config:
server_name: home.renner.uno
headers:
Host: home.renner.uno
# Plain TCP connect, used by the blackbox-tcp-relays Probe for the
# NetBird relay ws listeners on :33080. Address family is spelled
# out as ip6-then-fallback (blackbox's own tcp default, pinned so
# an upstream default flip can't break it): the relay members are
# mixed — proxy-1.renner.uno is v6-only and
# proxy-2.renner.uno is dual-stack (observed live: probe_ip_protocol
# is 6 and 4 respectively on their :9000/health probes) — so
# pinning either family would break one member.
tcp_connect:
prober: tcp
timeout: 5s
tcp:
preferred_ip_protocol: ip6
ip_protocol_fallback: true
# One module per name: the dns prober takes the RESOLVER as its
# target and reads query_name from the module, so a name cannot be
# passed per scrape. The Probes in monitoring-rules/probes-dns.yaml
# point these at the UDM.
#
# Both answer checks are load-bearing. valid_rcodes alone passes a
# deleted record two labels deep (NOERROR, no answer), and the public
# *.renner.uno wildcard answers one label deep with a CNAME to
# proxy.renner.uno — NOERROR with the WAN proxy behind it. Requiring
# an A and rejecting a CNAME separates a real record from both.
dns_lan_ha:
prober: dns
timeout: 5s
dns:
query_name: ha.renner.uno
query_type: A
valid_rcodes: [NOERROR]
validate_answer_rrs:
fail_if_not_matches_regexp: ['\sIN\s+A\s']
fail_if_matches_regexp: ['\sIN\s+CNAME\s']
dns_lan_mqtt:
prober: dns
timeout: 5s
dns:
query_name: mqtt.renner.uno
query_type: A
valid_rcodes: [NOERROR]
validate_answer_rrs:
fail_if_not_matches_regexp: ['\sIN\s+A\s']
fail_if_matches_regexp: ['\sIN\s+CNAME\s']
dns_lan_ldap:
prober: dns
timeout: 5s
dns:
query_name: ldap.renner.uno
query_type: A
valid_rcodes: [NOERROR]
validate_answer_rrs:
fail_if_not_matches_regexp: ['\sIN\s+A\s']
fail_if_matches_regexp: ['\sIN\s+CNAME\s']
dns_lan_syslog:
prober: dns
timeout: 5s
dns:
query_name: syslog.renner.uno
query_type: A
valid_rcodes: [NOERROR]
validate_answer_rrs:
fail_if_not_matches_regexp: ['\sIN\s+A\s']
fail_if_matches_regexp: ['\sIN\s+CNAME\s']
dns_lan_ftp_scanner:
prober: dns
timeout: 5s
dns:
query_name: ftp.paperless.renner.uno
query_type: A
valid_rcodes: [NOERROR]
validate_answer_rrs:
fail_if_not_matches_regexp: ['\sIN\s+A\s']
fail_if_matches_regexp: ['\sIN\s+CNAME\s']
dns_lan_syncthing:
prober: dns
timeout: 5s
dns:
query_name: syncthing.paperless.renner.uno
query_type: A
valid_rcodes: [NOERROR]
validate_answer_rrs:
fail_if_not_matches_regexp: ['\sIN\s+A\s']
fail_if_matches_regexp: ['\sIN\s+CNAME\s']