Nasadenie MySQL na K3s s perzistentným úložiskom na lokálnom NVMe disku

Vytvorené: 24. 8. 2025 08:42 Aktualizované: 27. 8. 2025 13:14
Vyriešené
Obsah článku

title: "Nasadenie MySQL na K3s s perzistentným úložiskom na lokálnom NVMe disku"
slug: "k3s-mysql-helm-local-path-provisioner"
technologies: ["Kubernetes", "K3s", "Helm", "MySQL", "YAML", "Bash", "Local Path Provisioner"]
tags: ["devops", "k3s", "database", "mysql", "helm", "persistence", "statefulset"]
date_solved: "2025-08-21"

Projekt/Téma: Nasadenie MySQL na K3s s perzistentným úložiskom na lokálnom NVMe disku

  1. Cieľ / Problém na vyriešenie: Cieľom bolo nasadiť databázový server MySQL ako StatefulSet do K3s klastra pomocou Helm chartu od Bitnami. Kľúčovou požiadavkou bolo, aby dáta boli perzistentne ukladané na špecifickom, vysoko-výkonnom lokálnom úložisku (NVMe disk) na jednom z uzlov klastra.

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

    • Orchestrácia: Kubernetes (K3s)
    • Deployment: Helm
    • Databáza: MySQL
    • Storage: Local Path Provisioner
    • Konfigurácia: YAML (values.yaml)
    • Nástroje: kubectl, helm, mkdir, chown
  3. Kľúčové postupy a konfiguračné kroky:

    • Pridanie repozitára Bitnami do Helmu.
      helm repo add bitnami https://charts.bitnami.com/bitnami
    • Príprava hostiteľského adresára na uzle, kde má byť MySQL pod spustený. To zahŕňalo vytvorenie adresára a nastavenie správnych oprávnení (UID/GID), aby doň mohol databázový proces zapisovať.
      sudo mkdir -p /mnt/nvme/mysql-data
      sudo chown 1001:1001 /mnt/nvme/mysql-data
      sudo chmod 755 /mnt/nvme/mysql-data
    • Vytvorenie mysql-values.yaml súboru s konfiguráciou pre perzistenciu, ktorá využíva local-path StorageClass a nodeSelector na zabezpečenie spustenia podu na správnom uzle.
    • Inštalácia MySQL pomocou Helmu.
      helm install mysql bitnami/mysql --namespace mysql --create-namespace -f mysql-values.yaml
    • Overenie a získanie prístupového hesla z Kubernetes secretu.
      MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace mysql mysql -o jsonpath="{.data.mysql-root-password}" | base64 -d)
    • Spustenie dočasného klienta na overenie pripojenia k databáze.
      kubectl run mysql-client --rm -it --restart='Never' --image mysql:8.0 --namespace mysql -- mysql -h mysql.mysql.svc.cluster.local -u root -p"$MYSQL_ROOT_PASSWORD"
  4. Výsledné kódy a skripty:

    • Príklad mysql-values.yaml:
      
      # Obsah súboru nebol v histórii priamo viditeľný, 
      # ale na základe kontextu by vyzeral približne takto:
      global:
      storageClass: "local-path"

    primary: persistence: enabled: true size: 20Gi

    nodeSelector: kubernetes.io/hostname: golem # Názov uzla s NVMe diskom

    auth: rootPassword: "very-strong-password"

  5. Zistené problémy a riešenia (Gotchas):

    • Problém: Pod MySQL sa po inštalácii dostal do stavu CrashLoopBackOff alebo Pending. Inšpekcia logov a udalostí (kubectl logs, kubectl describe pod) odhalila problémy s oprávneniami na pripojenom zväzku (Permission denied).
    • Riešenie: Proces MySQL beží v kontajneri pod špecifickým používateľským ID (často 1001). Local Path Provisioner vytvára adresáre s oprávneniami roota. Bolo nevyhnutné manuálne zmeniť vlastníka a oprávnenia pre adresár na hostiteľskom systéme (/mnt/nvme/mysql-data) na ID, ktoré používa MySQL kontajner. Po vykonaní sudo chown 1001:1001 ... a reštarte podu sa databáza úspešne inicializovala.
  6. Finálny výsledok / Záver: MySQL databáza bola úspešne nasadená a beží v K3s klastri. Dáta sú perzistentne ukladané na lokálnom NVMe disku uzla golem, čo zabezpečuje vysoký výkon. Pripojenie k databáze zvnútra klastra je funkčné.

