Container Deployment ohne DevOps-Team
Container Deployment ohne DevOps-Team
Kubernetes hat ein Reputationsproblem. Wer den Begriff hört, denkt an YAML-Dateien in dreistelliger Zahl, an mehrtägige Cluster-Setups und an Stellenausschreibungen, die drei Jahre Kubernetes-Erfahrung voraussetzen.
Diese Wahrnehmung ist nicht falsch, wenn man einen Cluster von Grund auf selbst betreibt. Aber sie ist irreführend, wenn es nur darum geht, Container zuverlässig in Produktion zu bringen.
Dieser Artikel zeigt, wie ein Managed Kubernetes Namespace den Ops-Aufwand auf nahezu null reduziert, und warum das gerade für Teams ohne dediziertes DevOps-Personal relevant ist.
Was ein DevOps-Team tatsächlich tut
Um zu verstehen, was man einsparen kann, muss man wissen, wofür ein DevOps-Team im Kubernetes-Kontext zuständig ist:
Cluster-Administration (entfällt komplett bei Managed Namespace):
- Kubernetes-Version aktualisieren
- etcd-Cluster warten und sichern
- Node-Pool verwalten (Scaling, OS-Updates, Kernel-Patches)
- Netzwerk-Policies und CNI-Plugin konfigurieren
- Ingress-Controller / Gateway-API betreiben
- Zertifikatsverwaltung (cert-manager)
- Monitoring-Stack (Prometheus, Grafana, Alertmanager)
- Log-Aggregation (Loki, ELK, Fluentd)
- Backup-Strategie implementieren
Anwendungs-Deployment (bleibt bei dir, aber vereinfacht):
- Dockerfiles schreiben
- Kubernetes-Manifeste pflegen
- CI/CD-Pipelines konfigurieren
- Secrets verwalten
Bei einem Managed Namespace entfällt die gesamte erste Liste. ITSH betreibt den Cluster, die Nodes, das Monitoring, die Backups und die Zertifikate. Was bleibt, ist das, was ohnehin zum Entwicklungsprozess gehört: die eigene Anwendung paketieren und deployen.
Eine Abgrenzung dazu: Der Monitoring-Stack gehört zur Plattform, nicht zu deinem Namespace. ITSH überwacht Cluster und Nodes rund um die Uhr, aber du bekommst weder Grafana-Zugang noch einen eigenen Ingest-Endpunkt, und ServiceMonitors oder PrometheusRules kannst du nicht anlegen. Für deine eigenen Workloads siehst du Pods, Logs, Events und Verbrauch im Kundenportal.
Vom Code zum Deployment in 30 Minuten
Angenommen, du hast eine Go-API, die du als Container deployen willst. Der gesamte Weg vom Code zur laufenden Anwendung auf einem ITSH-Namespace. Und ja, du kannst das Ganze auf dem Free Tier ohne Kreditkarte mitmachen, falls du den Workflow nur einmal ausprobieren willst, ohne dich zu verpflichten.
1. Dockerfile erstellen (5 Minuten)
FROM golang:1.27-alpine AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -buildmode=pie -ldflags="-s -w" -trimpath -o /app ./cmd/server
FROM alpine:3.24
COPY --from=build /app /app
EXPOSE 8080
ENTRYPOINT ["/app"]
2. Container-Image bauen und pushen (5 Minuten)
# Image bauen und in eine Container Registry pushen (z.B. GitHub Container Registry)
docker build -t ghcr.io/mein-org/api:1.0.0 .
docker push ghcr.io/mein-org/api:1.0.0
3. Kubernetes-Manifest schreiben (10 Minuten)
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
spec:
replicas: 1
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: ghcr.io/mein-org/api:1.0.0
ports:
- containerPort: 8080
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: app-secrets
key: database-url
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
readinessProbe:
httpGet:
path: /readyz
port: 8080
initialDelaySeconds: 3
---
apiVersion: v1
kind: Service
metadata:
name: api
spec:
selector:
app: api
ports:
- port: 80
targetPort: 8080
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: api
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
parentRefs:
- name: default
namespace: nginx-gateway
sectionName: https-api-mein-projekt-de
hostnames:
- "api.mein-projekt.de"
rules:
- backendRefs:
- name: api
port: 80
Die Annotation cert-manager.io/cluster-issuer an der HTTPRoute ist ein Opt-in für automatisches TLS. Der Controller, der die Gateway-Listener anlegt, prüft nur, ob sie gesetzt ist, ihr Wert wählt keinen Issuer aus. Welcher ClusterIssuer die Zertifikate ausstellt, bestimmt die Annotation am Gateway.
4. Deployen (2 Minuten)
kubectl apply -f k8s/ -n mein-namespace
Oder, wenn ArgoCD eingerichtet ist: einfach den Code nach Git pushen. ArgoCD erkennt die Änderung und rollt automatisch aus.
5. Prüfen (2 Minuten)
# Pods laufen?
kubectl get pods -n mein-namespace
# Logs anschauen
kubectl logs -n mein-namespace deployment/api
# Deployment-Status
kubectl rollout status deployment/api -n mein-namespace
Das war’s. Kein Terraform. Kein Ansible. Keine Node-Konfiguration. Keine Ingress-Klassen. Kein cert-manager-Setup.
GitOps: Deployments per Git-Push
Die manuelle Anwendung von kubectl apply funktioniert, ist aber nicht ideal für Teams. ArgoCD (bei ITSH bereits integriert) macht den Deployment-Prozess deklarativ und nachvollziehbar.
So funktioniert es:
- Kubernetes-Manifeste liegen in einem Git-Repository
- ArgoCD überwacht das Repository
- Bei jeder Änderung auf dem konfigurierten Branch synchronisiert ArgoCD den Cluster-Zustand
Vorteile für Teams ohne DevOps:
- Audit-Trail: Jedes Deployment ist ein Git-Commit mit Autor, Zeitstempel und Diff.
- Rollback per Git:
git revertstellt den vorherigen Zustand wieder her. - Kein Cluster-Zugang nötig: Entwickler pushen Manifeste, ArgoCD übernimmt den Rest.
- Drift Detection: ArgoCD erkennt, wenn der Cluster-Zustand vom Git-Stand abweicht.
# Neues Image-Tag in der Manifest-Datei aktualisieren
# (oder per CI/CD-Pipeline automatisieren)
sed -i 's|api:1.0.0|api:1.1.0|' k8s/deployment.yaml
git add k8s/deployment.yaml
git commit -m "chore: update api to 1.1.0"
git push
# ArgoCD rollt automatisch aus
Typische Bedenken und warum sie bei Managed Namespaces nicht greifen
“Kubernetes ist zu komplex für unser Team”
Ein vollständiger Cluster: ja. Ein Namespace: nein. Du brauchst drei Konzepte zu verstehen: Deployment, Service, HTTPRoute. Das lässt sich an einem Nachmittag erlernen.
“Wir haben niemanden, der Kubernetes-Probleme debuggen kann”
Die häufigsten Probleme bei Anwendungs-Deployments sind:
- Image kann nicht gepullt werden → Registry-Credentials prüfen
- Pod startet nicht →
kubectl logsundkubectl describe pod - Anwendung ist nicht erreichbar → Service-Selector und Port prüfen
Das sind Anwendungsprobleme, keine Cluster-Probleme. Cluster-Probleme (Node-Ausfälle, Netzwerk-Partitionen, etcd-Korruption) behebt das ITSH-Team.
“Was ist mit Secrets und sensiblen Daten?”
Kubernetes Secrets sind im Namespace isoliert. Du erstellst sie einmal per kubectl:
kubectl create secret generic app-secrets \
--from-literal=database-url='postgres://user:pass@db:5432/mydb' \
-n mein-namespace
Für einen zusätzlichen Layer können Secrets über ein Git-Repository mit Sealed Secrets oder SOPS verschlüsselt verwaltet werden.
“Brauchen wir eine Container Registry?”
Jede öffentliche oder private Registry funktioniert: GitHub Container Registry (ghcr.io), Docker Hub oder eine selbst gehostete Lösung. Für private Images einfach ein Image-Pull-Secret im Namespace hinterlegen.
Was Entwickler statt Ops-Aufgaben tun können
Die Zeit, die ein Team nicht für Cluster-Wartung aufwendet, fließt in Produktentwicklung. Eine konservative Schätzung:
| Aufgabe | Zeitaufwand/Monat (Self-Hosted) | Zeitaufwand/Monat (Managed) |
|---|---|---|
| Kubernetes-Updates | 4–8 h | 0 h |
| Node-Wartung | 2–4 h | 0 h |
| Monitoring-Setup | 4–8 h (initial), 2 h (laufend) | 0 h |
| Zertifikatsverwaltung | 1–2 h | 0 h |
| Backup-Verifizierung | 2–4 h | 0 h |
| Incident Response (Cluster) | 2–8 h | 0 h |
| Summe | 15–34 h | 0 h |
Bei einem Stundensatz von 90 € sind das 1.350 bis 3.060 € pro Monat an eingesparter Arbeitszeit, zusätzlich zu den niedrigeren Infrastrukturkosten. 90 € ist dabei das untere Ende der aktuellen deutschen Freelancer-Sätze, Agenturen liegen eher bei 120 bis 150 € pro Stunde.
Ein realistisches Setup für ein Drei-Personen-Team
Szenario: Eine Agentur betreibt eine Kunden-Plattform mit API, Frontend und Hintergrund-Jobs.
Infrastruktur auf ITSH:
- 1 Namespace mit PAYG-Abrechnung
- 3 Deployments (API, Frontend, Worker)
- 1 PostgreSQL-Datenbank (als StatefulSet oder externer Service)
- ArgoCD für automatische Deployments
- Tägliche Backups der Namespace-Ressourcen (Wiederherstellung über den Support, kein Self-Service). Eigene Datensicherungen ersetzt das nicht.
Workflow:
- Entwickler schreibt Code und pusht zu GitHub
- GitHub Actions baut das Container-Image
- Image wird in die Registry gepusht
- Manifest-Datei wird mit neuem Tag aktualisiert (manuell oder automatisch)
- ArgoCD deployed die Änderung
- Pods, Logs und Events im Kundenportal zeigen, ob der Rollout durchgelaufen ist
Kein einziger Schritt in diesem Workflow erfordert Cluster-Administrationswissen.
Monatliche Kosten:
- ITSH Namespace: ~30–50 €/Monat (je nach Ressourcenverbrauch)
- GitHub Actions: Free Tier reicht für die meisten KMU
- Gesamtkosten: unter 50 €/Monat für eine produktionsreife Kubernetes-Umgebung
Fazit
Container-Deployments auf Kubernetes erfordern kein DevOps-Team, sondern eine Plattform, die den Cluster-Betrieb übernimmt. Die eigentliche Arbeit liegt im Anwendungs-Deployment: Dockerfiles schreiben, Manifeste pflegen, CI/CD einrichten. Das sind Aufgaben, die jede Entwicklerin und jeder Entwickler beherrschen kann.
Ein Managed Namespace bei ITSH reduziert den Einstieg auf drei Schritte:
- Anwendung in einen Container packen
- Kubernetes-Manifest schreiben
- Deployen, per
kubectl applyoder GitOps
Alles andere (Cluster-Updates, Monitoring, Backups, TLS, Skalierung) läuft im Hintergrund.