Skip to main content

Kubernetes Operations

Day-2 operations for managing your Kuploy deployment on Kubernetes.

Check Status

python deploy.py status

Or manually:

# Check pods
kubectl get pods -n kuploy

# Check deployment
kubectl get deployment kuploy -n kuploy

# Check ingress
kubectl get ingress -n kuploy

Upgrade Edition

Upgrade from OSS to Cloud edition:

# Upgrade from OSS to Cloud
python deploy.py --edition cloud --domain console.example.com

# Watch rollout
kubectl rollout status deployment/kuploy -n kuploy

Scaling

Horizontal Scaling

# Scale Kuploy replicas
kubectl scale deployment/kuploy -n kuploy --replicas=3

# Or via deploy.py
python deploy.py --replicas 3

Vertical Scaling

Edit resource limits:

kubectl edit deployment/kuploy -n kuploy

Updating Secrets

# Edit secrets directly
kubectl edit secret kuploy-secrets -n kuploy

# Or patch a specific value
kubectl patch secret kuploy-secrets -n kuploy -p '{"data":{"KEY":"BASE64_VALUE"}}'

# Restart to pick up changes
kubectl rollout restart deployment/kuploy -n kuploy

Backup & Restore

Database Backup

# Backup
kubectl exec -it postgresql-0 -n database -- pg_dump -U kuploy kuploy > backup.sql

# Restore
kubectl exec -i postgresql-0 -n database -- psql -U kuploy kuploy < backup.sql

Persistent Volume Backup

The kuploy-data PVC contains application data. Back it up according to your storage class capabilities.

Uninstall

python deploy.py uninstall

Database Cleanup (after uninstall)

kubectl exec -it postgresql-0 -n database -- psql -U postgres -c "DROP DATABASE kuploy;"
kubectl exec -it postgresql-0 -n database -- psql -U postgres -c "DROP USER kuploy;"

Logs

# Kuploy logs
kubectl logs -n kuploy -l app.kubernetes.io/name=kuploy -f

# Buildkit logs
kubectl logs -n kuploy -l app.kubernetes.io/name=buildkitd -f

# All pods in namespace
kubectl logs -n kuploy --all-containers -f

Troubleshooting

Pod Not Starting

# Check events
kubectl describe pod -n kuploy -l app.kubernetes.io/name=kuploy

# Check resource constraints
kubectl top pods -n kuploy

Buildkit Issues

# Reset buildkit
kubectl delete statefulset buildkitd -n kuploy
kubectl delete pod buildkitd-0 -n kuploy --force --grace-period=0

# Redeploy
python deploy.py buildkit --storage-class openebs.io/local

# Watch
kubectl get pods -n kuploy -l app.kubernetes.io/name=buildkitd -w

Test Buildkit

# Verify worker
kubectl exec -n kuploy buildkitd-0 -- buildctl --addr tcp://127.0.0.1:1234 debug workers

# Quick build test
kubectl exec -n kuploy buildkitd-0 -- sh -c 'mkdir -p /tmp/test && echo "FROM alpine:3.19" > /tmp/test/Dockerfile'
kubectl exec -n kuploy buildkitd-0 -- buildctl --addr tcp://127.0.0.1:1234 build \
--frontend dockerfile.v0 \
--local context=/tmp/test \
--local dockerfile=/tmp/test \
--output type=image,name=test:latest,push=false

Ingress Issues

# Check ingress status
kubectl describe ingress kuploy -n kuploy

# Check ingress controller logs
kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx

Database Connection Issues

# Test connection from Kuploy pod
kubectl exec -it deployment/kuploy -n kuploy -- sh -c 'echo "SELECT 1" | psql $DATABASE_URL'

# Check PostgreSQL is running
kubectl get pods -n database -l app.kubernetes.io/name=postgresql

TLS Certificate Issues

# Check certificate status
kubectl get certificate -n kuploy

# Check cert-manager logs
kubectl logs -n cert-manager -l app=cert-manager

Health Checks

Kuploy exposes health endpoints:

EndpointPurpose
/api/healthBasic health check
/api/health/readyReadiness (DB connected)
# Test from inside cluster
kubectl exec -it deployment/kuploy -n kuploy -- curl -s localhost:3000/api/health

Monitoring Integration

Prometheus Metrics

Kuploy exposes Prometheus metrics at /metrics. Add a ServiceMonitor:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: kuploy
namespace: kuploy
spec:
selector:
matchLabels:
app.kubernetes.io/name: kuploy
endpoints:
- port: http
path: /metrics

Alerting

Example alerts for Prometheus Alertmanager:

groups:
- name: kuploy
rules:
- alert: KuployDown
expr: up{job="kuploy"} == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Kuploy is down"
- alert: KuployHighErrorRate
expr: rate(http_requests_total{job="kuploy",status=~"5.."}[5m]) > 0.1
for: 5m
labels:
severity: warning