Kubernetes deployment configuration for the OrgFin application - a multi-service financial organization platform.
The application consists of the following services:
- orgfin-backend (Python/FastAPI) - Main API service (port 8000)
- orgfin-backend-go (Go) - Secondary API service (port 8001)
- orgfin-celery - Background task processor
- orgfin-beat - Task scheduler
- redis - Caching and message broker
- orgfin-frontend - Web application (port 80)
kubectlinstalled and configuredkustomize(or kubectl v1.14+)- Access to Kubernetes cluster
- Docker images available:
ypeskov/api-orgfinypeskov/api-go-orgfinypeskov/frontend-orgfin
# Backend services
cd orgfin-backend
./apply.sh
# Frontend
cd orgfin-frontend
./apply.sh# Backend
kubectl apply -k orgfin-backend/overlays/dev
# Frontend
kubectl apply -k orgfin-frontend/overlays/dev.
├── orgfin-backend/
│ ├── base/ # Base Kubernetes manifests
│ │ ├── deployment.yaml # Backend deployments
│ │ ├── service.yaml # Services configuration
│ │ ├── ingress.yaml # Ingress rules
│ │ └── kustomization.yaml
│ └── overlays/
│ ├── dev/ # Development environment
│ │ ├── .env # Dev environment variables
│ │ └── kustomization.yaml
│ └── prod/ # Production environment
│ ├── .env.prod # Prod environment variables
│ └── kustomization.yaml
│
└── orgfin-frontend/
├── base/ # Base frontend manifests
└── overlays/
├── dev/
└── prod/
Environment variables are managed through Kustomize ConfigMaps:
- Development: Create
.envfile inoverlays/dev/ - Production: Create
.env.prodfile inoverlays/prod/
The HOSTNAME variable in Ingress configurations is automatically replaced based on environment.
DATABASE_URL=postgresql://user:password@host:5432/dbname
REDIS_URL=redis://redis:6379/0
SECRET_KEY=your-secret-key
HOSTNAME=orgfin.yourdomain.com# Apply specific environment
kubectl apply -k orgfin-backend/overlays/prod
kubectl apply -k orgfin-backend/overlays/dev
kubectl apply -k orgfin-frontend/overlays/prod
kubectl apply -k orgfin-frontend/overlays/devThe apply.sh scripts in each service directory handle deployment with environment selection:
cd orgfin-backend
./apply.sh
# Follow prompts to select environment# Deployments
kubectl get deployments
# Services
kubectl get services
# Ingresses
kubectl get ingresses
# Pods
kubectl get pods# Backend API
kubectl logs -f deployment/orgfin-backend
# Celery worker
kubectl logs -f deployment/orgfin-celery
# Frontend
kubectl logs -f deployment/orgfin-frontendkubectl describe deployment orgfin-backend
kubectl describe service orgfin-backend
kubectl describe ingress orgfin-ingressImage versions are managed in deployment YAML files:
-
Update image tag in
base/deployment.yaml:image: ypeskov/api-orgfin:v2.1.2
-
Apply changes:
kubectl apply -k overlays/prod
-
Verify rollout:
kubectl rollout status deployment/orgfin-backend
# Check pod status
kubectl get pods
# View pod events
kubectl describe pod <pod-name>
# Check logs
kubectl logs <pod-name># Delete existing ConfigMap
kubectl delete configmap orgfin-config
# Reapply configuration
kubectl apply -k overlays/prod
# Restart deployment
kubectl rollout restart deployment/orgfin-backend# Check ingress configuration
kubectl describe ingress orgfin-ingress
# Verify ingress controller is running
kubectl get pods -n ingress-nginx-
Check environment variables in ConfigMap:
kubectl get configmap orgfin-config -o yaml
-
Verify database connectivity from pod:
kubectl exec -it <pod-name> -- /bin/bash
# Scale backend
kubectl scale deployment orgfin-backend --replicas=3
# Scale celery workers
kubectl scale deployment orgfin-celery --replicas=5To enable horizontal pod autoscaling, create HPA resource:
kubectl autoscale deployment orgfin-backend --cpu-percent=70 --min=2 --max=10# View rollout history
kubectl rollout history deployment/orgfin-backend
# Rollback to previous version
kubectl rollout undo deployment/orgfin-backend
# Rollback to specific revision
kubectl rollout undo deployment/orgfin-backend --to-revision=2[Add your license here]