Files
gym-tracker/kubernetes/README.md
2025-10-31 00:32:08 +01:00

159 lines
3.3 KiB
Markdown

# Kubernetes Deployment
This directory contains Kubernetes manifests for deploying the Gym Tracker application.
## Prerequisites
- Kubernetes cluster (1.19+)
- kubectl configured to access your cluster
- Docker registry (optional, for remote deployments)
## Files
- **persistentvolumeclaim.yaml** - PVC for SQLite database storage
- **deployment.yaml** - Application deployment
- **service.yaml** - ClusterIP service for internal access
- **ingress.yaml** - Optional ingress for external access
## Deployment Steps
### 1. Build and Push Docker Image
Build the Docker image:
```bash
docker build -t gym-tracker:latest .
```
If deploying to a remote cluster, tag and push to your registry:
```bash
docker tag gym-tracker:latest your-registry/gym-tracker:latest
docker push your-registry/gym-tracker:latest
```
Update the image name in `deployment.yaml` accordingly.
### 2. Deploy to Kubernetes
Apply all manifests:
```bash
kubectl apply -f kubernetes/
```
Or apply individually in order:
```bash
kubectl apply -f kubernetes/persistentvolumeclaim.yaml
kubectl apply -f kubernetes/deployment.yaml
kubectl apply -f kubernetes/service.yaml
# Optional: kubectl apply -f kubernetes/ingress.yaml
```
### 3. Verify Deployment
Check the deployment status:
```bash
kubectl get pods -l app=gym-tracker
kubectl get svc gym-tracker
kubectl get pvc gym-tracker-data
```
View logs:
```bash
kubectl logs -l app=gym-tracker -f
```
### 4. Access the Application
#### Port Forward (for testing)
```bash
kubectl port-forward svc/gym-tracker 8080:80
```
Then access at http://localhost:8080
#### Using Ingress (for production)
1. Ensure an Ingress controller is installed in your cluster
2. Update the host in `ingress.yaml` with your domain
3. Apply the ingress: `kubectl apply -f kubernetes/ingress.yaml`
4. Access at http://your-domain.com
#### Using LoadBalancer
Change the service type in `service.yaml` from `ClusterIP` to `LoadBalancer`:
```yaml
spec:
type: LoadBalancer
```
Then get the external IP:
```bash
kubectl get svc gym-tracker
```
## Configuration
### Storage
The default PVC requests 1Gi of storage. Adjust in `persistentvolumeclaim.yaml`:
```yaml
resources:
requests:
storage: 5Gi # Increase as needed
```
### Replicas
The application uses SQLite, which is file-based. Keep replicas at 1 to avoid database locking issues:
```yaml
spec:
replicas: 1
```
For high availability, consider migrating to PostgreSQL or MySQL.
### Resources
Adjust resource limits in `deployment.yaml` based on your needs:
```yaml
resources:
requests:
memory: "256Mi"
cpu: "200m"
limits:
memory: "1Gi"
cpu: "1000m"
```
## Backup
To backup the SQLite database:
```bash
kubectl exec -it <pod-name> -- sqlite3 /app/data/gym-tracker.db ".backup /app/data/backup.db"
kubectl cp <pod-name>:/app/data/backup.db ./backup.db
```
## Troubleshooting
### Pod not starting
```bash
kubectl describe pod -l app=gym-tracker
kubectl logs -l app=gym-tracker
```
### Database issues
Check volume mount:
```bash
kubectl exec -it <pod-name> -- ls -la /app/data
```
### Health check failures
Test health endpoint:
```bash
kubectl exec -it <pod-name> -- wget -O- http://localhost/health
```
## Cleanup
Remove all resources:
```bash
kubectl delete -f kubernetes/
```
**Warning:** This will delete the PVC and all data. Backup first if needed.