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 redundancyprovisioning-staging.json- Production-like but smaller scaleprovisioning-prod.json- Full production configuration
Deploy with environment-specific configs:
odin deploy service --env production \
--file service.json \
--provisioning provisioning-prod.json Best Practices
- Separate Configs by Environment: Use different provisioning files for dev, staging, prod
- Version Control: Keep provisioning configs in git alongside service definitions
- Resource Limits: Always specify CPU and memory limits to prevent resource exhaustion
- Security Groups: Properly configure network security for cloud resources
- High Availability: Use
multi_azfor production databases
Related Concepts
- Service: What to deploy
- Component: Components need provisioning
- Environment: Where to deploy