This commit is contained in:
2025-09-16 15:43:36 +05:00
commit 111cc834dd
17 changed files with 2078 additions and 0 deletions

104
k8s/README.md Normal file
View File

@ -0,0 +1,104 @@
# Kubernetes манифесты для Demo SPA App
## Структура манифестов
```
k8s/
├── namespace.yaml # Namespace для приложения
├── deployment.yaml # React SPA приложение
├── service.yaml # Внутренний сервис
├── dex-authenticator.yaml # DexAuthenticator для аутентификации
├── ingress.yaml # Внешний доступ с SSL
└── kustomization.yaml # Kustomize конфигурация
```
## Развертывание
### 1. Подготовка образа
```bash
# Сборка образа
docker build -t demo-spa-app:latest .
# Размещение в registry (замените на ваш registry)
docker tag demo-spa-app:latest your-registry.com/demo-spa-app:latest
docker push your-registry.com/demo-spa-app:latest
```
### 2. Настройка конфигурации
Перед развертыванием обновите следующие параметры:
- **Домен**: `demo-spa.example.com` → ваш домен
- **SSL сертификат**: убедитесь что cert-manager настроен
- **Dex**: должен быть развернут в кластере (обычно в namespace `d8-user-authn`)
### 3. Развертывание в Kubernetes
```bash
# Применение всех манифестов
kubectl apply -k k8s/
# Или по отдельности
kubectl apply -f k8s/namespace.yaml
kubectl apply -f k8s/deployment.yaml
kubectl apply -f k8s/service.yaml
kubectl apply -f k8s/dex-authenticator.yaml
kubectl apply -f k8s/ingress.yaml
```
### 4. Проверка развертывания
```bash
# Проверка подов
kubectl get pods -n demo-spa
# Проверка сервисов
kubectl get svc -n demo-spa
# Проверка ingress
kubectl get ingress -n demo-spa
# Логи приложения
kubectl logs -f deployment/demo-spa-app -n demo-spa
# Логи DexAuthenticator
kubectl logs -f deployment/demo-spa-auth -n demo-spa
```
## Конфигурация DexAuthenticator
### Настройка Dex
DexAuthenticator автоматически интегрируется с Dex, развернутым в кластере. Дополнительная настройка OAuth2 клиентов не требуется - Deckhouse управляет этим автоматически.
### Основные параметры DexAuthenticator
- **applicationDomain**: домен вашего приложения
- **sendAuthorizationHeader**: отправка заголовков авторизации в приложение
- **keepUsersLoggedInFor**: время жизни сессии (по умолчанию 24h)
- **allowedGroups**: список разрешенных групп (пустой = все группы)
- **cookieConfig**: настройки безопасности куки
## Архитектура
```
Internet → Ingress → DexAuthenticator → React SPA
Dex (аутентификация)
```
- **Ingress**: Внешний доступ с SSL
- **DexAuthenticator**: Нативная аутентификация через Dex
- **React SPA**: Основное приложение
- **Dex**: OIDC провайдер
## Мониторинг
```bash
# Проверка health check
curl https://demo-spa.example.com/health
# Проверка аутентификации
curl -I https://demo-spa.example.com/
```

53
k8s/deployment.yaml Normal file
View File

@ -0,0 +1,53 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-spa-app
namespace: demo-spa
labels:
app: demo-spa-app
spec:
replicas: 2
selector:
matchLabels:
app: demo-spa-app
template:
metadata:
labels:
app: demo-spa-app
spec:
containers:
- name: demo-spa-app
image: demo-spa-app:latest
imagePullPolicy: Never
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "100m"
livenessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 5
periodSeconds: 5
env:
- name: NODE_ENV
value: "production"

View File

@ -0,0 +1,22 @@
apiVersion: deckhouse.io/v1
kind: DexAuthenticator
metadata:
name: demo-spa-auth
namespace: demo-spa
spec:
# Домен приложения
applicationDomain: "demo-spa.127.0.0.1.sslip.io"
# Отправка заголовков авторизации
sendAuthorizationHeader: true
# SSL сертификат
applicationIngressCertificateSecretName: ingress-tls
applicationIngressClassName: nginx
# Время жизни сессии
keepUsersLoggedInFor: "720h" # 30 дней
# Разрешенные группы (пустой массив = все группы)
allowedGroups: []

27
k8s/ingress.yaml Normal file
View File

@ -0,0 +1,27 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-spa-ingress
namespace: demo-spa
annotations:
nginx.ingress.kubernetes.io/auth-url: "https://demo-spa.127.0.0.1.sslip.io/dex-authenticator/auth"
nginx.ingress.kubernetes.io/auth-signin: "http://demo-spa.127.0.0.1.sslip.io/dex-authenticator/sign_in"
nginx.ingress.kubernetes.io/auth-response-headers: "X-Auth-Request-User,X-Auth-Request-Email,X-Auth-Request-Groups"
spec:
ingressClassName: nginx
tls:
- hosts:
- demo-spa.127.0.0.1.sslip.io
secretName: demo-spa-tls
rules:
- host: demo-spa.127.0.0.1.sslip.io
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: demo-spa-service
port:
number: 80

15
k8s/namespace.yaml Normal file
View File

@ -0,0 +1,15 @@
apiVersion: v1
kind: Namespace
metadata:
name: demo-spa
labels:
name: demo-spa

25
k8s/service.yaml Normal file
View File

@ -0,0 +1,25 @@
apiVersion: v1
kind: Service
metadata:
name: demo-spa-service
namespace: demo-spa
labels:
app: demo-spa-app
spec:
selector:
app: demo-spa-app
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
type: ClusterIP