Fix pihole for v6: pin digest, listeningMode=ALL, v6 password env, readiness probe
Some checks failed
Validate and Deploy to K3s / validate (push) Failing after 1m41s
Validate and Deploy to K3s / deploy (push) Has been skipped

A fresh node pull of pihole:latest silently upgraded v5->v6 (Core v6.2.2).
v6's default listeningMode=LOCAL drops DNS from non-attached subnets, which
killed all cross-node svclb DNS the moment the pod rescheduled off its old
node. v6 also ignores the WEBPASSWORD env.

- image pinned by digest (Core v6.2.2)
- FTLCONF_dns_listeningMode=ALL
- admin password via FTLCONF_webserver_api_password <- pihole-admin secret
- tcpSocket:53 readiness probe so rollout status waits for FTL

Applied to the cluster via kubectl replace; DNS verified answering on all
four node IPs, admin API auth verified.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
jasonwitty 2026-07-26 02:56:50 -07:00
parent 96e1825629
commit fe72f1e85a
2 changed files with 29 additions and 8 deletions

View File

@ -85,7 +85,10 @@ to secrets and no delete verbs.
## Known quirks (faithful to live state, fix at leisure) ## Known quirks (faithful to live state, fix at leisure)
- Most images are `:latest`/`:stable` — deploys are not reproducible until - Most images are `:latest`/`:stable` — deploys are not reproducible until
pinned. vaultwarden is pinned (1.35.4). pinned. vaultwarden is pinned (1.35.4); pihole is pinned by digest (Core
v6.2.2) after `:latest` silently jumped v5→v6 on a fresh node pull
(2026-07-26) and broke DNS for cross-node sources (v6 defaults to
`listeningMode=LOCAL`) — fixed via `FTLCONF_dns_listeningMode=ALL`.
- searxng keeps its helm-generated name suffix (`searxng-1723974683`) because - searxng keeps its helm-generated name suffix (`searxng-1723974683`) because
deployment selectors are immutable; its helm release record still exists in deployment selectors are immutable; its helm release record still exists in
the cluster — don't run `helm upgrade/uninstall` on it, this repo is the the cluster — don't run `helm upgrade/uninstall` on it, this repo is the
@ -103,4 +106,8 @@ to secrets and no delete verbs.
`rpi-master_undervoltage_CNI_corruption_incident-2026-07-25.md`. `rpi-master_undervoltage_CNI_corruption_incident-2026-07-25.md`.
- 2026-07-26: initial import of manifests from live cluster; HA ingress - 2026-07-26: initial import of manifests from live cluster; HA ingress
defaultBackend fixed; unifiedstreaming-svc LoadBalancer→ClusterIP; defaultBackend fixed; unifiedstreaming-svc LoadBalancer→ClusterIP;
pihole/USP secrets moved to secretKeyRef (pending first apply). pihole/USP secrets migrated to secretKeyRef in-cluster.
- 2026-07-26: pihole surprise v5→v6 upgrade via `:latest` on a fresh node
pull; image pinned by digest, `FTLCONF_dns_listeningMode=ALL` +
`FTLCONF_webserver_api_password` (v6 ignores WEBPASSWORD), readiness probe
on :53 added. Gitea Actions pipeline + deployer RBAC added.

View File

@ -1,7 +1,13 @@
# DIVERGENCE from live state (intentional): the live deployment has WEBPASSWORD # Pi-hole v6 (image pinned by digest = Core v6.2.2 — :latest bit us on
# as a plaintext env value. Here it comes from the `pihole-admin` secret — # 2026-07-26 when a fresh node pull silently jumped v5→v6).
# create it (see secret.example.yaml) BEFORE applying this, or the pod will # v6 notes:
# fail with CreateContainerConfigError. # - FTLCONF_dns_listeningMode=ALL is REQUIRED in k8s: the v6 default (LOCAL)
# only answers queries from directly-attached subnets, which silently drops
# all cross-node svclb traffic.
# - v6 ignores the old WEBPASSWORD env; the admin password is
# FTLCONF_webserver_api_password, fed from the `pihole-admin` secret —
# create it (see secret.example.yaml) BEFORE applying.
# - Readiness probe on :53 so rollouts wait for FTL to actually serve DNS.
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
@ -40,12 +46,14 @@ spec:
- raspi - raspi
containers: containers:
- name: pihole - name: pihole
image: pihole/pihole:latest image: pihole/pihole@sha256:e28e239f55e648a9d32c8f065650acfe987ddebf1cd5f64f1c071e8716156ceb # Core v6.2.2
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
env: env:
- name: TZ - name: TZ
value: America/Los_Angeles value: America/Los_Angeles
- name: WEBPASSWORD - name: FTLCONF_dns_listeningMode
value: ALL
- name: FTLCONF_webserver_api_password
valueFrom: valueFrom:
secretKeyRef: secretKeyRef:
name: pihole-admin name: pihole-admin
@ -72,6 +80,12 @@ spec:
memory: 2Gi memory: 2Gi
securityContext: securityContext:
privileged: true privileged: true
readinessProbe:
tcpSocket:
port: 53
initialDelaySeconds: 10
periodSeconds: 10
failureThreshold: 3
volumeMounts: volumeMounts:
- name: gv-pihole - name: gv-pihole
mountPath: /etc/pihole mountPath: /etc/pihole