Runbook: Kubernetes

Trajanje: ~30 minut
Vloga: DevOps, Platform Engineer
Predpogoj: kubectl, Kubernetes gruča

Namestitev Data Gateway v Kubernetes.


Potek dela

flowchart TD A[Začetek] --> B[Ustvari Namespace] B --> C[ConfigMap/Secret] C --> D[Deployment] D --> E[Service] E --> F[Ingress] F --> G[Health Check] G --> H{V redu?} H -->|Da| I[Končano] H -->|Ne| J[kubectl logs] style I fill:#e8f5e9 style J fill:#ffebee


1. Ustvarjanje Namespace

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

2. ConfigMap za konfiguracijo

# 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 za poverilnice

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

Ali deklarativno:

# 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  # Prilagodi gruči

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

# Status podov
kubectl get pods -n data-gateway
 
# Dnevniki podov
kubectl logs -f deployment/data-gateway -n data-gateway
 
# Port-Forward za lokalni test
kubectl port-forward svc/data-gateway 5000:80 -n data-gateway
 
# V novem terminalu:
curl http://localhost:5000/health

9. Kontrolni seznam

# Točka preverjanja V
———–
1 Namespace ustvarjen
2 ConfigMap uveljavljen
3 Secret ustvarjen
4 PVC ustvarjen
5 Deployment uveljavljen
6 Service uveljavljen
7 Ingress uveljavljen
8 Podi Running
9 Health Check v redu

Kubectl ukazi

Ukaz Opis
——–————–
kubectl get pods Prikaži pode
kubectl logs -f <pod> Live dnevniki
kubectl describe pod <pod> Podrobnosti poda
kubectl exec -it <pod> – sh Lupina v podu
kubectl rollout restart deployment/data-gateway Rolling Restart
kubectl scale deployment/data-gateway –replicas=3 Skaliranje

Odpravljanje težav

Težava Vzrok Rešitev
————————–
ImagePullBackOff Slika ni najdena Preveri register/tag
CrashLoopBackOff Aplikacija se ne zažene Preveri kubectl logs
Pending Ni razpoložljivega vozlišča Zmanjšaj Resources
0/1 Ready Readiness-Probe neuspešna Preveri konfiguracijo preverbe

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

Povezani Runbooks


« <- Docker | -> Pregled operaterja »


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

Zuletzt geändert: dne 29.01.2026 ob 23:34