Kubernetes Container DevOps Docker Self-hosted

Kubernetes auf eigener Infrastruktur: Einstieg für Entwickler

Managed Kubernetes (GKE, EKS, AKS) vereinfacht den Einstieg — aber mit hohen monatlichen Kosten und Vendor Lock-in. Self-hosted Kubernetes gibt dir Kontrolle über Kosten, Latenz und Daten. Dieser Guide zeigt, wie du einen K8s-Cluster aufsetzt, Deployments orchestrierst und Production-Ready bleibst.

Warum Kubernetes? Die Alternative zu Managed Cloud

Kubernetes automatisiert Container-Management auf Cluster-Ebene: Scheduling, Service Discovery, Load Balancing, Rolling Updates, Auto-Scaling und Self-Healing. Der Reiz von Managed Kubernetes liegt in der Bequemlichkeit. Aber diehide Kosten summieren sich:

AspektManaged K8s (GKE/EKS)Self-hosted (k3s/kubeadm)
Monatliche Kosten60–300 € pro Cluster30–80 € (nur Hardware)
Control PlaneGoogle/AWS/Microsoft verwaltetDu bist verantwortlich
Updates & PatchesAutomatisch (teilweise)Manuell oder via Farm
Vendor Lock-inHoch (Cloud-spezifische Features)Keiner — portability
LatenzAbhängig von Cloud-RegionDein eigenes Rechenzentrum
DatenhoheitCloud-spezifischVollständig auf eigener Hardware

Für kleine bis mittlere Workloads ist Self-hosted Kubernetes die wirtschaftlichere Wahl. Mit k3s (Lightweight Kubernetes von Rancher) kann ein einzelner Server als Control Plane + Worker fungieren — ideal für MVP und Prototypen.

K3s vs. kubeadm: k3s ist ein Single-Binary (< 100 MB), ARM-optimiert, SQLite als Default (Optional: etcd), und in unter 60 Sekunden installiert. kubeadm braucht deutlich mehr Konfiguration, ist dafür flexibler bei großen Clustern.

Schritt 1: Hardware und Netzwerk vorbereiten

Für einen Production-Cluster brauchst du mindestens 3 Nodes (etcd-Quorum braucht ungerade Zahlen). Empfohlene Specs:

Schritt 2: k3s auf dem Control Plane installieren

1 Control Plane initialisieren
curl -sfL https://get.k3s.io | sh -

Nach Installation: k3s --version prüfen. Die kubeconfig liegt in /etc/rancher/k3s/k3s.yaml.

2 Token für Worker-Join sichern
cat /var/lib/rancher/k3s/server/node-token

Diesen Token brauchst du für jeden neuen Worker-Node.

3 Worker Nodes hinzufügen
curl -sfL https://get.k3s.io | K3S_URL=https://:6443 K3S_TOKEN= sh -

Ersetze <CONTROL_PLANE_IP> und <TOKEN> mit deinen Werten.

4 Cluster-Status prüfen
kubectl get nodes # Output: NAME STATUS ROLES AGE # web-node-1 Ready control-plane 5m # web-node-2 Ready <none> 3m # web-node-3 Ready <none> 1m

Schritt 3: Dein erstes Deployment erstellen

Ein Deployment beschreibt, wie deine Anwendung in Pods läuft. Kubernetes kümmert sich um Restart, Skalierung und Rolling Updates.

apiVersion: apps/v1 kind: Deployment metadata: name: meine-webapp labels: app: meine-webapp spec: replicas: 3 selector: matchLabels: app: meine-webapp template: metadata: labels: app: meine-webapp spec: containers: - name: webapp image: nginx:1.25-alpine ports: - containerPort: 80 resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "500m" memory: "512Mi" livenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 10 periodSeconds: 15 readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 10

kubectl apply -f deployment.yaml startet 3 Pods auf deinen Worker Nodes. kubectl get pods -o wide zeigt, wo jeder Pod läuft.

Schritt 4: Service und Ingress einrichten

Das Deployment allein ist intern. Ein Service macht die Pods erreichbar, ein Ingress verbindet sie mit der Außenwelt.

Service (ClusterIP)

apiVersion: v1 kind: Service metadata: name: meine-webapp-svc spec: selector: app: meine-webapp type: ClusterIP ports: - port: 80 targetPort: 80 protocol: TCP name: http

