Skip to main content

Kubernetes Manifests

The manifests/ directory contains Kubernetes manifest files — Helm values configs, IngressRoute definitions, ConfigMaps, and deployment specs — for all services in the infrastructure.

How Manifests Are Used

Manifests are referenced by Ansible playbooks during deployment. The UIS CLI dispatches to playbooks, which apply the appropriate manifests:

./uis deploy postgresql
→ ansible-playbook 040-database-postgresql.yml
→ helm upgrade --install ... -f manifests/042-database-postgresql-config.yaml

Some manifests are Jinja2 templates (.yaml.j2) that Ansible renders with variables before applying.

For deployment commands, see UIS Deployment System. For manifest naming rules, see Naming Conventions.

Manifest Organization

Files are numbered by category. The number in the manifest filename matches the corresponding Ansible playbook number.

000-012: Core Infrastructure (Storage, Traefik)

FilePurpose
000-storage-class-alias.yamlStorage class configuration
001-storage-class-test-pvc.yamlPVC test for storage verification
002-storage-class-test-pod.yamlPod test for storage verification
003-traefik-config.yamlTraefik ingress controller configuration
012-traefik-nginx-ingress.yamlTraefik IngressRoute for Nginx

020: Nginx

FilePurpose
020-nginx-config.yamlNginx Helm values
020-nginx-root-ingress.yamlRoot domain IngressRoute
020-nginx-storage.yamlNginx persistent storage

030-039: Observability

FilePurpose
030-prometheus-config.yamlPrometheus Helm values
031-tempo-config.yamlTempo distributed tracing Helm values
032-loki-config.yamlLoki log aggregation Helm values
033-otel-collector-config.yamlOpenTelemetry Collector Helm values
034-grafana-config.yamlGrafana Helm values
035-grafana-test-dashboards.yamlInstallation test dashboards ConfigMap
036-grafana-sovdev-metrics.yamlsovdev-logger metrics dashboard
038-grafana-ingressroute.yamlGrafana IngressRoute
039-otel-collector-ingress.yamlOTEL Collector IngressRoute
FilePurpose
040-mongodb-config.yamlMongoDB Helm values
042-database-postgresql-config.yamlPostgreSQL Helm values
043-database-mysql-config.yamlMySQL Helm values
044-qdrant-config.yamlQdrant vector database Helm values
050-redis-config.yamlRedis Helm values
060-elasticsearch-config.yamlElasticsearch Helm values

070-079: Identity (Whoami + Authentik)

FilePurpose
070-whoami-service-and-deployment.yamlWhoami test service deployment
071-whoami-public-ingressroute.yamlWhoami public IngressRoute
073-authentik-1-test-users-groups-blueprint.yamlAuthentik test users/groups blueprint
073-authentik-2-openwebui-blueprint.yamlAuthentik OpenWebUI integration blueprint
073-authentik-3-app-slot1-blueprint.yamlAuthentik generic app slot blueprint
073-authentik-service-protection-blueprint.yaml.j2Service protection blueprint (Jinja2 template)
075-authentik-config.yaml.j2Authentik Helm values (Jinja2 template)
075-authentik-config-manual.yamlAuthentik manual config reference
076-authentik-csp-middleware.yamlCSP middleware for external HTTPS domains
076-authentik-ingressroute.yaml.j2Authentik IngressRoute (Jinja2 template)
077-authentik-forward-auth-middleware.yamlForward auth middleware for protected services
078-service-protection-ingressroute.yaml.j2Protected service IngressRoute template
079-basic-auth-middleware.yaml.j2Basic auth middleware template

080-099: Integration

FilePurpose
080-rabbitmq-config.yamlRabbitMQ Helm values
081-rabbitmq-ingressroute.yamlRabbitMQ management UI IngressRoute
090-gravitee-config.yamlGravitee API management Helm values
091-gravitee-ingress.yamlGravitee IngressRoute

200-229: AI & ML

FilePurpose
200-ai-persistent-storage.yamlShared AI persistent storage PVC
201-tika-config.yamlApache Tika document extraction config
208-openwebui-config.yamlOpen WebUI Helm values
210-openwebui-ingress.yamlOpen WebUI IngressRoute
220-litellm-config.yamlLiteLLM proxy Helm values
221-litellm-ingress.yamlLiteLLM IngressRoute

220-221: Management (ArgoCD)

FilePurpose
220-argocd-config.yamlArgoCD Helm values
221-argocd-ingressroute.yamlArgoCD IngressRoute

300-399: Analytics

FilePurpose
300-spark-config.yamlApache Spark Helm values
310-jupyterhub-config.yamlJupyterHub Helm values
311-jupyterhub-ingress.yamlJupyterHub IngressRoute
320-unity-catalog-deployment.yamlUnity Catalog deployment spec
321-unity-catalog-ingress.yamlUnity Catalog IngressRoute

600-699: Management Tools

FilePurpose
641-adm-pgadmin.yamlpgAdmin Helm values
651-adm-redisinsight.yamlRedisInsight deployment

700-799: Management Ingress

FilePurpose
741-pgadmin-ingressroute.yamlpgAdmin IngressRoute
751-redisinsight-ingressroute.yamlRedisInsight IngressRoute

800-899: Networking

FilePurpose
800-tailscale-operator-config.yaml.j2Tailscale operator Helm values (Jinja2 template)
803-tailscale-cluster-ingress.yaml.j2Tailscale cluster ingress (Jinja2 template)
805-tailscale-internal-ingress.yaml.j2Tailscale internal access ingress (Jinja2 template)
820-cloudflare-tunnel-base.yamlCloudflare tunnel deployment

Manifest Patterns

Configuration Files (*-config.yaml)

Helm values files that configure service deployments. These are passed to helm upgrade --install via the -f flag.

# Example: deploy PostgreSQL using its config manifest
helm upgrade --install postgresql bitnami/postgresql \
-f manifests/042-database-postgresql-config.yaml \
--namespace default

IngressRoute Files (*-ingressroute.yaml)

Traefik IngressRoute CRDs for routing external traffic to services. Applied directly with kubectl apply. See Traefik Ingress Rules for patterns.

Jinja2 Templates (*.yaml.j2)

Templates that Ansible renders with variables before applying. Used when manifests need dynamic values (secrets, domain names, cluster-specific config). These are never applied directly with kubectl.

Secret References

Sensitive values reference the urbalurba-secrets Kubernetes secret, managed via ./uis secrets generate and ./uis secrets apply. See Secrets Management.

Best Practices

  • Test manifests with kubectl apply --dry-run=client -f <file> before applying
  • Manifest number must match the corresponding Ansible playbook number
  • Keep Helm values in external config files, never inline in playbooks
  • Separate configuration from IngressRoute files
  • Leave gaps in numbering for future expansion within each range