Skip to content

Pi-hole

Deploy Pi-hole DNS sinkhole on Kubernetes using the official pihole/pihole container image. Provides network-wide ad blocking via DNS filtering with optional Unbound recursive DNS.

Key Features

  • Network-Wide Ad Blocking — DNS-level filtering for all devices
  • Custom DNS Records — Local A records, CNAME records, and dnsmasq config
  • Unbound Sidecar — Optional recursive DNS resolver for privacy
  • Pi-hole v6+ — Modern configuration via FTLCONF environment variables
  • Prometheus Metrics — pihole-exporter sidecar with ServiceMonitor
  • Ingress Support — Configurable ingress with TLS for web admin
  • DNSSEC Validation — Optional DNS Security Extensions

Installation

HTTPS repository:

helm repo add helmforge https://repo.helmforge.dev
helm repo update
helm install pihole helmforge/pihole

OCI registry:

helm install pihole oci://ghcr.io/helmforgedev/helm/pihole

Basic Example

# values.yaml
admin:
  password: 'change-me'

pihole:
  timezone: UTC
  upstreamDns: '1.1.1.1;1.0.0.1'

dns:
  customRecords:
    - '192.168.1.1 router.home'
    - '192.168.1.10 nas.home'

serviceDns:
  type: LoadBalancer
  loadBalancerIP: '192.168.1.53'

persistence:
  enabled: true
  size: 1Gi

Unbound Example

unbound:
  enabled: true

pihole:
  dnssec: true

serviceDns:
  type: LoadBalancer
  loadBalancerIP: '192.168.1.53'

Key Values

KeyDefaultDescription
pihole.timezoneUTCTimezone for logs
pihole.upstreamDns8.8.8.8;8.8.4.4Upstream DNS servers
pihole.dnssecfalseEnable DNSSEC validation
admin.password""Admin password (auto-generated if empty)
dns.customRecords[]Local DNS A records
dns.cnameRecords[]Custom CNAME records
unbound.enabledfalseEnable Unbound recursive DNS
metrics.enabledfalseEnable Prometheus metrics
ingress.enabledfalseEnable ingress for web admin
serviceDns.typeLoadBalancerDNS service type
serviceDns.loadBalancerIPFixed IP for DNS
persistence.enabledtrueEnable persistent storage
persistence.size1GiPVC size

More Information

See the source code and full values reference on GitHub.