Ingress mit Cert-Manager (Let's Encrypt)

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: meine-webapp-ingress annotations: kubernetes.io/ingress.class: "nginx" cert-manager.io/cluster-issuer: "letsencrypt-prod" spec: tls: - hosts: - app.example.com secretName: meine-webapp-tls rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: meine-webapp-svc port: number: 80

Cert-Manager installieren: kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.0/cert-manager.yaml. Der ClusterIssuer automatisiert SSL-Zertifikate — keine manuelle Erneuerung mehr.

Schritt 5: Auto-Scaling konfigurieren

Kubernetes Horizontal Pod Autoscaler (HPA) skaliert basierend auf CPU/Memory-Auslastung. Für nuanciertere Skalierung gibt es den KEDA-Operator (Event-driven Autoscaling).

# HPA: Skaliere zwischen 3 und 10 Pods bei >70% CPU-Auslastung apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: meine-webapp-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: meine-webapp minReplicas: 3 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70

Wichtige Kubernetes-Konzepte auf einen Blick

KonzeptWas es tutWann nutzen
PodKleinste deploybare Einheit — ein oder mehrere ContainerImmer (Pod ≠ Container)
DeploymentStellt Pods bereit, managed Replicas, Rolling UpdatesStateful Apps mit Replicas
StatefulSetWie Deployment, aber mit stabiler Identität und persistentem StorageDatenbanken, Kafka, etc.
DaemonSetEin Pod pro Node (z.B. Logs-Sammler, Monitoring Agent)Node-Level-Agents
ServiceStabile IP/DNS für Pods (ClusterIP, NodePort, LoadBalancer)Immer für interne/externe Erreichbarkeit
ConfigMap / SecretKonfiguration und sensitive Daten als Dateien oder Env-VarsKonfiguration, Credentials
PersistentVolumePersistenter Storage, der über Pod-Neustarts hinaus existiertDatenbanken, File-Uploads
NetworkPolicyFirewall für Pod-KommunikationZero-Trust-Networking

Namespaces für Umgebungslogik

Nutze Namespaces, um Produktion, Staging und Entwicklung logisch zu trennen. Das verhindert versehentliche Cross-Umgebungs-Deployments.

# Namespaces erstellen kubectl create namespace production kubectl create namespace staging kubectl create namespace development # In spezifischen Namespace deployen kubectl apply -f deployment.yaml -n production # Resource-Quotas pro Namespace apiVersion: v1 kind: ResourceQuota metadata: name: prod-quota spec: hard: requests.cpu: "8" requests.memory: 16Gi pods: "50"

Monitoring mit Prometheus + Grafana

Kubernetes bringt keine eingebaute Monitoring-Lösung. Ein Standard-Stack:

Installiere alles mit kube-prometheus-stack via Helm:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update helm install prometheus prometheus-community/kube-prometheus-stack \n --namespace monitoring --create-namespace \n --set prometheus.prometheusSpec.retentionTime=15d \n --set grafana.persistence.enabled=true

Logs-Aggregation: Parallel zu Prometheus brauchst du einen zentralisierten Logging-Stack. Empfohlen: Grafana Loki (schlank) oder Elasticsearch + Kibana (mächtiger). Beide funktionieren auf Kubernetes.

Backup und Disaster Recovery

Auf Kubernetes-Ebene: etcd-Backups sind kritisch — sie enthalten den gesamten Cluster-State. Auf Anwendungsebene: Datenbank-Backups und Volume-Snapshots.

Self-hosted vs. Managed: Die richtige Wahl

KriteriumGo Self-hosted wenn...Go Managed wenn...
KostenBudget < 100 €/Monat, mehr als 3 ClusterRapid Prototyping, kein Ops-Team
LatenzSub-5ms-Anforderung (Edge/Real-time)Globale Failover nötig (Multi-Region)
ComplianceDSGVO/regulierte Branche, Daten müssen on-premiseKeine besonderen Auflagen
SkalierungSkalierung vorhersagbar, stabile LastUnvorhersehbare Burst-Traffic-Spitzen
TeamDu/Team hat Kubernetes-ErfahrungNeueinsteiger, keine Zeit für Ops

Zusammenfassung: Dein K8s-Spickzettel

  • k3s ist der beste Einstieg für Self-hosted Kubernetes — ein Binary, 60-Sekunden-Installation
  • Mindestens 3 Nodes für etcd-Quorum (High Availability)
  • Nutze Helm für komplexe Deployments (Cert-Manager, Prometheus, Ingress-Controller)
  • Definiere Resource-Requests und Limits für jeden Container — kein Chaos beim Scheduling
  • Health Checks (Liveness + Readiness Probes) sind kein Optional — sie sind Voraussetzung für Auto-Scaling
  • Backup deinen etcd-State täglich — ohne ihn ist der Cluster nicht wiederherstellbar
  • Namespace-Struktur (prod/staging/dev) hilft bei Umgebungslogik und Resource Quotas

Das könnte Sie auch interessieren

Mehr erfahren

GitOps: Automatisierte Deployments mit ArgoCD und Flux

Mehr erfahren

.htaccess & Nginx-Konfiguration: Perfekte Webserver-Einstellungen

Mehr erfahren

API Gateway Hosting: Microservices richtig aufsetzen