Пример деплоя стека: Flask‑backend с Postgres и лёгкий frontend на Express, который проксирует запросы к backend. Все манифесты лежат в k8s/ и используют imagePullPolicy: IfNotPresent, поэтому можно работать с локально собранными образами.
- Backend (
app/): Flask API, эндпоинты/healthzи/contacts, подключается к Postgres. - Frontend (
frontend/): Express‑сервис, слушает внешний порт и отправляет запросы на backend (GET /->/contacts,GET /healthz->/healthz). - Postgres (
postgres:16-alpine): инициализируется скриптомinit-db.sqlизk8s/db.yaml, таблицаcontactsс тестовыми данными. - K8s: Deployment/Service для каждой части. Frontend Service —
LoadBalancer, backend —ClusterIP, база —ClusterIP.
# Собрать локальные образы
docker build -t cloud-hw-backend:latest ./app
docker build -t cloud-hw-frontend:latest ./frontend
# Если используете minikube/kind, загрузите локальные образы в кластер
minikube image load cloud-hw-backend:latest
minikube image load cloud-hw-frontend:latest# Применить все манифесты
kubectl apply -f k8s/db.yaml \
-f k8s/backend-deployment.yaml -f k8s/backend-service.yaml \
-f k8s/frontend-deployment.yaml -f k8s/frontend-service.yaml
# Проверить, что поды поднялись
kubectl get pods
kubectl get svc- Backend развернут в 2 репликах, доступен по сервису
backend:8000только внутри кластера. - Frontend доступен снаружи через сервис
frontend(LoadBalancerна порту 80). В кластерах без внешнего LB используйтеkubectl port-forward service/frontend 8080:80илиminikube service frontend --url.
# Порт‑форвард, если нет внешнего IP
kubectl port-forward service/frontend 8080:80
# Проверить маршруты frontend (проверяет backend и БД)
curl http://localhost:8080/
curl http://localhost:8080/healthz
# Проверить backend напрямую (изнутри кластера или через port-forward)
kubectl port-forward service/backend 18000:8000
curl http://localhost:18000/contactsk8s/db.yaml— PVC + ConfigMap сinit-db.sql+ Deployment Postgres + Servicedb.k8s/backend-deployment.yaml— Deployment backend (2 реплики, liveness/readiness/healthz).k8s/backend-service.yaml— ClusterIP сервисbackend:8000.k8s/frontend-deployment.yaml— Deployment frontend (переменнаяBACKEND_URL=http://backend:8000).k8s/frontend-service.yaml— LoadBalancer сервис для внешнего доступа (порт 80 -> 8080).
kubectl delete -f k8s/frontend-service.yaml -f k8s/frontend-deployment.yaml \
-f k8s/backend-service.yaml -f k8s/backend-deployment.yaml \
-f k8s/db.yaml- Настройки базы:
POSTGRES_USER=cloud,POSTGRES_PASSWORD=cloudpass,POSTGRES_DB=contacts. Backend берет их из переменных окружения (DB_*).