Проект представляет собой микросервисное веб-приложение для управления пользователями, развернутое в Kubernetes. Основная цель проекта - демонстрация навыков работы с Kubernetes, включая Deployments, Services, ConfigMaps, Secrets, StatefulSet, CronJobs и Helm Charts.
Приложение состоит из следующих компонентов:
-
auth-service (порт 8001)
- Регистрация пользователей
- Авторизация (логин)
- Валидация JWT токенов
- Health endpoints:
/health/live,/health/ready
-
profile-service (порт 8002)
- Получение профиля пользователя
- Обновление профиля
- Health endpoints:
/health/live,/health/ready
-
notification-service (порт 8003)
- Получение уведомлений
- Отправка уведомлений
- Health endpoints:
/health/live,/health/ready
-
report-service (порт 8004)
- Генерация отчетов
- Список отчетов
- Health endpoints:
/health/live,/health/ready
- frontend (порт 80)
- Главная страница
- Страница авторизации
- Страница регистрации
- Личный кабинет пользователя
- Доступ через NodePort на порту 30080
- PostgreSQL (порт 5432)
- Хранение данных пользователей
- Таблица
usersс полями: id, username, password_hash, email, status, created_at
UserPlatform/
├── auth-service/
│ ├── app.py
│ ├── requirements.txt
│ └── Dockerfile
├── profile-service/
│ ├── app.py
│ ├── requirements.txt
│ └── Dockerfile
├── notification-service/
│ ├── app.py
│ ├── requirements.txt
│ └── Dockerfile
├── report-service/
│ ├── app.py
│ ├── requirements.txt
│ └── Dockerfile
├── frontend/
│ ├── index.html
│ ├── nginx.conf
│ └── Dockerfile
├── database/
│ └── init.sql
└── helm/
└── user-platform/
├── Chart.yaml
├── values.yaml
└── templates/
├── namespace.yaml
├── configmap.yaml
├── secret.yaml
├── postgres.yaml
├── auth-service.yaml
├── profile-service.yaml
├── notification-service.yaml
├── report-service.yaml
├── frontend.yaml
└── cronjobs.yaml
- Minikube
- kubectl
- Docker
- Helm
-
Запуск Minikube:
minikube start
-
Сборка Docker образов:
eval $(minikube docker-env) docker build -t auth-service:latest ./auth-service docker build -t profile-service:latest ./profile-service docker build -t notification-service:latest ./notification-service docker build -t report-service:latest ./report-service docker build -t frontend:latest ./frontend
-
Установка через Helm:
helm install user-platform ./helm/user-platform -n user-platform --create-namespace
-
Проверка статуса:
kubectl get all -n user-platform
-
Доступ к приложению:
minikube service frontend-service -n user-platform
Или напрямую через NodePort:
minikube ip # Откройте браузер: http://<minikube-ip>:30080
Обновление конфигурации:
helm upgrade user-platform ./helm/user-platform -n user-platformПросмотр значений:
helm show values ./helm/user-platformУдаление:
helm uninstall user-platform -n user-platformСодержит конфигурацию интерфейса:
LOGIN_TITLE: "Вход в систему"REGISTER_TITLE: "Регистрация"WELCOME_MESSAGE: "Добро пожаловать в платформу"
Хранит конфиденциальные данные:
db-password: пароль базы данныхjwt-secret: секретный ключ для JWT токенов
Все сервисы имеют настроенные Liveness и Readiness probes:
- LivenessProbe: HTTP GET на
/health/live - ReadinessProbe: HTTP GET на
/health/ready - Параметры:
initialDelaySeconds: 30,periodSeconds: 10
Все сервисы развернуты с минимум 2 репликами для обеспечения высокой доступности:
- auth-service: 2 реплики
- profile-service: 2 реплики
- notification-service: 2 реплики
- report-service: 2 реплики
- frontend: 2 реплики
- postgres: 1 реплика
Приложение включает 3 автоматизированные фоновые задачи:
-
daily-stats-collector
- Расписание:
0 2 * * *(каждый день в 2:00) - Задача: сбор статистики по пользователям за последние 24 часа
- Расписание:
-
notification-sender
- Расписание:
0 9 * * *(каждый день в 9:00) - Политика конкурентности:
Forbid - Задача: отправка уведомлений пользователям
- Расписание:
-
data-cleanup
- Расписание:
0 0 * * 0(каждое воскресенье в 00:00) - Задача: очистка устаревших данных
- Расписание:
По умолчанию создается тестовый пользователь:
- Логин:
admin - Пароль:
admin123
POST /api/register- Регистрация нового пользователяPOST /api/login- Вход в системуPOST /api/validate- Валидация JWT токена
GET /api/profile- Получение профиля (требует Authorization header)PUT /api/profile- Обновление профиля (требует Authorization header)
GET /api/notifications- Получение уведомлений (требует Authorization header)POST /api/notifications/send- Отправка уведомления
POST /api/reports/generate- Генерация отчета (требует Authorization header)GET /api/reports/list- Список отчетов (требует Authorization header)
Для проверки каждого сервиса можно использовать port-forward:
kubectl port-forward service/auth-service 8001:8001 -n user-platform
kubectl port-forward service/profile-service 8002:8002 -n user-platform
kubectl port-forward service/notification-service 8003:8003 -n user-platform
kubectl port-forward service/report-service 8004:8004 -n user-platformПосле запуска port-forward сервис будет доступен на http://localhost:<порт>
- Получите JWT токен (войдите через фронтенд и скопируйте токен из localStorage браузера, или используйте curl):
TOKEN=$(curl -s -X POST http://127.0.0.1:\<port\>/api/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"admin123"}' | jq -r '.token')
echo "Token: $TOKEN"- Проверка Profile Service:
curl -X GET http://127.0.0.1:\<port\>/api/profile \
-H "Authorization: Bearer $TOKEN" | jq
curl -X PUT http://127.0.0.1:\<port\>/api/profile \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"email":"newemail@example.com"}' | jq- Проверка Notification Service:
curl -X GET http://127.0.0.1:\<port\>/api/notifications \
-H "Authorization: Bearer $TOKEN" | jq
curl -X POST http://127.0.0.1:\<port\>/api/notifications/send \
-H "Content-Type: application/json" \
-d '{"user_id":1,"message":"Test notification"}' | jq- Проверка Report Service:
curl -X POST http://127.0.0.1:\<port\>/api/reports/generate \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"type":"user_stats"}' | jq
curl -X GET http://127.0.0.1:\<port\>/api/reports/list \
-H "Authorization: Bearer $TOKEN" | jqВсе сервисы имеют health endpoints, которые можно проверить без авторизации:
kubectl exec -it deployment/auth-service -n user-platform -- curl http://localhost:8001/health/live# Логи конкретного сервиса
kubectl logs -f deployment/auth-service -n user-platform
kubectl logs -f deployment/profile-service -n user-platform
kubectl logs -f deployment/notification-service -n user-platform
kubectl logs -f deployment/report-service -n user-platform
kubectl logs -f deployment/frontend -n user-platform
kubectl logs -f deployment/postgres -n user-platform# Список CronJobs
kubectl get cronjobs -n user-platform
# Просмотр Jobs, созданных CronJob
kubectl get jobs -n user-platform
# Логи конкретного Job
kubectl logs job/<job-name> -n user-platformkubectl get pods -n user-platform
kubectl describe pod <pod-name> -n user-platformkubectl get services -n user-platform
kubectl describe service <service-name> -n user-platformkubectl get configmap -n user-platform
kubectl get secret -n user-platform
kubectl describe configmap ui-config -n user-platformkubectl scale deployment auth-service --replicas=3 -n user-platformИли через Helm:
helm upgrade user-platform ./helm/user-platform -n user-platform --set replicas.authService=3kubectl delete namespace user-platformhelm uninstall user-platform -n user-platform
kubectl delete namespace user-platform- Микросервисная архитектура: Приложение разделено на 4 независимых сервиса
- Высокая доступность: Все сервисы развернуты с минимум 2 репликами
- Health checks: Все сервисы имеют настроенные Liveness и Readiness probes
- Безопасность: Конфиденциальные данные хранятся в Secrets
- Конфигурация: UI конфигурация вынесена в ConfigMap
- Автоматизация: Использование CronJobs для фоновых задач
- Управление: Helm Chart для удобного управления развертыванием
- Backend: Python 3.11, Flask
- Frontend: HTML, CSS, JavaScript, Nginx
- Database: PostgreSQL 15
- Containerization: Docker
- Orchestration: Kubernetes
- Package Management: Helm
- Все сервисы являются демонстрационными и могут содержать упрощенную логику