Documentación del chart de Helm de Seatmap
Resumen
El chart de Helm de Seatmap despliega un stack completo de la aplicación Seatmap.pro que incluye los servicios Editor, Booking y converter, junto con las dependencias requeridas como PostgreSQL y Redis.
- Versión del chart: 1.2.1
- Versión de la aplicación: 1.40.0
Requisitos previos
- Kubernetes 1.19+
- Helm 3.2.0+
- Soporte de aprovisionador de PV en la infraestructura subyacente
- Soporte de LoadBalancer (para ingress)
Dependencias
El chart incluye las siguientes dependencias de Bitnami:
- PostgreSQL (versión 12.x.x)
- Redis (versión 17.x.x)
Instalación
Instalación desde el monorepo
El chart de Helm se encuentra en deployment/helm/seatmap/ en el monorepo. Antes de desplegar,
asegúrate de que las dependencias de bitnami estén resueltas:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm dependency update deployment/helm/seatmap
helm upgrade --install seatmap deployment/helm/seatmap \
--create-namespace \
--namespace seatmap \
--set global.s3.bucket=${S3_BUCKET} \
--set global.s3.region=${S3_REGION} \
--set global.s3.endpoint=${S3_ENDPOINT} \
--set global.mail.host=${MAIL_HOST} \
--set global.mail.fromAddress=${MAIL_FROM} \
--set global.mail.port=${MAIL_PORT} \
--set global.mail.socket.port=${MAIL_SOCKET_PORT} \
--set-string secrets.s3.accessKey=${S3_ACCESS_KEY} \
--set-string secrets.s3.secretKey=${S3_SECRET_KEY} \
--set-string secrets.mail.username=${MAIL_USERNAME} \
--set-string secrets.mail.password=${MAIL_PASSWORD} \
--set-string secrets.google.apiKey=${GOOGLE_API_KEY} \
--set imageCredentials.registry=${REGISTRY} \
--set-string imageCredentials.username=${REGISTRY_USERNAME} \
--set-string imageCredentials.password=${REGISTRY_PASSWORD}
Pruebas locales
Ejecuta la prueba del stack local completo con kind:
./deployment/helm/test-local.sh
Configuración
Parámetros globales
Configuración de hosts
global:
hosts:
editor: editor.test-5.seatmap.dev
booking: booking.test-5.seatmap.dev
Registro de imágenes
imageCredentials:
registry: registry.gitlab.com
username: seatmap
password: <password>
Configuraciones de recursos
global:
resources:
default:
requests:
cpu: '500m'
memory: '2Gi'
limits:
cpu: '1000m'
memory: '3Gi'
frontend:
requests:
cpu: '100m'
memory: '128Mi'
limits:
cpu: '200m'
memory: '256Mi'
Configuración de ingress
El chart proporciona configuraciones de ingress para los servicios Editor y Booking con nombres de host independientes.
Ajustes globales de ingress
global:
ingress:
className: public
proxyBodySize: '50m'
annotations:
cert-manager.io/cluster-issuer: 'letsencrypt-prod'
hosts:
editor: editor.test-5.seatmap.dev
booking: booking.test-5.seatmap.dev
Ingress de Editor
El ingress del servicio Editor está configurado para gestionar tanto el tráfico web como el de la API en su dominio dedicado.
editor:
ingress:
enabled: true
annotations: {} # Additional service-specific annotations
apiPaths:
- /api
- /swagger-ui
- /preview
- /ws
- /webjars
- /v3
Características:
- Host:
editor.{domain}(p. ej., editor.test-5.seatmap.dev) - TLS habilitado con certificado basado en el nombre de host
- La ruta web predeterminada (/) se enruta al puerto web
- Las rutas de API se enrutan al puerto de la API
- Soporte de WebSocket habilitado
- Tamaño máximo del cuerpo configurable
Ingress de Booking
El ingress del servicio Booking está configurado en su propio dominio dedicado.
booking:
ingress:
enabled: true
annotations: {} # Additional service-specific annotations
apiPaths:
- /api
- /swagger-ui
- /webjars
- /v3
- /csrf
- /oauth2
- /login
- /.well-known
- /actuator
Características:
- Host:
booking.{domain}(p. ej., booking.test-5.seatmap.dev) - TLS habilitado con certificado basado en el nombre de host
- La ruta web predeterminada (/) se enruta al puerto web
- Las rutas de API se enrutan al puerto de la API
- Soporte de WebSocket habilitado
- Configuración de tamaño del cuerpo del proxy compartida con Editor
Características comunes de ingress
Ambos ingress incluyen:
- Anotaciones de NGINX para los límites de tamaño del cuerpo
- Soporte de WebSocket
- Configuración de TLS
- Tipos de ruta Implementation-specific para las rutas raíz
- Tipos de ruta Prefix para los endpoints de la API
Configuraciones de componentes
PostgreSQL
- Autenticación gestionada mediante
postgresql-secret - Base de datos y nombre de usuario predeterminados:
seatmap - Incluye la inicialización de la extensión
uuid-ossp
postgresql:
enabled: true
auth:
existingSecret: 'postgresql-secret'
username: seatmap
database: seatmap
Redis
- Arquitectura standalone
- Autenticación habilitada mediante
redis-secret - Configuración de memoria:
- Memoria máxima: 512MB
- Política: allkeys-lru
redis:
enabled: true
architecture: standalone
auth:
enabled: true
existingSecret: 'redis-secret'
master:
persistence:
enabled: true
size: 8Gi
Registro de contenedores
Todas las imágenes de los servicios se alojan en el GitLab Container Registry:
| Service | Image |
|---|---|
| Editor Backend | registry.gitlab.com/seatmap.pro/seatmap/editor-service |
| Editor Frontend | registry.gitlab.com/seatmap.pro/seatmap/editor-client |
| Booking Backend | registry.gitlab.com/seatmap.pro/seatmap/booking-service |
| Booking Frontend | registry.gitlab.com/seatmap.pro/seatmap/booking-client |
| Converter | registry.gitlab.com/seatmap.pro/seatmap/converter-service |
| Knowledge Base | registry.gitlab.com/seatmap.pro/seatmap/knowledge-base |
Las etiquetas de imagen siguen el versionado semántico (p. ej., 1.60.0 para releases, 1.61.0-dev.55-a9130b33 para builds de dev/stage).
Componentes de servicio
Servicio Editor
editor:
image:
repository: registry.gitlab.com/seatmap.pro/seatmap/editor-service
tag: '1.60.0'
frontend:
image:
repository: registry.gitlab.com/seatmap.pro/seatmap/editor-client
tag: '1.60.0'
Configuraciones clave:
- Ajustes del pool de conexiones HikariCP
- Ajustes de expiración de tokens
- Soporte de integración SSO
- Rutas de API para ingress
Servicio Booking
booking:
image:
repository: registry.gitlab.com/seatmap.pro/seatmap/booking-service
tag: '1.60.0'
frontend:
image:
repository: registry.gitlab.com/seatmap.pro/seatmap/booking-client
tag: '1.60.0'
Características:
- Configuración de JPA/Hibernate
- Ajustes del pool de conexiones
- Soporte de OAuth2
- Endpoints de Actuator
Servicio Converter
converter:
image:
repository: registry.gitlab.com/seatmap.pro/seatmap/converter-service
tag: '1.60.0'
Limitaciones:
- Longitud máxima del contenido: 32MB
- Dimensiones máximas de imagen: 15000x15000 píxeles
- Integración con almacenamiento S3
Configuración de servicios externos
Almacenamiento S3
global:
s3:
bucket: 'seatmap-storage'
region: 'us-east-1'
endpoint: 'https://s3.amazonaws.com'
Servidor de correo
global:
mail:
host: 'smtp.gmail.com'
port: 587
socket:
port: 465
fromAddress: 'seatmap@seatmap.pro'
Consideraciones de seguridad
Claves de firma JWT
El servicio de editor firma sus tokens con un par de claves RSA guardado en el Secret {release}-rsa. Un hook de preinstalación y preactualización lo crea y nunca sobrescribe uno existente, de modo que el par de claves sobrevive a cada actualización y los tokens emitidos siguen verificándose.
El hook copia el material de claves existente al Secret de forma literal durante la actualización: no se invalida ningún token ni se cierra la sesión de ningún usuario. Si los datos de clave existentes están vacíos, el hook se niega a migrar y hace fallar la actualización, en lugar de generar en silencio un par de claves nuevo e invalidar todas las sesiones activas.
Solo se genera un par de claves nuevo en una instalación desde cero, donde no hay nada que trasladar.
Una vez que la actualización termine correctamente, puedes eliminar el ConfigMap antiguo. Ya no lo lee nada.
kubectl delete configmap {release}-rsa -n {namespace}
Gestión de secretos
Se deben proporcionar los siguientes secretos:
- Credenciales de PostgreSQL
- Contraseña de Redis
- Credenciales de acceso a S3
- Credenciales del servidor de correo
- Clave de la API de Google
Seguridad de red
- Terminación TLS a través de ingress
- Integración con cert-manager para la gestión automatizada de certificados
- Puertos de API y web separados para los servicios
Escalado
Autoescalado horizontal de pods
El HPA es configurable para todos los servicios con ajustes predeterminados:
global:
hpa:
enabled: false
targetCPUUtilizationPercentage: 80
targetMemoryUtilizationPercentage: 80
Configuraciones de HPA específicas por servicio:
- Editor: 2-6 réplicas
- Booking: 2-6 réplicas
- Converter: 1-4 réplicas
Monitorización y métricas
- Endpoints de Actuator habilitados para los servicios Spring Boot
- Métricas de Redis deshabilitadas por defecto
- Endpoints de métricas personalizados configurados para los servicios editor y booking
Resolución de problemas
Problemas comunes
-
Errores al extraer la imagen
- Verifica las credenciales del registro
- Comprueba que las etiquetas de imagen existan
-
Problemas de conexión con la base de datos
- Verifica que el secreto de PostgreSQL exista
- Comprueba los ajustes del pool de conexiones
-
Problemas de almacenamiento
- Valida las credenciales de S3 y la accesibilidad del bucket
- Comprueba las cuotas y límites de almacenamiento
Depuración
-
Accede a los logs mediante:
kubectl logs -f deployment/seatmap-<component> -
Comprueba el estado de los servicios:
kubectl get pods -l app.kubernetes.io/instance=seatmap
Referencia de variables de configuración
Variables globales
| Parameter | Description | Default Value |
|---|---|---|
global.hostname |
Nombre de host principal de la aplicación | seat-113.seatmap.dev |
global.ports.editor.api |
Puerto de la API de Editor | 8080 |
global.ports.editor.web |
Puerto web de Editor | 80 |
global.ports.booking.api |
Puerto de la API de Booking | 9090 |
global.ports.booking.web |
Puerto web de Booking | 80 |
global.ports.converter.api |
Puerto de la API de Converter | 8080 |
global.resources.default.requests.cpu |
Solicitud de CPU predeterminada | 500m |
global.resources.default.requests.memory |
Solicitud de memoria predeterminada | 2Gi |
global.resources.default.limits.cpu |
Límite de CPU predeterminado | 1000m |
global.resources.default.limits.memory |
Límite de memoria predeterminado | 3Gi |
global.resources.frontend.requests.cpu |
Solicitud de CPU del frontend | 100m |
global.resources.frontend.requests.memory |
Solicitud de memoria del frontend | 128Mi |
global.resources.frontend.limits.cpu |
Límite de CPU del frontend | 200m |
global.resources.frontend.limits.memory |
Límite de memoria del frontend | 256Mi |
Variables de PostgreSQL
| Parameter | Description | Default Value |
|---|---|---|
postgresql.enabled |
Habilitar el despliegue de PostgreSQL | true |
postgresql.auth.existingSecret |
Nombre del secreto para la autenticación | postgresql-secret |
postgresql.auth.username |
Nombre de usuario de PostgreSQL | seatmap |
postgresql.auth.database |
Nombre de la base de datos de PostgreSQL | seatmap |
postgresql.service.port |
Puerto del servicio de PostgreSQL | 5432 |
Variables de Redis
| Parameter | Description | Default Value |
|---|---|---|
redis.enabled |
Habilitar el despliegue de Redis | true |
redis.architecture |
Tipo de arquitectura de Redis | standalone |
redis.auth.enabled |
Habilitar la autenticación de Redis | true |
redis.auth.existingSecret |
Nombre del secreto para la autenticación | redis-secret |
redis.master.persistence.enabled |
Habilitar la persistencia | true |
redis.master.persistence.size |
Tamaño de la persistencia | 8Gi |
redis.port |
Puerto del servicio de Redis | 6379 |
Variables del servicio Editor
| Parameter | Description | Default Value |
|---|---|---|
editor.image.repository |
Repositorio de imagen del servicio Editor | registry.gitlab.com/seatmap.pro/seatmap/editor-service |
editor.image.tag |
Etiqueta de imagen del servicio Editor | 1.40.0 |
editor.frontend.image.repository |
Repositorio de imagen del frontend de Editor | registry.gitlab.com/seatmap.pro/seatmap/editor-client |
editor.frontend.image.tag |
Etiqueta de imagen del frontend de Editor | 1.40.0 |
editor.config.initial.delay |
Retardo inicial | 5000 |
editor.config.spring.datasource.hikari.connectionTimeout |
Tiempo de espera de conexión a la base de datos | 60000 |
editor.config.spring.datasource.hikari.maximumPoolSize |
Tamaño del pool de conexiones a la base de datos | 20 |
editor.config.spring.flyway.outOfOrder |
Permitir migraciones Flyway fuera de orden | false |
editor.hpa.minReplicas |
Réplicas mínimas para el HPA | 2 |
editor.hpa.maxReplicas |
Réplicas máximas para el HPA | 6 |
Variables del servicio Booking
| Parameter | Description | Default Value |
|---|---|---|
booking.image.repository |
Repositorio de imagen del servicio Booking | registry.gitlab.com/seatmap.pro/seatmap/booking-service |
booking.image.tag |
Etiqueta de imagen del servicio Booking | 1.40.0 |
booking.frontend.image.repository |
Repositorio de imagen del frontend de Booking | registry.gitlab.com/seatmap.pro/seatmap/booking-client |
booking.frontend.image.tag |
Etiqueta de imagen del frontend de Booking | 1.40.0 |
booking.config.spring.profiles.include |
Perfiles activos de Spring | prod |
booking.config.spring.jpa.generateDdl |
Habilitar la generación de DDL | true |
booking.config.spring.jpa.hibernate.ddlAuto |
Hibernate DDL auto | update |
booking.config.seatmap.watermark.disabled |
Desactivar la marca del widget de reservas | false |
booking.hpa.minReplicas |
Réplicas mínimas para el HPA | 2 |
booking.hpa.maxReplicas |
Réplicas máximas para el HPA | 6 |
Variables del servicio Converter
| Parameter | Description | Default Value |
|---|---|---|
converter.image.repository |
Repositorio de imagen del servicio Converter | registry.gitlab.com/seatmap.pro/seatmap/converter-service |
converter.image.tag |
Etiqueta de imagen del servicio Converter | latest |
converter.config.max.contentLength |
Longitud máxima del contenido | 33554432 |
converter.config.max.image.width |
Ancho máximo de la imagen | 15000 |
converter.config.max.image.height |
Alto máximo de la imagen | 15000 |
converter.hpa.minReplicas |
Réplicas mínimas para el HPA | 1 |
converter.hpa.maxReplicas |
Réplicas máximas para el HPA | 4 |
converter.gpu.enabled |
Desplegar un conversor por GPU adicional junto al de software | false |
converter.gpu.renderGroupId |
Identificador del grupo render del host para el pod del conversor por GPU | 109 |
Variables de servicios externos
| Parameter | Description | Default Value |
|---|---|---|
secrets.s3.accessKey |
Clave de acceso de S3 | secrets.s3.accessKey |
secrets.s3.secretKey |
Clave secreta de S3 | secrets.s3.secretKey |
secrets.mail.username |
Nombre de usuario del servidor de correo | secrets.mail.username |
secrets.mail.password |
Contraseña del servidor de correo | secrets.mail.password |
secrets.google.apiKey |
Clave de la API de Google | secrets.google.apiKey |
secrets.google.serverApiKey |
Clave de la API de Google del lado del servidor para la búsqueda de direcciones. Si está vacía, se usa secrets.google.apiKey |
"" |
global.s3.bucket |
Nombre del bucket de S3 | seatmap-storage |
global.s3.region |
Región de S3 | us-east-1 |
global.s3.endpoint |
Endpoint de S3 | https://s3.amazonaws.com |
global.mail.host |
Host del servidor de correo | smtp.gmail.com |
global.mail.port |
Puerto del servidor de correo | 587 |
global.mail.socket.port |
Puerto del socket de correo | 465 |
global.mail.fromAddress |
Dirección de remitente del correo | seatmap@seatmap.pro |
Soporte y mantenimiento
- Actualizaciones periódicas mediante etiquetas de versión
- Cambios de configuración mediante Helm upgrade
- Gestión del almacenamiento persistente para PostgreSQL y Redis