Infrastruktura

Dwa klastry Kubernetes, produkcyjny i domowy, w całości opisane w gicie, z monitoringiem, alertami i kopiami zapasowymi.

działa · 2026 · Talos · Cilium · Argo CD · Prometheus · Gitea CI

Pod moimi projektami pracują dwa klastry Kubernetes: produkcyjny na serwerach dedykowanych i domowy, na którym uczę się i najpierw sprawdzam zmiany. Oba zbudowałem od zera w 2026 roku i sam je utrzymuję.

Wszystko, co działa na klastrze, jest opisane w repozytorium. Argo CD porównuje repozytorium z klastrem i pokazuje każdą różnicę, a wdrożenie uruchamiam świadomie, aplikacja po aplikacji. Dzięki temu każdą zmianę da się przejrzeć przed wdrożeniem i cofnąć po nim. Hasła trafiają do repozytorium wyłącznie zaszyfrowane.

Serwery działają na Talos Linux: to system bez SSH i bez powłoki, którym zarządza się tylko przez API. Ruch w klastrze obsługuje Cilium, a każda aplikacja ma własne reguły sieciowe: najpierw zakaz wszystkiego, potem jawnie wypisane połączenia, których naprawdę potrzebuje.

Aktualizacje obrazów i chartów Helm proponuje Renovate jako pull requesty, z odczekaniem po wydaniu nowej wersji. Nic nie scala się samo. Monitoring sprawdza strony z zewnątrz, certyfikaty, dyski, bazy danych i serwery gier, a brak świeżej kopii zapasowej jest dla niego takim samym alarmem jak niedziałająca strona. Alerty przychodzą na telefon.

Poniżej kilka zapisów z terminala. Nazwy maszyn, adresy i wersje usług widocznych z internetu celowo pomijam.

Aplikacje na klastrze produkcyjnym
# 07.2026 – Kubernetes od zera na klastrze domowym; 08.2026 – ta sama konfiguracja na produkcji
$ kubectl get applications -n argocd -o name
application.argoproj.io/argocd
application.argoproj.io/bwitek
application.argoproj.io/cert-manager
application.argoproj.io/cilium
application.argoproj.io/databases
application.argoproj.io/discourse
application.argoproj.io/gameservers
application.argoproj.io/gamingplatform
application.argoproj.io/ghostpizza
application.argoproj.io/gitea
application.argoproj.io/monitoring
application.argoproj.io/sealed-secrets
application.argoproj.io/traefik
Każda aplikacja zaczyna od zakazu ruchu; dozwolone połączenia są wypisane jawnie
$ kubectl get networkpolicy -n ghostpizza -o name
networkpolicy.networking.k8s.io/default-deny
networkpolicy.networking.k8s.io/allow-dns-egress
networkpolicy.networking.k8s.io/allow-ingress-from-nodes
networkpolicy.networking.k8s.io/allow-mariadb-egress
Od 08.2026 aktualizacje przychodzą jako pull requesty od Renovate; scalam je ręcznie
$ git log --merges --format=%s -4
Merge pull request 'deps: Update Helm release traefik' (#33) from renovate/traefik into main
Merge pull request 'deps: Update base images' (#27) from renovate/base-images into main
Merge pull request 'deps: Update Helm release argo-cd' (#29) from renovate/argo-cd into main
Merge pull request 'deps: Update Helm release cert-manager' (#34) from renovate/cert-manager into main
Alert to nie tylko niedziałająca strona: kopia zapasowa, która się nie zrobiła, też go wywołuje
$ kubectl get prometheusrules -n monitoring -o jsonpath='{..alert}' | tr ' ' '\n'
BlackboxProbeFailed
BlackboxCertExpiringSoon
HostDiskSpaceLow
MariadbDown
MariadbBackupStale
GiteaDataBackupStale
GhostpizzaUploadsBackupStale
GameServerDown
ContainerOOMKilled

Wszystkie projekty