zkt25/assignment2/README.md

4.2 KiB

Weather Web App - Kubernetes Deployment

This project deploys a full-stack weather web application to Kubernetes. It includes:

  • A frontend website to search weather by city
  • A backend PostgreSQL database for logging searches
  • A Node.js API to connect the frontend to the database

Application Description

  • Frontend (weather.html): A responsive, modern web UI that shows current weather data using the OpenWeatherMap API.
  • Backend (PostgreSQL): Stores weather search history via a weather_log table.
  • API Server (Node.js): Receives weather data from the frontend and logs it to the PostgreSQL database.

Containers Used

Container Image Description
weather-frontend Custom Nginx-based Serves the weather.html UI
postgres postgres:15 Provides relational database backend
weather-api Custom Node.js API that logs weather data to PostgreSQL

☸️ Kubernetes Objects

Object Type File Description
Namespace (inside script) Isolates resources under webapp-ns
Deployment deployment.yaml Manages frontend app
Deployment deployment-api.yaml Manages the Node.js API
StatefulSet statefulset.yaml Manages PostgreSQL instance with persistent volume
PersistentVolume statefulset.yaml Host-mounted volume for PostgreSQL data
PersistentVolumeClaim statefulset.yaml Requests storage for StatefulSet
Service service.yaml Exposes frontend via NodePort
Service deployment-api.yaml Exposes API via NodePort
ConfigMap Created by script Stores init-db.sql used to create the weather_log table

Networking & Volumes

Virtual Networks:

  • Kubernetes handles inter-service communication via internal DNS and ClusterIP services.
  • Frontend and backend are externally reachable using NodePort services.

Volumes:

  • PersistentVolume and PersistentVolumeClaim ensure PostgreSQL data is retained.
  • ConfigMap mounts the SQL init script for PostgreSQL setup.

⚙️ Container Configurations

Frontend

  • Dockerfile uses nginx:alpine
  • Serves weather.html (renamed as index.html inside container)
  • Exposed on port 80

Node.js API

  • Built with Node.js 18
  • Listens on port 3000
  • Connects to PostgreSQL using service DNS
  • Accepts POST requests at /log with weather data

PostgreSQL

  • postgres:15 with weatheruser, weatherpass, and weatherdb
  • Init script creates a weather_log table with a sample row

How to Use the Application

1. Build Docker Images

./prepare-app.sh

2. Start the App (create namespace and apply all configs)

./start-app.sh

3. View the App

minikube service weather-service -n webapp-ns

Or get the NodePort manually:

kubectl get svc -n webapp-ns
minikube ip

Then open:

http://<minikube-ip>:<frontend-nodeport>

4. Use the App

  • Enter a city
  • Weather will be shown
  • Data is logged in PostgreSQL automatically

5. Stop and Clean Up

./stop-app.sh

API Key Setup

  • Register at OpenWeatherMap
  • Get your free API key
  • Replace the placeholder in weather.html:
const apiKey = "YOUR_API_KEY";

Conclusion

  • Frontend calls OpenWeatherMap and logs data to your backend
  • PostgreSQL is prepped with a table to store queries
  • You can expand the API to serve saved data or stats