Kubernetes (K8s) ist die führende Plattform für Container-Orchestrierung. Es automatisiert Deployment, Skalierung und Verwaltung von containerisierten Anwendungen.
Warum Kubernetes?
Vorteile
- Automatische Skalierung
- Self-Healing (automatischer Neustart)
- Load Balancing
- Rolling Updates
- Service Discovery
- Konfigurationsmanagement
Kubernetes vs. Docker Compose
| Feature | Docker Compose | Kubernetes |
|---|
| Komplexität | Einfach | Komplex |
| Skalierung | Manuell | Automatisch |
| Self-Healing | Nein | Ja |
| Multi-Host | Nein | Ja |
| Produktion | Klein | Enterprise |
Grundkonzepte
Architektur
┌─────────────────────────────────────────────────┐
│ Control Plane │
│ ┌───────────┐ ┌──────────┐ ┌───────────────┐ │
│ │ API Server│ │ Scheduler│ │ Controller │ │
│ │ │ │ │ │ Manager │ │
│ └───────────┘ └──────────┘ └───────────────┘ │
│ ┌─────────────────────────────────────────┐ │
│ │ etcd │ │
│ └─────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
│
┌───────────────────┼───────────────────┐
│ │ │
┌───▼───┐ ┌────▼───┐ ┌───▼───┐
│ Node 1│ │ Node 2 │ │ Node 3│
│┌─────┐│ │┌─────┐ │ │┌─────┐│
││ Pod ││ ││ Pod │ │ ││ Pod ││
│└─────┘│ │└─────┘ │ │└─────┘│
│kubelet│ │kubelet │ │kubelet│
└───────┘ └────────┘ └───────┘
Wichtige Komponenten
Pod: Kleinste Einheit, ein oder mehrere Container
Deployment: Verwaltung von Pod-Replicas
Service: Netzwerk-Endpunkt für Pods
ConfigMap: Konfigurationsdaten
Secret: Sensible Daten (verschlüsselt)
Namespace: Logische Trennung von Ressourcen
Installation (Minikube)
Voraussetzungen
# Docker installieren
apt install docker.io
systemctl enable --now docker
Minikube installieren
# Minikube herunterladen
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
chmod +x minikube-linux-amd64
mv minikube-linux-amd64 /usr/local/bin/minikube
# Cluster starten
minikube start --driver=docker
# Status prüfen
minikube status
kubectl installieren
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
mv kubectl /usr/local/bin/
# Verbindung testen
kubectl cluster-info
kubectl get nodes
Pods
Pod erstellen (imperativ)
kubectl run nginx --image=nginx --port=80
kubectl get pods
kubectl describe pod nginx
Pod-Definition (YAML)
# nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
resources:
limits:
memory: "128Mi"
cpu: "500m"
requests:
memory: "64Mi"
cpu: "250m"
kubectl apply -f nginx-pod.yaml
kubectl get pods
kubectl logs nginx-pod
kubectl exec -it nginx-pod -- /bin/bash
Multi-Container Pod
apiVersion: v1
kind: Pod
metadata:
name: multi-container
spec:
containers:
- name: app
image: nginx
ports:
- containerPort: 80
- name: sidecar
image: busybox
command: ['sh', '-c', 'while true; do echo "sidecar running"; sleep 3600; done']
Deployments
Deployment erstellen
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.24
ports:
- containerPort: 80
resources:
limits:
memory: "128Mi"
cpu: "500m"
kubectl apply -f nginx-deployment.yaml
kubectl get deployments
kubectl get pods
Skalierung
# Manuell skalieren
kubectl scale deployment nginx-deployment --replicas=5
# Autoscaling
kubectl autoscale deployment nginx-deployment --min=2 --max=10 --cpu-percent=50
Rolling Update
# Image aktualisieren
kubectl set image deployment/nginx-deployment nginx=nginx:1.25
# Update-Status
kubectl rollout status deployment/nginx-deployment
# Rollback
kubectl rollout undo deployment/nginx-deployment
# Historie anzeigen
kubectl rollout history deployment/nginx-deployment
Services
Service-Typen
| Typ | Beschreibung |
|---|
| ClusterIP | Nur intern erreichbar (Standard) |
| NodePort | Extern über Node-Port erreichbar |
| LoadBalancer | Externer Load Balancer |
| ExternalName | DNS-CNAME-Eintrag |
ClusterIP Service
# nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: ClusterIP
NodePort Service
apiVersion: v1
kind: Service
metadata:
name: nginx-nodeport
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080
type: NodePort
kubectl apply -f nginx-service.yaml
kubectl get services
# Zugriff testen (Minikube)
minikube service nginx-nodeport --url
LoadBalancer Service
apiVersion: v1
kind: Service
metadata:
name: nginx-lb
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: LoadBalancer
ConfigMaps und Secrets
ConfigMap erstellen
# app-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_ENV: "production"
APP_DEBUG: "false"
database.conf: |
host=localhost
port=3306
kubectl apply -f app-config.yaml
# Oder imperativ
kubectl create configmap app-config --from-literal=APP_ENV=production
ConfigMap verwenden
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec:
containers:
- name: app
image: myapp
envFrom:
- configMapRef:
name: app-config
# Oder einzelne Werte
env:
- name: ENVIRONMENT
valueFrom:
configMapKeyRef:
name: app-config
key: APP_ENV
Secret erstellen
# Imperativ
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=geheim123
# db-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # base64-kodiert
password: Z2VoZWltMTIz # base64-kodiert
Secret verwenden
apiVersion: v1
kind: Pod
metadata:
name: app-with-secret
spec:
containers:
- name: app
image: myapp
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
Volumes
EmptyDir
apiVersion: v1
kind: Pod
metadata:
name: pod-with-volume
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: shared-data
mountPath: /data
volumes:
- name: shared-data
emptyDir: {}
PersistentVolume
# pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-storage
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/pv
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-storage
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
PVC verwenden
apiVersion: v1
kind: Pod
metadata:
name: pod-with-pvc
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: storage
mountPath: /data
volumes:
- name: storage
persistentVolumeClaim:
claimName: pvc-storage
Namespaces
Namespace erstellen
kubectl create namespace development
kubectl create namespace production
Ressourcen in Namespace
# Pods in Namespace auflisten
kubectl get pods -n development
# Pod in Namespace erstellen
kubectl run nginx --image=nginx -n development
# Alle Namespaces
kubectl get pods --all-namespaces
Standard-Namespace setzen
kubectl config set-context --current --namespace=development
Ingress
Ingress Controller installieren
# Nginx Ingress Controller (Minikube)
minikube addons enable ingress
Ingress-Ressource
# app-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
Ingress mit TLS
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: secure-ingress
spec:
tls:
- hosts:
- app.example.com
secretName: tls-secret
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
Wichtige Befehle
Ressourcen verwalten
# Erstellen/Aktualisieren
kubectl apply -f manifest.yaml
# Löschen
kubectl delete -f manifest.yaml
kubectl delete pod nginx-pod
# Auflisten
kubectl get pods
kubectl get deployments
kubectl get services
kubectl get all
# Details anzeigen
kubectl describe pod nginx-pod
# Logs
kubectl logs pod-name
kubectl logs -f pod-name # Live
# Shell im Container
kubectl exec -it pod-name -- /bin/bash
Debugging
# Events anzeigen
kubectl get events
# Pod-Status
kubectl describe pod pod-name
# Ressourcenverbrauch
kubectl top pods
kubectl top nodes
# Port-Forwarding
kubectl port-forward pod/nginx-pod 8080:80
Beispiel: Komplette Anwendung
# app-complete.yaml
---
apiVersion: v1
kind: Namespace
metadata:
name: myapp
---
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: myapp
data:
APP_ENV: "production"
---
apiVersion: v1
kind: Secret
metadata:
name: db-secret
namespace: myapp
type: Opaque
data:
password: c2VjcmV0MTIz
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: myapp
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
envFrom:
- configMapRef:
name: app-config
resources:
limits:
memory: "128Mi"
cpu: "500m"
---
apiVersion: v1
kind: Service
metadata:
name: web-service
namespace: myapp
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
namespace: myapp
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
Zusammenfassung
| Ressource | Funktion |
|---|
| Pod | Container-Gruppe |
| Deployment | Pod-Verwaltung mit Replicas |
| Service | Netzwerk-Endpunkt |
| ConfigMap | Konfiguration |
| Secret | Sensible Daten |
| Ingress | HTTP-Routing |
| PersistentVolume | Persistenter Speicher |
Fazit
Kubernetes bietet leistungsstarke Container-Orchestrierung für produktive Umgebungen. Beginnen Sie mit Minikube zum Lernen und verstehen Sie die Grundkonzepte Pod, Deployment und Service. Für Produktivumgebungen empfiehlt sich ein Managed Kubernetes wie GKE, EKS oder AKS, um die Komplexität des Cluster-Managements zu reduzieren.