zkt25/z2
2025-04-04 15:53:04 +02:00
..
deployment.yaml assignment 2 2025-04-04 15:53:04 +02:00
Dockerfile assignment 2 2025-04-04 15:53:04 +02:00
index.html assignment 2 2025-04-04 15:53:04 +02:00
namespace.yaml assignment 2 2025-04-04 15:53:04 +02:00
nginx.conf assignment 2 2025-04-04 15:53:04 +02:00
package.json assignment 2 2025-04-04 15:53:04 +02:00
persistentvolume.yaml assignment 2 2025-04-04 15:53:04 +02:00
prepare-app.sh assignment 2 2025-04-04 15:53:04 +02:00
README.md assignment 2 2025-04-04 15:53:04 +02:00
service.yaml assignment 2 2025-04-04 15:53:04 +02:00
start-app.sh assignment 2 2025-04-04 15:53:04 +02:00
statefulset.yaml assignment 2 2025-04-04 15:53:04 +02:00
stop-app.sh assignment 2 2025-04-04 15:53:04 +02:00

Kubernetes Task Manager - Technical Documentation

Project Purpose

This project demonstrates a production-like Kubernetes deployment featuring:

  • Multi-container application
  • Persistent storage
  • Scalable frontend
  • Proper resource management

Deployment Components

Core Objects

Object Type Name Purpose
Namespace web-app Isolates all application resources
Deployment web-app Manages 2 replicas of frontend pods
StatefulSet mysql Manages database pod with stable network identity

| Service | web-app-service | Exposes frontend on NodePort 30080 | | PersistentVolume| mysql-pv | Provides 5Gi storage for database |

Container Images

Component Image Port Notes
Frontend k8s-task-manager-frontend 80 Custom-built Nginx image
Database mysql:5.7 3306 With preconfigured credentials
Backend k8s-task-manager-api 8080 Node.js/Express REST API

Deployment Workflow

graph TD
    A[prepare-app.sh] --> B[Creates PV directories]
    B --> C[Builds frontend image]
    C --> D[start-app.sh]
    D --> E[Creates Namespace]
    E --> F[Deploys PV/PVC]
    F --> G[Deploys MySQL StatefulSet]
    G --> H[Deploys Frontend]
    H --> I[Creates Service]

# Key Configuration Details
## Resource Allocation

Frontend:

resources:
  requests:
    cpu: "100m"
    memory: "128Mi"
  limits:
    cpu: "250m"
    memory: "256Mi"


Database:

resources:
  requests:
    cpu: "500m"
    memory: "512Mi"
  limits:
    cpu: "1000m"
    memory: "1Gi"

Backend:

```yaml
resources:
  requests:
    cpu: "200m"
    memory: "256Mi"
  limits:
    cpu: "500m"
    memory: "512Mi"

Storage Configuration

# persistentvolume.yaml
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data/mysql"


# Operational Procedures
## Accessing the Application

Local Development:
minikube service web-app-service -n web-app

Production Access:
http://<node-ip>:30080

Monitoring Commands:
# Check pod status
kubectl get pods -n web-app -w

# View frontend logs
kubectl logs -n web_app deploy/web-app -f

# Verify database health
kubectl exec -n web-app mysql-0 -- mysql -uroot -ppassword -e "SHOW DATABASES;"

# Maintenance Tasks
Scaling Frontend:
kubectl scale -n web-app deployment/web-app --replicas=3

Database Backup:
kubectl exec -n web-app mysql-0 -- \
  mysqldump -u root -ppassword taskmanager > backup_$(date +%F).sql

# Security Notes
Database Credentials:

Default credentials are for demonstration only

In production, use:
envFrom:
- secretRef:
    name: mysql-credentials

Network Exposure:
Current: NodePort (30080)
Recommended: Ingress with TLS termination

# Troubleshooting Guide
Symptom	                        Diagnostic Steps        	        Resolution
Frontend not responding	kubectl get svc -n web-app	                Verify NodePort configuration
Database pod crash loops	kubectl describe pod mysql-0 -n web-app	Check storage permissions
High CPU usage	                kubectl top pods -n web-app      	Adjust resource limits

Cleanup Procedure
# Full uninstall
./stop-app.sh

# Optional: Remove persistent data
sudo rm -rf /mnt/data/mysql