174 lines
8.1 KiB
Markdown
174 lines
8.1 KiB
Markdown
# Expense Tracker - Kubernetes Deployment
|
||
|
||
## Описание приложения
|
||
|
||
Expense Tracker - это веб-приложение для отслеживания личных финансов и управления расходами. Приложение позволяет пользователям:
|
||
- Добавлять новые транзакции с указанием суммы, типа (доход/расход) и категории
|
||
- Просматривать историю транзакций
|
||
- Анализировать расходы по категориям
|
||
- Отслеживать баланс счета
|
||
|
||
## Архитектура приложения
|
||
|
||
Приложение построено на стеке MERN (MongoDB, Express.js, React, Node.js) и состоит из трех основных компонентов:
|
||
|
||
1. **Frontend** - клиентская часть, разработанная на React с использованием Vite для быстрой сборки
|
||
2. **Backend** - серверная часть, разработанная на Node.js с использованием Express.js
|
||
3. **MongoDB** - база данных для хранения информации о транзакциях
|
||
|
||
## Список использованных контейнеров
|
||
|
||
1. **expense-tracker-frontend** - контейнер с клиентской частью приложения
|
||
- Базовый образ: node:20-bookworm-slim
|
||
- Роль: Обслуживает пользовательский интерфейс приложения
|
||
- Порт: 5173
|
||
|
||
2. **expense-tracker-backend** - контейнер с серверной частью приложения
|
||
- Базовый образ: node:20-bookworm-slim
|
||
- Роль: Предоставляет API для работы с данными о транзакциях
|
||
- Порт: 5000
|
||
|
||
3. **mongo** - контейнер с базой данных MongoDB
|
||
- Базовый образ: mongo:latest
|
||
- Роль: Хранение данных приложения
|
||
- Порт: 27017
|
||
|
||
## Kubernetes объекты и их описание
|
||
|
||
1. **Namespace**
|
||
- Имя: expense-tracker
|
||
- Роль: Изолированное пространство имен для всех ресурсов приложения
|
||
|
||
2. **Deployment**
|
||
- Frontend Deployment: Управляет репликами Pod с клиентской частью приложения
|
||
- Backend Deployment: Управляет репликами Pod с серверной частью приложения
|
||
|
||
3. **StatefulSet**
|
||
- MongoDB StatefulSet: Управляет Pod с базой данных MongoDB, сохраняя состояние и данные
|
||
|
||
4. **Service**
|
||
- Frontend Service (NodePort): Предоставляет доступ к клиентской части приложения извне кластера
|
||
- Backend Service (ClusterIP): Обеспечивает внутрикластерный доступ к API
|
||
- MongoDB Service (ClusterIP): Обеспечивает внутрикластерный доступ к базе данных
|
||
|
||
5. **PersistentVolume и PersistentVolumeClaim**
|
||
- MongoDB PV/PVC: Обеспечивает постоянное хранилище для данных MongoDB
|
||
|
||
## Сетевая инфраструктура
|
||
|
||
Приложение использует следующие сетевые ресурсы:
|
||
|
||
1. **Services**
|
||
- Frontend Service (NodePort): Доступен извне кластера через порт, назначаемый Kubernetes (30000-32767)
|
||
- Backend Service (ClusterIP): Доступен внутри кластера по имени `backend-service:5000`
|
||
- MongoDB Service (ClusterIP): Доступен внутри кластера по имени `mongodb-service:27017`
|
||
|
||
2. **Внутрикластерная DNS-система**
|
||
- Позволяет компонентам приложения обращаться друг к другу по именам сервисов вместо IP-адресов
|
||
|
||
## Хранилища данных
|
||
|
||
Приложение использует постоянное хранилище для базы данных MongoDB:
|
||
|
||
1. **PersistentVolume**
|
||
- Тип: HostPath (для локальной разработки)
|
||
- Размер: 1Gi
|
||
- Путь на хосте: `/mnt/data/mongodb`
|
||
|
||
2. **PersistentVolumeClaim**
|
||
- Запрашивает 1Gi постоянного хранилища для MongoDB
|
||
|
||
## Конфигурация контейнеров
|
||
|
||
1. **Frontend**
|
||
- Environment: Для разработки используется Vite Dev Server с опцией `--host` для доступа извне
|
||
- Ресурсы: Лимиты CPU: 0.5, Memory: 512Mi; Запросы CPU: 0.2, Memory: 256Mi
|
||
|
||
2. **Backend**
|
||
- Environment:
|
||
- PORT: 5000
|
||
- MONGO_URI: mongodb://mongodb-service:27017/expense-tracker
|
||
- Ресурсы: Лимиты CPU: 0.5, Memory: 512Mi; Запросы CPU: 0.2, Memory: 256Mi
|
||
|
||
3. **MongoDB**
|
||
- Без дополнительной конфигурации, используется стандартный образ
|
||
- Данные хранятся в постоянном хранилище
|
||
- Ресурсы: Лимиты CPU: 0.5, Memory: 512Mi; Запросы CPU: 0.2, Memory: 256Mi
|
||
|
||
## Инструкция по запуску
|
||
|
||
### Предварительные требования
|
||
|
||
1. Установленный и настроенный Kubernetes кластер (можно использовать Minikube для локальной разработки)
|
||
2. Установленный и настроенный kubectl
|
||
3. Docker
|
||
|
||
### Подготовка приложения
|
||
|
||
1. Выполните скрипт подготовки:
|
||
```bash
|
||
chmod +x prepare-app.sh
|
||
./prepare-app.sh
|
||
```
|
||
|
||
Скрипт выполнит следующие действия:
|
||
- Создаст директорию для хранения данных MongoDB
|
||
- Соберет Docker-образы для Frontend и Backend
|
||
|
||
### Запуск приложения
|
||
|
||
1. Выполните скрипт запуска:
|
||
```bash
|
||
chmod +x start-app.sh
|
||
./start-app.sh
|
||
```
|
||
|
||
Скрипт выполнит следующие действия:
|
||
- Создаст Namespace expense-tracker
|
||
- Применит все конфигурационные файлы Kubernetes
|
||
- Дождется запуска всех компонентов
|
||
- Выведет URL для доступа к приложению
|
||
|
||
### Остановка приложения
|
||
|
||
1. Для остановки приложения выполните:
|
||
```bash
|
||
chmod +x stop-app.sh
|
||
./stop-app.sh
|
||
```
|
||
|
||
Скрипт выполнит следующие действия:
|
||
- Удалит все развернутые в Kubernetes ресурсы приложения
|
||
|
||
### Доступ к приложению
|
||
|
||
После успешного запуска вы получите URL для доступа к приложению в выводе скрипта start-app.sh. Обычно это будет что-то вроде:
|
||
```
|
||
http://192.168.49.2:30080
|
||
```
|
||
|
||
где:
|
||
- 192.168.49.2 - IP-адрес узла кластера (для Minikube это IP-адрес виртуальной машины)
|
||
- 30080 - назначенный NodePort для Frontend-сервиса
|
||
|
||
## Дополнительная информация
|
||
|
||
- Для просмотра всех ресурсов в пространстве имен expense-tracker:
|
||
```bash
|
||
kubectl get all -n expense-tracker
|
||
```
|
||
|
||
- Для просмотра логов компонентов:
|
||
```bash
|
||
kubectl logs deployment/frontend -n expense-tracker
|
||
kubectl logs deployment/backend -n expense-tracker
|
||
kubectl logs statefulset/mongodb -n expense-tracker
|
||
```
|
||
|
||
- Для доступа к оболочке контейнеров:
|
||
```bash
|
||
kubectl exec -it deployment/frontend -n expense-tracker -- sh
|
||
kubectl exec -it deployment/backend -n expense-tracker -- sh
|
||
kubectl exec -it statefulset/mongodb -n expense-tracker -- sh
|
||
```
|