Oprava Kubernetes Deploymentu: DNS, PVC a Konflikt Portov pri `hostNetwork`

Vytvorené: 24. 8. 2025 14:58 Aktualizované: 27. 8. 2025 13:14
Vyriešené
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

  1. Cieľ / Problém na vyriešenie: Cieľom bolo opraviť a robustne nakonfigurovať Kubernetes Deployment pre Home Assistant, ktorý mal problémy s DNS, zmenou veľkosti PVC a zasekával sa pri aktualizáciách.

  2. Použité technológie a nástroje:

    • Orchestrátor: Kubernetes (k3s)
    • Konfiguračný jazyk: YAML
    • Kubernetes objekty: Deployment, PersistentVolumeClaim (PVC)
    • DNS Servery: Pi-hole
  3. Kľúčové postupy a konfiguračné kroky:

    1. Diagnostika DNS: Zistenie, že pod používa dnsPolicy: ClusterFirst, čo vytvára dlhý a krehký reťazec presmerovaní (Pod -> CoreDNS -> Node systemd-resolved -> Pi-hole).
    2. Oprava DNS: Modifikácia Deployment YAML pridaním sekcie dnsConfig s explicitnými IP adresami Pi-hole serverov a nastavením dnsPolicy: "None".
    3. Diagnostika chyby PVC: Pri kubectl apply sa objavila chyba Forbidden: field can not be less than status.capacity, indikujúca pokus o zmenšenie veľkosti PVC.
    4. 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 apply pre PVC bol následne preskočený.
    5. Diagnostika Pending podu: Nový pod po aktualizácii deploymentu zostal v stave Pending kvôli konfliktu portov, keďže deployment používal hostNetwork: true.
    6. Oprava Pending podu: 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 na type: Recreate.
  4. 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 ...
  5. Zistené problémy a riešenia (Gotchas):

    • Problém: kubectl apply pre PersistentVolumeClaim zlyhal s chybou Forbidden: 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 apply pre Deployment s hostNetwork: true zostal nový pod zaseknutý v stave Pending.
    • Riešenie: Predvolená stratégia RollingUpdate sa 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 v Deployment YAML na type: Recreate, ktorá zabezpečí, že starý pod je vždy ukončený pred vytvorením nového.
  6. 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.

Vyriešené: 24. 8. 2025