Obsah článku
title: "Oprava Kubernetes Deploymentu: DNS, PVC a Konflikt Portov pri `hostNetwork`"
slug: "k3s-deployment-fix-dns-pvc-hostnetwork-port-conflict"
technologies: ["Kubernetes (k3s)", "YAML", "Deployment", "PersistentVolumeClaim", "Networking", "DNS"]
tags: ["k3s", "deployment", "troubleshooting", "dns", "pvc", "hostnetwork", "home-assistant"]
date_solved: "2025-08-24"
Projekt/Téma: Oprava Kubernetes Deploymentu: DNS, PVC a Konflikt Portov pri hostNetwork
-
Cieľ / Problém na vyriešenie: Cieľom bolo opraviť a robustne nakonfigurovať Kubernetes
Deploymentpre Home Assistant, ktorý mal problémy s DNS, zmenou veľkosti PVC a zasekával sa pri aktualizáciách. -
Použité technológie a nástroje:
- Orchestrátor: Kubernetes (k3s)
- Konfiguračný jazyk: YAML
- Kubernetes objekty:
Deployment,PersistentVolumeClaim(PVC) - DNS Servery: Pi-hole
-
Kľúčové postupy a konfiguračné kroky:
- Diagnostika DNS: Zistenie, že pod používa
dnsPolicy: ClusterFirst, čo vytvára dlhý a krehký reťazec presmerovaní (Pod -> CoreDNS -> Nodesystemd-resolved-> Pi-hole). - Oprava DNS: Modifikácia
DeploymentYAML pridaním sekciednsConfigs explicitnými IP adresami Pi-hole serverov a nastavenímdnsPolicy: "None". - Diagnostika chyby PVC: Pri
kubectl applysa objavila chybaForbidden: field can not be less than status.capacity, indikujúca pokus o zmenšenie veľkosti PVC. - Oprava PVC: Zistenie skutočnej veľkosti PVC v klastri (
kubectl get pvc ... -o yaml) a oprava hodnoty v lokálnom YAML súbore.kubectl applypre PVC bol následne preskočený. - Diagnostika
Pendingpodu: Nový pod po aktualizácii deploymentu zostal v stavePendingkvôli konfliktu portov, keďže deployment používalhostNetwork: true. - Oprava
Pendingpodu: Okamžitá oprava bola manuálne zmazanie starého podu (kubectl delete pod ...), čím sa uvoľnil port. Preventívna oprava bola zmena stratégie deploymentu natype: Recreate.
- Diagnostika DNS: Zistenie, že pod používa
-
Výsledné kódy a skripty:
# Finálny, opravený Deployment pre Home Assistant apiVersion: apps/v1 kind: Deployment metadata: name: homeassistant-deployment labels: app: homeassistant spec: replicas: 1 strategy: type: Recreate # Zabraňuje konfliktu portov pri aktualizácii selector: matchLabels: app: homeassistant template: metadata: labels: app: homeassistant spec: # Explicitné nastavenie DNS pre robustnosť a výkon dnsPolicy: "None" dnsConfig: nameservers: - "192.168.22.17" # Prvý Pi-hole - "192.168.22.19" # Druhý Pi-hole searches: - default.svc.cluster.local - svc.cluster.local - cluster.local options: - name: ndots value: "5" hostNetwork: true nodeSelector: kubernetes.io/hostname: golem containers: - name: homeassistant image: "ghcr.io/home-assistant/home-assistant:stable" ports: - containerPort: 8123 # ... zvyšok konfigurácie ... -
Zistené problémy a riešenia (Gotchas):
- Problém:
kubectl applyprePersistentVolumeClaimzlyhal s chybouForbidden: field can not be less than status.capacity. - Riešenie: Kubernetes zakazuje zmenšovanie veľkosti existujúcich PVC. Lokálny YAML súbor definoval menšiu veľkosť (
5Gi) ako bola reálne alokovaná v klastri (10Gi). Riešením bolo zosynchronizovať hodnotu v lokálnom súbore s realitou a pri aplikovaní zmien tento súbor vynechať. - Problém: Po
kubectl applypreDeploymentshostNetwork: truezostal nový pod zaseknutý v stavePending. - Riešenie: Predvolená stratégia
RollingUpdatesa snažila spustiť nový pod predtým, ako bol starý ukončený. Keďže oba pody potrebovali rovnaký port na hostiteľskom node, vznikol konflikt. Okamžité riešenie bolo manuálne zmazať starý pod. Dlhodobé riešenie je zmena stratégie vDeploymentYAML natype: Recreate, ktorá zabezpečí, že starý pod je vždy ukončený pred vytvorením nového.
- Problém:
-
Finálny výsledok / Záver: Deployment pre Home Assistant je teraz plne funkčný, s robustným a priamym DNS nastavením, správnou definíciou PVC a stratégiou nasadenia, ktorá zabraňuje problémom pri budúcich aktualizáciách.