{"id":21,"date":"2026-06-24T14:21:09","date_gmt":"2026-06-24T14:21:09","guid":{"rendered":"https:\/\/netguide.io\/homelab\/?p=21"},"modified":"2026-06-24T14:21:09","modified_gmt":"2026-06-24T14:21:09","slug":"mein-weg-zum-ultimativen-hybrid-k3s-cluster-gitops-sicherheit-und-ki-im-homelab","status":"publish","type":"post","link":"https:\/\/netguide.io\/homelab\/de\/mein-weg-zum-ultimativen-hybrid-k3s-cluster-gitops-sicherheit-und-ki-im-homelab\/","title":{"rendered":"Mein Weg zum ultimativen Hybrid-k3s-Cluster: GitOps, Sicherheit und KI im Homelab"},"content":{"rendered":"<div id=\"netgu-541873526\" class=\"netgu-before-content netgu-entity-placement\"><script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-6258556257245998\" crossorigin=\"anonymous\"><\/script><ins class=\"adsbygoogle\" style=\"display:block;\" data-ad-client=\"ca-pub-6258556257245998\" \ndata-ad-slot=\"3494115342\" \ndata-ad-format=\"auto\"><\/ins>\n<script> \n(adsbygoogle = window.adsbygoogle || []).push({}); \n<\/script>\n<\/div>\n<p class=\"wp-block-paragraph\">Wer kennt es nicht? Das Homelab w\u00e4chst, immer mehr Docker-Compose-Stacks sammeln sich an, und irgendwann stellt sich die Frage: Wie skaliere ich das Ganze vern\u00fcnftig, halte es wartbar und hole gleichzeitig das Maximum aus meiner Hardware heraus?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ich habe mich vor Kurzem entschieden, den gro\u00dfen Schritt zu gehen und meine gesamte Infrastruktur auf ein <strong>hybrides, GitOps-gesteuertes K3s-Cluster<\/strong> umzustellen. In diesem Artikel nehme ich dich mit durch meine architektonischen \u00dcberlegungen, Hardware-Entscheidungen und den finalen Security- und Management-Stack.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Die Vision: Lokal starten, global expandieren<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das Ziel ist ein Kubernetes-Cluster, das die St\u00e4rken meines lokalen Setups mit der Flexibilit\u00e4t der Cloud verbindet. Alles \u2013 von der VM-Vorbereitung bis zur Anwendung \u2013 soll komplett deklarativ als <strong>Infrastructure as Code (IaC)<\/strong> \u00fcber ein Git-Repository laufen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Das Namensschema: Struktur von Anfang an<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Um im Cluster nicht den \u00dcberblick zu verlieren, nutze ich ein striktes, professionelles Namensschema, das vom Gro\u00dfen zum Kleinen sortiert ist:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>k3s-c-a001-n001.netguide.io<\/code> (Service-ClusterID-NodeID.Domain). Das sorgt f\u00fcr eine saubere alphabetische Sortierung im Terminal und erleichtert das Tab-Completion per SSH ungemein.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Warum das Cluster-Gehirn zu Hause bleibt<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Eine der wichtigsten \u00dcberlegungen war die geografische Verteilung. Macht es Sinn, die Master-Nodes (Control Plane) \u00fcber die Cloud und das Homelab zu verteilen? <strong>Nein.<\/strong> K3s nutzt im HA-Setup <em>etcd<\/em>, das extrem empfindlich auf Netzwerklatenzen reagiert. Schwankt die Internetleitung zu Hause auch nur kurz, bricht das etcd-Quorum. Meine drei Master-Nodes (<code>n001<\/code> bis <code>n003<\/code>) laufen daher alle lokal auf meinem Hauptserver mit einer internen Latenz von &lt; 1 ms. Die Cloud wird sp\u00e4ter ausschlie\u00dflich f\u00fcr reine, zustandslose Worker-Nodes (Agents) genutzt, um Services n\u00e4her an das \u00f6ffentliche Netz zu bringen oder Lastspitzen abzufangen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Hardware-Sizing: Schluss mit CPU-Overprovisioning<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mein Hauptserver l\u00e4uft mit einem <strong>AMD Ryzen 7 PRO 4750G<\/strong> (8 Kerne, 16 Threads). Anfangs dachte ich daran, jeder der drei K3s-VMs einfach 8 Cores zu spendieren. Das w\u00e4re allerdings massives Overprovisioning gewesen. Wenn alle drei VMs unter Last stehen, w\u00fcrden sie sich um die echten Threads streiten, was zu Latenzen im etcd-Core f\u00fchrt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ich habe mich f\u00fcr einen stabileren &#8220;Sweet Spot&#8221; entschieden:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Specs pro Master-VM:<\/strong> 4 vCPUs (Typ <code>host<\/code>), 12 GB RAM, 150 GB lokale SSD.<\/li>\n\n\n\n<li>Mit $3 \\times 4\\text{ Cores}$ belege ich 12 Threads meines Hosts. Es bleiben also 4 Threads Puffer f\u00fcr den Hypervisor selbst.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Der zweite Server als Proxmox-Erweiterung<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Zus\u00e4tzlich besitze ich einen zweiten Server (aktuell noch Ryzen 1600, geplant ist ein Upgrade auf den effizienteren Ryzen 5 3600 mit 32 GB RAM). Diesen binde ich als zweiten, autarken Proxmox-Server in mein bestehendes Web-UI ein \u2013 rein f\u00fcr die zentrale Verwaltung ohne fehleranf\u00e4lliges Zwei-Knoten-HA. Auf diesem Host wandert eine vierte VM als reiner K3s-Worker (<code>n004<\/code>), best\u00fcckt mit zwei 500 GB SSDs im ZFS-Mirror, um dem Cluster zus\u00e4tzliche physische Compute-Power und schnellen Speicher zu liefern.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Das Storage-Konzept: Wo liegen die Daten?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein riesiger Stolperstein bei Kubernetes im Homelab ist der Speicher. Meine Plex-Filme und Immich-Fotos liegen auf einem gro\u00dfen HDD-Storage auf meinem NAS. Diese binde ich elegant \u00fcber einen <strong>NFS CSI Driver<\/strong> direkt in Kubernetes ein. Der Vorteil: Die Terabytes an Daten m\u00fcssen nicht migriert werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Allerdings gibt es hier zwei eiserne Regeln, die ich beachte:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Datenbanken geh\u00f6ren auf lokale SSDs:<\/strong> Die PostgreSQL-Datenbanken von Immich oder Forgejo vertragen kein NFS (Gefahr von File-Locking-Problemen und Latenztod). Sie liegen auf den lokalen 150 GB SSDs der VMs.<\/li>\n\n\n\n<li><strong>Die NAS-SSD als Cache-Beschleuniger:<\/strong> Ich nutze eine zus\u00e4tzliche 500 GB SSD auf meinem NAS f\u00fcr kleine, lesehungrige Daten wie die unz\u00e4hligen WebP-Thumbnails von Immich. So bleibt das Scrollen in der Foto-Timeline butterweich, ohne die HDDs zu stressen.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Der Tech-Stack: Automatisierung, GitOps &amp; Sicherheit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sobald die nackten Ubuntu 26.04 VMs stehen, greift die vollautomatische Pipeline.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Das Fundament: NetBird &amp; Ansible<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bevor K3s installiert wird, l\u00e4uft auf allen Systemen der <strong>NetBird<\/strong>-Client. NetBird baut ein verschl\u00fcsseltes Full-Mesh-VPN auf WireGuard-Basis auf. Ich pinne im NetBird-Dashboard feste IPs im Bereich <code>100.64.10.X<\/code> f\u00fcr meine Server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mein <strong>Ansible-Playbook<\/strong> \u00fcbernimmt dann den Rest: Es aktualisiert Ubuntu, installiert die n\u00f6tigen NFS-Treiber und zwingt K3s \u00fcber das Flannel-Interface (<code>wt0<\/code>), ausschlie\u00dflich \u00fcber den sicheren NetBird-Tunnel zu kommunizieren.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Das KI-Kraftpaket: NVIDIA Passthrough<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Eine Besonderheit ist Node 3 (<code>n003<\/code>): In diese VM habe ich eine <strong>NVIDIA RTX 4060 Ti<\/strong> per Proxmox-GPU-Passthrough durchgereicht. Ansible installiert hier automatisch die Headless-Treiber und das NVIDIA Container Toolkit. \u00dcber das offizielle Kubernetes-NVIDIA-Plugin wird die GPU als Standard-Ressource (<code>nvidia.com\/gpu<\/code>) im Cluster registriert. Apps wie <strong>Ollama<\/strong> (f\u00fcr lokale LLMs) oder Plex (f\u00fcr NVENC-Transcoding) steuere ich im GitOps-Repo einfach \u00fcber <code>nodeSelector<\/code>-Labels gezielt auf diesen Node.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Warum ArgoCD und nicht Flux?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr das Continuous Deployment stand ich vor der Wahl: ArgoCD oder FluxCD? Ich habe mich ganz bewusst f\u00fcr <strong>ArgoCD<\/strong> entschieden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Flux ist zwar extrem leichtgewichtig, wird aber fast nur \u00fcber das Terminal bedient. ArgoCD bietet ein fantastisches Web-UI, das mir visuell genau zeigt, welche Kubernetes-Ressourcen synchronisiert sind und wo es hakt. Gerade im komplexen Hybrid-Betrieb und beim &#8220;App-of-Apps&#8221;-Pattern, bei dem eine Haupt-App alle anderen Stacks steuert, ist diese Transparenz f\u00fcr mich im Homelab unbezahlbar.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83e\udd5a\ud83d\udc13 <strong>Das Henne-Ei-Problem gel\u00f6st:<\/strong> Mein Forgejo-Git-Server l\u00e4uft ganz bewusst <em>nicht<\/em> im K3s-Cluster, sondern auf einem externen VPS. W\u00fcrde Forgejo im Cluster laufen und das Cluster sich daraus konfigurieren, h\u00e4tte ich eine zyklische Abh\u00e4ngigkeit gebaut. Schmiert das Cluster ab, kommt ArgoCD nicht mehr an den Code. Der externe VPS ist meine unzerst\u00f6rbare Source of Truth.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Die drei S\u00e4ulen der Infrastruktur: NetBox, Wazuh &amp; CrowdSec<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sobald der Cluster l\u00e4uft, rollt ArgoCD das finale Software-Trio aus:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>NetBox (Die Source of Truth):<\/strong> Hier wird alles dokumentiert. Jede NetBird-IP, jede VM und jede Hardware-Komponente wird in NetBox eingepflegt. Langfristig dient NetBox als dynamisches Inventory f\u00fcr mein Ansible-Setup \u2013 die manuelle <code>inventory.ini<\/code> wird damit \u00fcberfl\u00fcssig.<\/li>\n\n\n\n<li><strong>Wazuh (Das SIEM-Gehirn):<\/strong> Sicherheit wird gro\u00dfgeschrieben. Der Wazuh-Server l\u00e4uft im Cluster und sammelt \u00fcber schlanke Agenten auf den Ubuntu-VMs alle Sicherheitsereignisse, scannt nach Schwachstellen und \u00fcberwacht Datei\u00e4nderungen. Da der Wazuh-Indexer massive Schreiblasten erzeugt, liegt sein Speicher exakt auf dem schnellen lokalen ZFS-SSD-Mirror von Server B.<\/li>\n\n\n\n<li><strong>CrowdSec (Die digitale Haust\u00fcr):<\/strong> W\u00e4hrend Wazuh nach innen schaut, wehrt CrowdSec Angriffe nach au\u00dfen ab. Als <code>DaemonSet<\/code> l\u00e4uft es auf jedem Node, analysiert Ingress-Logs und blockiert b\u00f6sartige IPs sofort an der Edge (z. B. direkt im Nginx-Ingress-Controller).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Die perfekte Synergie<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Das Geniale daran: CrowdSec schreibt seine lokalen Blocks in ein JSON-Log, welches wiederum vom Wazuh-Agenten ausgelesen wird. Dadurch landen alle weltweiten CrowdSec-Abwehrerfolge visuell aufbereitet in meinem zentralen Wazuh-Dashboard.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mit dieser Architektur habe ich mir ein Homelab-Fundament gegossen, das absolut zukunftssicher ist. Dank der Kombination aus Ansible f\u00fcr das OS-Level und ArgoCD f\u00fcr die Kubernetes-Ebene fasse ich keine VM mehr manuell an. Wenn ich eine neue App testen oder den Cluster um einen Cloud-Server erweitern will, reicht ein einfacher <code>git push<\/code> auf meinen externen Forgejo-VPS.<\/p>\n<div id=\"netgu-1360597925\" class=\"netgu-after-content netgu-entity-placement\"><script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-6258556257245998\" crossorigin=\"anonymous\"><\/script><ins class=\"adsbygoogle\" style=\"display:block;\" data-ad-client=\"ca-pub-6258556257245998\" \ndata-ad-slot=\"4559785002\" \ndata-ad-format=\"auto\"><\/ins>\n<script> \n(adsbygoogle = window.adsbygoogle || []).push({}); \n<\/script>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Wer kennt es nicht? Das Homelab w\u00e4chst, immer mehr Docker-Compose-Stacks sammeln sich an, und irgendwann stellt sich die Frage: Wie [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[13,17,15,19,11],"tags":[41,43,29,47,31,51,37,21,33,23,39,35,49,25,27,45],"class_list":["post-21","post","type-post","status-publish","format-standard","hentry","category-docker","category-k3s","category-kubernetes","category-proxmox","category-virtualisierung","tag-ansible","tag-argocd","tag-cluster","tag-crowdsec","tag-gitops","tag-homelab","tag-iac","tag-k3s","tag-ki","tag-kubernetes","tag-netbird","tag-netbox","tag-plan","tag-proxmox","tag-ubuntu","tag-wazuh"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Tobias Pries","author_link":"https:\/\/netguide.io\/homelab\/author\/tobias-pries\/"},"uagb_comment_info":0,"uagb_excerpt":"Wer kennt es nicht? Das Homelab w\u00e4chst, immer mehr Docker-Compose-Stacks sammeln sich an, und irgendwann stellt sich die Frage: Wie [&hellip;]","brizy_media":[],"_links":{"self":[{"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/posts\/21","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/comments?post=21"}],"version-history":[{"count":1,"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/posts\/21\/revisions"}],"predecessor-version":[{"id":22,"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/posts\/21\/revisions\/22"}],"wp:attachment":[{"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/media?parent=21"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/categories?post=21"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/netguide.io\/homelab\/wp-json\/wp\/v2\/tags?post=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}