--- apiVersion: v1 kind: Service metadata: name: pihole namespace: default annotations: metallb.universe.tf/loadBalancerIPs: 192.168.0.201 # ← assign static LAN IP for DNS spec: type: LoadBalancer selector: app: pihole ports: - name: web protocol: TCP port: 80 targetPort: 80 - name: dns-udp protocol: UDP port: 53 targetPort: 53 - name: dns-tcp protocol: TCP port: 53 targetPort: 53 --- apiVersion: apps/v1 kind: Deployment metadata: name: pihole namespace: default spec: replicas: 1 selector: matchLabels: app: pihole template: metadata: labels: app: pihole spec: containers: - name: pihole image: pihole/pihole:latest env: - name: TZ value: "Europe/London" - name: WEBPASSWORD value: "changeme" - name: DNSMASQ_LISTENING value: "single" # Upstream DNS servers - name: PIHOLE_DNS_ value: "1.1.1.1;1.0.0.1" ports: - containerPort: 80 - containerPort: 53 protocol: TCP - containerPort: 53 protocol: UDP volumeMounts: - name: pihole-etc mountPath: /etc/pihole - name: dnsmasq-etc mountPath: /etc/dnsmasq.d volumes: - name: pihole-etc persistentVolumeClaim: claimName: pihole-etc-pvc - name: dnsmasq-etc persistentVolumeClaim: claimName: dnsmasq-etc-pvc --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pihole-etc-pvc namespace: default spec: accessModes: - ReadWriteOnce storageClassName: pihole-local-storage resources: requests: storage: 2Gi --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: dnsmasq-etc-pvc namespace: default spec: accessModes: - ReadWriteOnce storageClassName: pihole-local-storage resources: requests: storage: 1Gi --- apiVersion: v1 kind: PersistentVolume metadata: name: pihole-etc-pv spec: capacity: storage: 2Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: pihole-local-storage local: path: /home/kimjunte/k8s_storage/pihole/etc nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - mist --- apiVersion: v1 kind: PersistentVolume metadata: name: dnsmasq-etc-pv spec: capacity: storage: 1Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: pihole-local-storage local: path: /home/kimjunte/k8s_storage/pihole/dnsmasq nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - mist