Skip to main content

Provisioning

Understanding provisioning configurations in Odin

Provisioning in Odin defines how and where components are deployed. While service definitions describe what to deploy, provisioning configurations specify the deployment details for each cloud provider and platform.

What is Provisioning?

Provisioning configuration maps components to actual cloud resources:

  • Kubernetes deployments: Pods, services, ingress
  • AWS resources: EC2 instances, RDS databases, ElastiCache
  • GCP resources: Compute Engine, Cloud SQL, Memorystore
  • Azure resources: VMs, Azure Database, Cache for Redis

Provisioning Configuration Structure

Provisioning configs are JSON files that specify deployment parameters for each component:

[
  { "component_name": "api-server",
    "deployment_type": "kubernetes-deployment",
    "params": {"namespace": "production",
      "cpu": "2",
      "memory": "4Gi",
      "image": "myregistry/user-api:1.0.0"
    ,
    "env_variables": {"DB_HOST": "postgres.prod.svc.cluster.local",
      "CACHE_URL": "redis://cache:6379"
    
  ,
  { "component_name": "database",
    "deployment_type": "rds-postgres",
    "params": {"instance_class": "db.t3.medium",
      "storage": "100",
      "multi_az": true
    
  
]

Provisioning Properties

Each provisioning entry contains:

Property Required Description
component_name Yes Must match a component in the service definition
deployment_type Yes Provider-specific deployment type
params Yes Deployment-specific parameters (varies by type)
env_variables No Environment variables to inject

Deployment Types

Different deployment types are available for different platforms:

Kubernetes Deployment Types

kubernetes-deployment

Deploy a containerized application:

{ "component_name": "api",
  "deployment_type": "kubernetes-deployment",
  "params": { "namespace": "staging",
    "cpu": "500m",
    "memory": "1Gi",
    "replicas": 3,
    "image": "myregistry/api:1.0.0",
    "port": 8080,
    "service_type": "LoadBalancer"
  ,
  "env_variables": { "LOG_LEVEL": "info",
    "DB_CONNECTION_STRING": "postgres://db:5432/myapp"
  

kubernetes-statefulset

Deploy a stateful application (databases, caches with persistent storage):

{ "component_name": "cache",
  "deployment_type": "kubernetes-statefulset",
  "params": { "namespace": "staging",
    "cpu": "1",
    "memory": "2Gi",
    "replicas": 3,
    "image": "redis:7.0",
    "storage_class": "fast-ssd",
    "volume_size": "10Gi"
  

AWS Deployment Types

rds-postgres / rds-mysql

Deploy RDS database instances:

{ "component_name": "database",
  "deployment_type": "rds-postgres",
  "params": { "instance_class": "db.r5.large",
    "storage": "200",
    "multi_az": true,
    "backup_retention_days": 7,
    "vpc_security_groups": ["sg-abc123"]
  

elasticache-redis

Deploy ElastiCache Redis cluster:

{ "component_name": "cache",
  "deployment_type": "elasticache-redis",
  "params": { "node_type": "cache.r5.large",
    "num_nodes": 3,
    "engine_version": "7.0",
    "subnet_group": "my-subnet-group"
  

Environment-Specific Provisioning

Create separate provisioning files for different environments:

  • provisioning-dev.json - Smaller instances, less redundancy
  • provisioning-staging.json - Production-like but smaller scale
  • provisioning-prod.json - Full production configuration

Deploy with environment-specific configs:

odin deploy service --env production \
  --file service.json \
  --provisioning provisioning-prod.json

Best Practices

  1. Separate Configs by Environment: Use different provisioning files for dev, staging, prod
  2. Version Control: Keep provisioning configs in git alongside service definitions
  3. Resource Limits: Always specify CPU and memory limits to prevent resource exhaustion
  4. Security Groups: Properly configure network security for cloud resources
  5. High Availability: Use multi_az for production databases

Related Concepts