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
- KonfigurationsmanagementKubernetes 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 RessourcenInstallation (Minikube)
Voraussetzungen
# Docker installieren
apt install docker.io
systemctl enable --now dockerMinikube 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 statuskubectl 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 nodesPods
Pod erstellen (imperativ)
kubectl run nginx --image=nginx --port=80
kubectl get pods
kubectl describe pod nginxPod-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/bashMulti-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 podsSkalierung
# Manuell skalieren
kubectl scale deployment nginx-deployment --replicas=5
# Autoscaling
kubectl autoscale deployment nginx-deployment --min=2 --max=10 --cpu-percent=50Rolling 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-deploymentServices
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: ClusterIPNodePort Service
apiVersion: v1
kind: Service
metadata:
name: nginx-nodeport
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080
type: NodePortkubectl apply -f nginx-service.yaml
kubectl get services
# Zugriff testen (Minikube)
minikube service nginx-nodeport --urlLoadBalancer Service
apiVersion: v1
kind: Service
metadata:
name: nginx-lb
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: LoadBalancerConfigMaps 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=3306kubectl apply -f app-config.yaml
# Oder imperativ
kubectl create configmap app-config --from-literal=APP_ENV=productionConfigMap 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_ENVSecret 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-kodiertSecret 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: passwordVolumes
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: 5GiPVC 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-storageNamespaces
Namespace erstellen
kubectl create namespace development
kubectl create namespace productionRessourcen 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-namespacesStandard-Namespace setzen
kubectl config set-context --current --namespace=developmentIngress
Ingress Controller installieren
# Nginx Ingress Controller (Minikube)
minikube addons enable ingressIngress-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: 80Ingress 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: 80Wichtige 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/bashDebugging
# 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:80Beispiel: 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: 80Zusammenfassung
| 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.