Runbook: Kubernetes

Dauer: ~30 Minuten
Rolle: DevOps, Platform Engineer
Voraussetzung: kubectl, Kubernetes-Cluster

Data Gateway in Kubernetes deployen.


Workflow

flowchart TD A[Start] --> B[Namespace erstellen] B --> C[ConfigMap/Secret] C --> D[Deployment] D --> E[Service] E --> F[Ingress] F --> G[Health Check] G --> H{OK?} H -->|Ja| I[Fertig] H -->|Nein| J[kubectl logs] style I fill:#e8f5e9 style J fill:#ffebee


1. Namespace erstellen

kubectl create namespace data-gateway
kubectl config set-context --current --namespace=data-gateway

2. ConfigMap für Konfiguration

# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: gateway-config
  namespace: data-gateway
data:
  appsettings.json: |
    {
      "Gateway": {
        "Databases": {
          "demo": {
            "Provider": "sqlite",
            "ConnectionString": "Data Source=/app/data/demo.db"
          }
        }
      },
      "Logging": {
        "LogLevel": {
          "Default": "Information"
        }
      }
    }
kubectl apply -f configmap.yaml

3. Secret für Credentials

# Secret erstellen
kubectl create secret generic gateway-secrets \
    --from-literal=DB_PASSWORD='secret123' \
    -n data-gateway

Oder deklarativ:

# secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: gateway-secrets
  namespace: data-gateway
type: Opaque
stringData:
  DB_PASSWORD: "secret123"

4. Deployment

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: data-gateway
  namespace: data-gateway
  labels:
    app: data-gateway
spec:
  replicas: 2
  selector:
    matchLabels:
      app: data-gateway
  template:
    metadata:
      labels:
        app: data-gateway
    spec:
      containers:
        - name: gateway
          image: registry.example.com/data-gateway:v3.0
          ports:
            - containerPort: 5000
              name: http
          env:
            - name: ASPNETCORE_ENVIRONMENT
              value: "Production"
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: gateway-secrets
                  key: DB_PASSWORD
          volumeMounts:
            - name: config
              mountPath: /app/appsettings.json
              subPath: appsettings.json
            - name: data
              mountPath: /app/data
          resources:
            requests:
              memory: "256Mi"
              cpu: "250m"
            limits:
              memory: "512Mi"
              cpu: "500m"
          livenessProbe:
            httpGet:
              path: /health
              port: 5000
            initialDelaySeconds: 10
            periodSeconds: 30
          readinessProbe:
            httpGet:
              path: /health
              port: 5000
            initialDelaySeconds: 5
            periodSeconds: 10
      volumes:
        - name: config
          configMap:
            name: gateway-config
        - name: data
          persistentVolumeClaim:
            claimName: gateway-data
kubectl apply -f deployment.yaml

5. PersistentVolumeClaim

# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: gateway-data
  namespace: data-gateway
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: standard  # Anpassen an Cluster

6. Service

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: data-gateway
  namespace: data-gateway
spec:
  selector:
    app: data-gateway
  ports:
    - port: 80
      targetPort: 5000
      protocol: TCP
  type: ClusterIP
kubectl apply -f service.yaml

7. Ingress

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: data-gateway
  namespace: data-gateway
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  ingressClassName: nginx
  tls:
    - hosts:
        - gateway.example.com
      secretName: gateway-tls
  rules:
    - host: gateway.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: data-gateway
                port:
                  number: 80
kubectl apply -f ingress.yaml

8. Health Check

# Pod-Status
kubectl get pods -n data-gateway
 
# Pod-Logs
kubectl logs -f deployment/data-gateway -n data-gateway
 
# Port-Forward für lokalen Test
kubectl port-forward svc/data-gateway 5000:80 -n data-gateway
 
# In neuem Terminal:
curl http://localhost:5000/health

9. Checkliste

# Prüfpunkt
———–
1 Namespace erstellt
2 ConfigMap applied
3 Secret erstellt
4 PVC erstellt
5 Deployment applied
6 Service applied
7 Ingress applied
8 Pods Running
9 Health Check OK

Kubectl-Befehle

Befehl Beschreibung
——–————–
kubectl get pods Pods anzeigen
kubectl logs -f <pod> Live-Logs
kubectl describe pod <pod> Pod-Details
kubectl exec -it <pod> – sh Shell im Pod
kubectl rollout restart deployment/data-gateway Rolling Restart
kubectl scale deployment/data-gateway –replicas=3 Skalieren

Troubleshooting

Problem Ursache Lösung
————————–
ImagePullBackOff Image nicht gefunden Registry/Tag prüfen
CrashLoopBackOff App startet nicht kubectl logs prüfen
Pending Kein Node verfügbar Resources reduzieren
0/1 Ready Readiness-Probe fehlgeschlagen Probe-Config prüfen

HorizontalPodAutoscaler

# hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: data-gateway
  namespace: data-gateway
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: data-gateway
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70

Verwandte Runbooks


« ← Docker | → Operator-Übersicht »


Wolfgang van der Stille @ EMSR DATA d.o.o. - Data Gateway Professional

Zuletzt geändert: den 29.01.2026 um 15:12