---```yaml title: "Príprava a konfigurácia bootovacej SD karty pre Raspberry Pi (Headless Setup)" slug: "raspberry-pi-headless-sd-card-setup" technologies: ["Raspberry Pi OS", "Bash", "Linux", "SSH", "Networking"] tags: ["iot", "raspberry-pi", "linux", "setup", "headless", "automation"] date_solved: "2025-08-22"


Projekt/Téma: Príprava a konfigurácia bootovacej SD karty pre Raspberry Pi (Headless Setup)
1. Cieľ / Problém na vyriešenie:
Cieľom bolo pripraviť SD kartu s operačným systémom Raspberry Pi OS pre bezhlavé (headless) použitie. To znamená, že po prvom spustení sa Raspberry Pi automaticky pripojí na WiFi a bude prístupné cez SSH bez nutnosti pripojenia monitora a klávesnice.

2. Použité technológie a nástroje:
*   **Operačný systém:** Raspberry Pi OS (Bookworm, 64-bit Lite)
*   **Nástroje:** `wget`, `unxz`, `dd`, `mount`, `touch`, `tee`, `chmod`, `chown`, `umount`, `lsblk`
*   **Protokoly:** SSH, WPA

3. Kľúčové postupy a konfiguračné kroky:
*   Stiahnutie a dekompresia obrazu Raspberry Pi OS.
    ```bash
    wget https://downloads.raspberrypi.com/raspios_lite_arm64/images/raspios_lite_arm64-2025-05-13/2025-05-13-raspios-bookworm-arm64-lite.img.xz
    unxz 2025-05-13-raspios-bookworm-arm64-lite.img.xz
  • Zapísanie obrazu na SD kartu pomocou príkazu dd.
    sudo dd bs=4M if=2025-05-13-raspios-bookworm-arm64-lite.img of=/dev/sdd status=progress conv=fsync
  • Pripojenie boot partície a povolenie SSH vytvorením prázdneho súboru ssh.
    sudo mount /dev/sdd1 /mnt/bootfs
    sudo touch /mnt/bootfs/ssh
  • (Krok vykonaný, ale obsah súboru nebol v histórii) Vytvorenie wpa_supplicant.conf na boot partícii s údajmi pre WiFi sieť.
    sudo vim /mnt/bootfs/wpa_supplicant.conf
    sudo umount /mnt/bootfs
  • Pripojenie root partície a vloženie verejného SSH kľúča pre bezheslové prihlásenie.
    sudo mount /dev/sdd2 /mnt/rootfs
    sudo mkdir -p /mnt/rootfs/home/pi/.ssh
    export PUBKEY=$(cat ~/.ssh/id_rsa.pub)
    echo "$PUBKEY" | sudo tee /mnt/rootfs/home/pi/.ssh/authorized_keys
  • Nastavenie správnych oprávnení a vlastníctva pre .ssh adresár a authorized_keys súbor.
    sudo chmod 700 /mnt/rootfs/home/pi/.ssh
    sudo chmod 600 /mnt/rootfs/home/pi/.ssh/authorized_keys
    sudo chown -R 1000:1000 /mnt/rootfs/home/pi/.ssh
  • Odpojenie root partície a bezpečné odobratie SD karty.
    sudo umount /mnt/rootfs
  1. Výsledné kódy a skripty:

    • Skript na vloženie SSH kľúča:
      export PUBKEY=$(cat ~/.ssh/id_rsa.pub)
      echo "$PUBKEY" | sudo tee /mnt/rootfs/home/pi/.ssh/authorized_keys
    • Obsah wpa_supplicant.conf (predpokladaný):
      
      ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
      update_config=1
      country=SK

    network={ ssid="NAZOV_VASEJ_WIFI_SIETE" psk="HESLO_K_WIFI" }

  2. Zistené problémy a riešenia (Gotchas):

    • Problém: Po vložení verejného kľúča stále vyžadovalo prihlásenie heslom.
    • Riešenie: Problém bol v nesprávnych oprávneniach na adresári .ssh alebo súbore authorized_keys na SD karte. SSH démon je veľmi citlivý na oprávnenia. Bolo kľúčové nastaviť 700 pre adresár, 600 pre súbor a správneho vlastníka (v tomto prípade UID/GID 1000:1000 pre default používateľa pi).
  3. Finálny výsledok / Záver: Bola úspešne vytvorená SD karta, ktorá po vložení do Raspberry Pi a zapnutí automaticky naštartuje systém, pripojí sa k WiFi a je okamžite dostupná na sieti cez SSH s použitím privátneho kľúča. Tým je pripravená na ďalšiu konfiguráciu na diaľku.

Vyriešené: 21. 8. 2025