This commit adds complete documentation and tooling for migrating from local development (Kind/Colima on macOS) to production deployment (MicroK8s on Ubuntu VPS at Clouding.io). Documentation added: - K8S-MIGRATION-GUIDE.md: Comprehensive step-by-step migration guide covering all phases from VPS setup to post-deployment operations - MIGRATION-CHECKLIST.md: Quick reference checklist for migration tasks - MIGRATION-SUMMARY.md: High-level overview and key changes summary Configuration updates: - Added storage-patch.yaml for MicroK8s storage class compatibility (changes from 'standard' to 'microk8s-hostpath') - Updated prod/kustomization.yaml to include storage patch Helper scripts: - deploy-production.sh: Interactive deployment script with validation - tag-and-push-images.sh: Automated image tagging and registry push - backup-databases.sh: Database backup script for production Key differences addressed: - Ingress: MicroK8s addon vs custom NGINX - Storage: MicroK8s hostpath vs Kind standard storage - Registry: Container registry configuration for production - SSL: Let's Encrypt production certificates - Domains: Real domain configuration vs localhost - Resources: Production-grade resource limits and scaling The migration guide covers: - VPS setup and MicroK8s installation - Configuration adaptations required - Container registry setup options - SSL certificate configuration - Monitoring and backup setup - Troubleshooting common issues - Security hardening checklist - Rollback procedures All existing Kubernetes manifests remain unchanged and compatible.
7.9 KiB
Migration Summary: Local to Production
Quick Overview
You're migrating from Kind/Colima (macOS) to MicroK8s (Ubuntu VPS).
Good news: Most of your Kubernetes configuration is already production-ready! Your infrastructure is well-structured with proper overlays for dev and prod environments.
What You Already Have ✅
Your configuration already includes:
- ✅ Separate dev and prod overlays
- ✅ Production ingress configuration
- ✅ Production ConfigMap with proper settings
- ✅ Resource scaling (2-3 replicas per service in prod)
- ✅ HorizontalPodAutoscalers for key services
- ✅ Security configurations (TLS, secrets, etc.)
- ✅ Database configurations
- ✅ Monitoring components (Prometheus, Grafana)
What Needs to Change 🔧
Critical Changes (Must Do)
-
Domain Names - Update in
infrastructure/kubernetes/overlays/prod/prod-ingress.yaml:- Replace
bakery.yourdomain.com→ your actual domain - Replace
api.yourdomain.com→ your actual API domain - Replace
monitoring.yourdomain.com→ your actual monitoring domain - Update CORS origins
- Update cert-manager email
- Replace
-
Storage Class - Already patched in
storage-patch.yaml:standard→microk8s-hostpath
-
Production Secrets - Update in
infrastructure/kubernetes/base/secrets.yaml:- Generate strong passwords
- Update all sensitive values
- Never commit real secrets to git!
-
Container Registry - Choose and configure:
- Docker Hub (easiest)
- GitHub Container Registry
- MicroK8s built-in registry
- Update image references in prod kustomization
Setup on VPS
-
Install MicroK8s:
sudo snap install microk8s --classic microk8s enable dns hostpath-storage ingress cert-manager metrics-server -
Configure Firewall:
sudo ufw allow 22/tcp 80/tcp 443/tcp sudo ufw enable -
DNS Configuration: Point your domains to VPS IP address
File Changes Summary
New Files Created
docs/K8S-MIGRATION-GUIDE.md # Comprehensive guide
docs/MIGRATION-CHECKLIST.md # Quick checklist
docs/MIGRATION-SUMMARY.md # This file
infrastructure/kubernetes/overlays/prod/storage-patch.yaml # Storage fix
scripts/deploy-production.sh # Deployment helper
scripts/tag-and-push-images.sh # Image management
scripts/backup-databases.sh # Backup script
Files to Modify
-
infrastructure/kubernetes/overlays/prod/prod-ingress.yaml
- Update domain names (3 places)
- Update CORS origins
- Update cert-manager email
-
infrastructure/kubernetes/base/secrets.yaml
- Update all secrets with production values
- Generate strong passwords
-
infrastructure/kubernetes/overlays/prod/kustomization.yaml
- Update image registry prefixes if using external registry
- Already includes storage patch
Key Differences Table
| Feature | Local (Kind) | Production (MicroK8s) | Action Required |
|---|---|---|---|
| Cluster | Kind in Docker | Native MicroK8s | Install MicroK8s |
| Ingress | Custom NGINX | MicroK8s addon | Enable addon |
| Storage | standard |
microk8s-hostpath |
Use storage patch ✅ |
| Images | Local build | Registry push | Setup registry |
| Domains | localhost | Real domains | Update ingress |
| SSL | Self-signed | Let's Encrypt | Configure email |
| Replicas | 1 per service | 2-3 per service | Already configured ✅ |
| Resources | Minimal | Production limits | Already configured ✅ |
| Secrets | Dev secrets | Production secrets | Update values |
| Monitoring | Optional | Recommended | Already configured ✅ |
Deployment Steps (Quick Version)
Phase 1: Prepare (On Local Machine)
# 1. Update domain names
vim infrastructure/kubernetes/overlays/prod/prod-ingress.yaml
# 2. Update secrets (use strong passwords!)
vim infrastructure/kubernetes/base/secrets.yaml
# 3. Build and push images
docker login # or setup your registry
./scripts/tag-and-push-images.sh YOUR_USERNAME/bakery latest
# 4. Update image references if using external registry
vim infrastructure/kubernetes/overlays/prod/kustomization.yaml
Phase 2: Setup VPS
# SSH to VPS
ssh user@YOUR_VPS_IP
# Install MicroK8s
sudo snap install microk8s --classic --channel=1.28/stable
sudo usermod -a -G microk8s $USER
newgrp microk8s
# Enable addons
microk8s enable dns hostpath-storage ingress cert-manager metrics-server rbac
# Setup kubectl
echo "alias kubectl='microk8s kubectl'" >> ~/.bashrc
source ~/.bashrc
# Configure firewall
sudo ufw allow 22/tcp 80/tcp 443/tcp
sudo ufw enable
Phase 3: Deploy
# On VPS - clone your repo or copy manifests
git clone YOUR_REPO_URL
cd bakery_ia
# Deploy
kubectl apply -k infrastructure/kubernetes/overlays/prod
# Monitor
kubectl get pods -n bakery-ia -w
# Check everything
kubectl get all,ingress,pvc,certificate -n bakery-ia
Phase 4: Verify
# Test access
curl -k https://bakery.yourdomain.com
curl -k https://api.yourdomain.com/health
# Check SSL
kubectl get certificate -n bakery-ia
# Check logs
kubectl logs -n bakery-ia deployment/gateway
Common Pitfalls to Avoid
- Forgot to update domain names → Ingress won't work
- Using dev secrets in production → Security risk
- DNS not propagated → SSL certificate won't issue
- Firewall blocking ports 80/443 → Can't access application
- Images not in registry → Pods fail with ImagePullBackOff
- Wrong storage class → PVCs stay pending
- Insufficient VPS resources → Pods get evicted
Resource Requirements
Minimum VPS Specs
- CPU: 4 cores (6+ recommended)
- RAM: 8GB (16GB+ recommended)
- Disk: 100GB (SSD preferred)
- Network: Public IP with ports 80/443 open
Resource Usage Estimates
With current prod configuration:
- ~20-30 pods running
- ~4-6GB memory used
- ~2-3 CPU cores used
- ~10-20GB disk for databases
Testing Strategy
-
Local Testing (Before deploying):
- Build all images successfully
- Test with
skaffold build -f skaffold-prod.yaml - Validate kustomization:
kubectl kustomize infrastructure/kubernetes/overlays/prod
-
Staging Deploy (First deploy):
- Deploy to staging/test environment first
- Test all functionality
- Verify SSL certificates
- Load test
-
Production Deploy:
- Deploy during low-traffic window
- Have rollback plan ready
- Monitor closely for first 24 hours
Rollback Plan
If deployment fails:
# Quick rollback
kubectl rollout undo deployment/DEPLOYMENT_NAME -n bakery-ia
# Or delete and redeploy previous version
kubectl delete -k infrastructure/kubernetes/overlays/prod
# Deploy previous version
Always have:
- Previous version images tagged
- Database backups
- Configuration backups
Post-Deployment Checklist
- Application accessible via HTTPS
- SSL certificates valid
- All services healthy
- Database migrations completed
- Monitoring configured
- Backups scheduled
- Alerts configured
- Team has access
- Documentation updated
- Runbooks created
Getting Help
- Full Guide: See
docs/K8S-MIGRATION-GUIDE.md - Checklist: See
docs/MIGRATION-CHECKLIST.md - MicroK8s: https://microk8s.io/docs
- Kubernetes: https://kubernetes.io/docs
Estimated Timeline
- VPS Setup: 30-60 minutes
- Configuration Updates: 30-60 minutes
- Image Build & Push: 20-40 minutes
- Deployment: 15-30 minutes
- Verification & Testing: 30-60 minutes
- Total: 2-4 hours (first time)
With experience: ~1 hour for updates/redeployments
Next Steps
- Read through the full migration guide
- Provision your VPS
- Update configuration files
- Test locally first
- Deploy to production
- Monitor and optimize
Good luck! 🚀