# To-Do List Application on Kubernetes ## Application Description This is a simple To-Do List web application that allows users to: - Add new tasks - Mark tasks as completed - Delete tasks - Filter tasks by their status (All, Active, Completed) - Reorder tasks using drag-and-drop functionality The application uses local storage to persist tasks and allows users to manage their daily tasks efficiently. ## Container Images Used 1. **todo-web-app:latest**: - Custom image based on nginx:alpine - Contains the static web files (HTML, CSS, JavaScript) for the To-Do List application - Serves the web interface on port 80 2. **redis:alpine**: - Official Redis image based on Alpine Linux - Used in the StatefulSet for data persistence - Stores task data on a persistent volume - Runs on port 6379 ## Kubernetes Objects 1. **Namespace** (`todo-app-ns`): - Isolates all the application resources in a dedicated namespace 2. **Deployment** (`todo-web-app`): - Manages the web application containers - Maintains 2 replicas for high availability - Defines resource limits and requests 3. **StatefulSet** (`todo-data-manager`): - Manages Redis instances for data persistence - Uses persistent storage to maintain task data - Ensures data consistency during pod restarts 4. **PersistentVolume** (`todo-app-pv`): - Provides storage resources for the application - Uses local storage on the host at `/mnt/data/todo-app` - 1GB capacity for storing task data 5. **PersistentVolumeClaim** (`todo-app-pvc`): - Claims storage from the PersistentVolume - Used by the StatefulSet for data persistence 6. **Services**: - `todo-web-service`: NodePort service exposing the web application - `todo-data-service`: Headless service for the StatefulSet ## Network and Volume Configuration ### Networks - The application components communicate within the Kubernetes cluster using services - `todo-web-service` exposes the web interface externally using NodePort - `todo-data-service` provides internal DNS-based service discovery for the StatefulSet ### Volumes - The application uses a persistent volume mounted at `/mnt/data/todo-app` on the host - This volume is mounted into the Redis container at `/data` to persist task data - The volume uses the `manual` storage class with ReadWriteOnce access mode ## Container Configuration ### Web Application Container - Based on nginx:alpine - Configured to serve static content from `/usr/share/nginx/html` - Resource limits: 500m CPU, 256Mi memory - Resource requests: 100m CPU, 128Mi memory ### Redis Container - Based on redis:alpine - Data directory mounted to persistent storage - Resource limits: 300m CPU, 256Mi memory - Resource requests: 100m CPU, 128Mi memory ## How to Use the Application ### Prerequisites - Kubernetes cluster (Minikube or similar) - kubectl configured to communicate with your cluster - Docker for building the application image ### Prepare the Application 1. Clone this repository 2. Run the preparation script: ``` chmod +x prepare-app.sh ./prepare-app.sh ``` ### Start the Application 1. Run the start script: ``` chmod +x start-app.sh ./start-app.sh ``` 2. The script will display the URL to access the application ### Stop the Application 1. Run the stop script: ``` chmod +x stop-app.sh ./stop-app.sh ``` ### Accessing the Web Interface 1. After starting the application, note the NodePort displayed in the terminal 2. Open your web browser and navigate to `http://localhost:` 3. You should see the To-Do List application interface 4. Start adding tasks, marking them as completed, or deleting them as needed ## Troubleshooting - If pods aren't starting, check the pod status: `kubectl get pods -n todo-app-ns` - For detailed pod issues: `kubectl describe pod -n todo-app-ns` - To view logs: `kubectl logs -n todo-app-ns`