Skip to main content
k8s-scheduler takes an opinionated approach to infrastructure. This page documents all platform dependencies, why they’re needed, and how they integrate.

Dependency Overview

Required

Must be installed for basic functionality

Recommended

Strongly recommended for production

Optional

Additional features and integrations

Conditional

Required only in specific scenarios

Required Dependencies

These components are required for k8s-scheduler to function.

PostgreSQL

database
required
Relational database for persistent storage.Version: 12+Why: Stores users, organizations, teams, deployments, templates, billing plans, sessionsIntegration points:
  • Server connects via DATABASE_DSN
  • Optional session backend (SESSION_BACKEND=postgres)
  • Database migrations run via migrate tool
Managed options:
  • AWS RDS for PostgreSQL
  • Google Cloud SQL
  • Azure Database for PostgreSQL
  • Self-hosted (via Helm chart)
Configuration:

Traefik

ingress
required
Ingress controller for routing wildcard subdomains to user deployments.Version: v2.10+Why: Routes *.domain.com traffic to individual user deployment servicesIntegration points:
  • Operator creates Ingress resources with ingressClassName: traefik
  • Handles routing for user deployments like user-123-myapp.example.com
  • Works alongside AWS ALB Controller (server uses ALB, user deployments use Traefik)
Installation:
Why not ALB for user deployments?
  • ALB has a limit of 100 rules per load balancer
  • Users may create hundreds/thousands of deployments
  • Traefik handles unlimited ingress rules efficiently

cert-manager

certificates
required
Automatic TLS certificate provisioning and renewal.Version: v1.12+Why: Provisions TLS certificates for server and all user deploymentsIntegration points:
  • Operator creates Ingress resources with cert-manager annotations
  • Automatically requests certificates from Let’s Encrypt
  • Supports DNS01 challenge via Cloudflare
Installation:
ClusterIssuer configuration:

External DNS

dns
required
Automatic DNS record creation from Kubernetes resources.Version: v0.13+Why: Auto-creates DNS records for server and user deployment ingressesIntegration points:
  • Watches Ingress resources with annotation external-dns.alpha.kubernetes.io/hostname
  • Creates DNS records in Cloudflare (or Route53, etc.)
  • Syncs on ingress create/update/delete
Installation:

Cloudflare

dns-provider
required
DNS provider for External DNS and cert-manager.Why: Manages DNS records and DNS01 challenge for TLS certificatesIntegration points:
  • External DNS creates A/CNAME records
  • cert-manager uses DNS01 challenge for wildcard certificates
Configuration:
  • Create API token with permissions:
    • Zone → DNS → Edit
    • Zone → Zone → Read
  • Store in Kubernetes Secret:
Alternatives: Route53 (AWS), Cloud DNS (GCP), Azure DNS

Conditional Dependencies

Required only in specific deployment scenarios.

AWS Load Balancer Controller

ingress
Provisions AWS Application Load Balancers from Kubernetes Ingress resources.Version: v2.6+Required when: Deploying on AWS EKSWhy: Creates ALB for the server ingress (ingressClassName: alb)Integration points:
  • Server Helm chart creates Ingress with ALB annotations
  • Controller provisions ALB, target groups, listeners
  • Supports internal ALBs (Tailscale VPN access)
Installation:
Not required when: Using Traefik or NGINX for all ingress (non-AWS deployments)
Strongly recommended for production deployments.

HashiCorp Vault

secrets
Centralized secrets management.Version: v1.14+Why: Securely stores and manages secrets for users, templates, and deploymentsIntegration points:
  • Server: Vault Agent injects secrets (database, OAuth, Stripe, email) into pod
  • Secrets API: Stores user/template/deployment secrets in Vault KV v2
  • External Secrets Operator: Syncs Vault secrets to Kubernetes Secrets for user pods
Secret paths:
Installation:
Setup:
  1. Initialize and unseal Vault
  2. Enable KV v2 secrets engine:
  3. Run setup script:
Alternatives:
  • AWS Secrets Manager (SECRETS_BACKEND=aws)
  • Database encryption (SECRETS_BACKEND=database, requires SECRETS_ENCRYPTION_KEY)

External Secrets Operator

secrets-sync
Syncs external secrets (Vault, AWS) into Kubernetes Secrets.Version: v0.9+Required when: Using Vault or AWS Secrets ManagerWhy: Pulls user secrets from Vault/AWS and creates Kubernetes Secrets for deployment podsIntegration points:
  • Operator creates ExternalSecret resources for each deployment
  • ESO watches these resources and syncs from Vault
  • Creates/updates corresponding Secret resources
  • Pods mount these secrets as files or environment variables
Installation:
ClusterSecretStore: Created by k8s-scheduler Helm chart:

Vault Agent Injector

secrets-injection
Mutating webhook that injects Vault Agent sidecars into pods.Version: Bundled with Vault Helm chartRequired when: Using Vault for server secretsWhy: Injects database credentials, OAuth secrets, and API keys into server podIntegration points:
  • Server deployment has Vault annotations:
  • Vault Agent runs as sidecar container
  • Renders secrets to /vault/secrets/env
  • Server sources this file on startup
Installation: Included with Vault Helm chart

Optional Dependencies

Additional features and integrations.

Stripe

billing
Payment processing and subscription management.Why: Enables tiered billing (Free, Business, Enterprise)Integration points:
  • Server integrates with Stripe API for:
    • Creating subscriptions
    • Managing payment methods
    • Handling upgrades/downgrades
  • Webhook endpoint /api/stripe/webhook for events
  • Tier limits enforced based on subscription status
Configuration:
Required secrets:

SMTP / SendGrid

email
Email delivery for team invitations.Why: Send invitation emails when users invite team membersIntegration points:
  • Server sends emails via SMTP or SendGrid API
  • Email templates for invitations
  • Configurable sender address
SMTP Configuration:
SendGrid Configuration:

Redis

cache
In-memory data store for sessions.Version: 6+Why: Distributed session storage across multiple server replicasIntegration points:
  • Server uses Redis as session backend when SESSION_BACKEND=redis
  • Faster than PostgreSQL for session lookups
  • Enables horizontal scaling of server pods
Configuration:
Installation:
Alternatives: PostgreSQL sessions (SESSION_BACKEND=postgres)

Prometheus

monitoring
Metrics collection and alerting.Version: v2.40+Why: Monitor server and operator health, deployment metricsIntegration points:
  • Server exposes metrics on :9090/metrics
  • Operator exposes controller-runtime metrics
  • Helm chart creates ServiceMonitor (requires Prometheus Operator)
Metrics exposed:
  • scheduler_deployments_total - Total deployments created
  • scheduler_deployments_by_state - Deployments by state (running/stopped)
  • scheduler_api_request_duration_seconds - API latency
  • Controller-runtime reconcile metrics
Installation:
Enable in k8s-scheduler:

Grafana

observability
Metrics visualization and dashboards.Version: v9+Why: Visualize deployment metrics, server health, operator reconciliation loopsIntegration points:
  • Connects to Prometheus data source
  • Create custom dashboards for deployment metrics and operator status
  • Alerting for operator errors
Installation: Included with kube-prometheus-stack

Dependency Matrix

Architecture Diagram

Next Steps

Deployment Guide

Deploy k8s-scheduler to production

Configuration

Configure environment variables