Kubernetes Deployment Guide
SecuSiem — Kubernetes Deployment Guide
Kubernetes Deployment Guide
Kubernetes Deployment Guide
Prerequisites
- Kubernetes cluster configured (k8s-dev or k8s-prod) via OVH Managed K8s (BHS5)
secuopsCLI installed and configuredhelmCLI v3+- DNS access for configuring ingress domains
Namespaces
SecuSiem uses 3 Kubernetes namespaces:
secusiem-system # Main services + PostgreSQL + Redis
secusiem-loki # Grafana Loki cluster
secusiem-monitoring # Grafana OSSCreation:
secuops kubectl -- apply -f infrastructure/k8s-manifests/00-namespaces.yamlStep 1: Configure Secrets
Edit infrastructure/k8s-manifests/02-secrets-dev.yaml and replace CHANGE_ME values:
- OVH S3:
access_key_id,secret_access_key(OVH console) - Stripe:
secret_key,webhook_secret(Stripe dashboard) - Anthropic:
api_key(Anthropic console) - Authentik:
token,url(Authentik admin) - Grafana:
admin_password - PostgreSQL: Change default passwords
secuops kubectl -- apply -f infrastructure/k8s-manifests/02-secrets-dev.yamlStep 2: Deploy Infrastructure
PostgreSQL 16
secuops kubectl -- apply -f infrastructure/k8s-manifests/03-postgresql.yamlStatefulSet with 100Gi csi-cinder-high-speed storage.
Redis 7.2
secuops kubectl -- apply -f infrastructure/k8s-manifests/04-redis.yamlDeployment with 1Gi max memory, LRU eviction policy.
Grafana Loki 3.0+
secuops helm-install loki grafana/loki -n secusiem-loki \
--create-namespace \
-f infrastructure/helm-values/loki-values-dev.yamlLoki dev configuration:
- Mode: SingleBinary (1 replica)
- Multi-tenancy:
auth_enabled: true - Storage: Filesystem (no S3 needed for dev)
- Schema: TSDB v13 with 24h index periods
- Resources: 200m-1000m CPU, 512Mi-1Gi memory
- Persistence: 10Gi on
csi-cinder-high-speed
Grafana OSS
secuops helm-install grafana grafana/grafana -n secusiem-monitoring \
--create-namespace \
-f infrastructure/helm-values/grafana-values-dev.yamlGrafana dev configuration:
- Pre-configured Loki datasource pointing to
loki-gateway.secusiem-loki.svc.cluster.local - 5Gi persistent storage
- 100m-500m CPU, 256Mi-512Mi memory
- Security context: non-root (uid 472)
Step 3: Deploy Microservices
secuops kubectl -- apply -f infrastructure/k8s-manifests/05-secusiem-microservices.yamlThis deploys the 5 services:
- tenant-manager (port 8000)
- ingestion-api (port 8000)
- claude-analyzer (port 8000)
- billing-service (port 8000)
- report-generator (port 8000)
Step 4: Verification
# Check all pods
secuops kubectl -- get pods -n secusiem-system
secuops kubectl -- get pods -n secusiem-loki
secuops kubectl -- get pods -n secusiem-monitoring
# Health checks
curl http://tenant-manager.secusiem-system:8000/health
curl http://ingestion-api.secusiem-system:8000/health
curl http://claude-analyzer.secusiem-system:8000/healthDocker Images
Images are hosted on the OVH Harbor registry:
qq9o8vqe.c1.bhs5.container-registry.ovh.net/secuops/
tenant-manager:latest
ingestion-api:latest
claude-analyzer:latest
billing-service:latest
report-generator:latestResources per Service
| Service | CPU (req/lim) | Memory (req/lim) |
|---|---|---|
| tenant-manager | 100m/500m | 256Mi/512Mi |
| ingestion-api | 100m/500m | 256Mi/512Mi |
| claude-analyzer | 200m/1000m | 512Mi/1Gi |
| billing-service | 50m/200m | 128Mi/256Mi |
| report-generator | 100m/500m | 256Mi/512Mi |
| PostgreSQL 16 | 500m/2000m | 1Gi/2Gi |
| Redis 7.2 | 100m/500m | 256Mi/1Gi |
Expected Pod Count
| Namespace | Pods | Status |
|---|---|---|
| secusiem-system | 7 | 5 services + PostgreSQL + Redis |
| secusiem-loki | 2 | Loki single binary + Gateway |
| secusiem-monitoring | 1 | Grafana OSS |
| Total | 10 |
Manifest Files
| File | Contents |
|---|---|
00-namespaces.yaml | 3 namespace definitions |
02-secrets-dev.yaml | All secret configurations for dev |
02-secrets.yaml | Secret template for production |
03-postgresql.yaml | PostgreSQL StatefulSet + Service |
04-redis.yaml | Redis Deployment + Service |
05-secusiem-microservices.yaml | 5 microservice Deployments + Services |
06-secusiem-website.yaml | Marketing website deployment |