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
-
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.
-
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
-
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.yamlsúboru s konfiguráciou pre perzistenciu, ktorá využívalocal-pathStorageClass anodeSelectorna 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"
- Pridanie repozitára Bitnami do Helmu.
-
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"
- Príklad
-
Zistené problémy a riešenia (Gotchas):
- Problém: Pod MySQL sa po inštalácii dostal do stavu
CrashLoopBackOffaleboPending. 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.
- Problém: Pod MySQL sa po inštalácii dostal do stavu
-
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.confna 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
.sshadresár aauthorized_keyssú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
-
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" }
- Skript na vloženie SSH kľúča:
-
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
.sshalebo súboreauthorized_keysna SD karte. SSH démon je veľmi citlivý na oprávnenia. Bolo kľúčové nastaviť700pre adresár,600pre súbor a správneho vlastníka (v tomto prípade UID/GID1000:1000pre default používateľapi).
-
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.