11 KiB
11 KiB
Provisioning KCL Package
A comprehensive KCL (KusionStack Configuration Language) package providing type-safe schemas for Provisioning project batch workflows, and Kubernetes deployments.
Overview
This package contains production-ready KCL schemas with configuration-driven, provider-agnostic infrastructure automation capabilities.
Package Structure
provisioning/kcl/
├── main.k # Main entry point - import this
├── settings.k # Core system settings
├── lib.k # Common schemas and utilities
├── server.k # Server configuration schemas
├── cluster.k # Cluster management schemas
├── workflows.k # Batch workflow schemas
├── batch.k # Advanced batch operation utilities
├── dependencies.k # Taskserv dependency management
├── version.k # Version management schemas
├── k8s_deploy.k # Kubernetes deployment schemas
├── defaults.k # Default configurations
├── examples_batch.k # Comprehensive examples
└── docs/ # Documentation
Quick Start
Import the Package
# Import the main entry point for access to all schemas
import provisioning.main
# Or import from a relative path if working within the same project
import .main
Basic Server Configuration
import .main
# Define a simple server
web_server: main.Server = main.Server {
hostname: "web-01"
title: "Production Web Server"
labels: "env: prod, tier: web"
user: "admin"
# Optional: Add taskservs to install
taskservs: [
main.TaskServDef {
name: "nginx"
install_mode: "library"
profile: "production"
}
]
}
Batch Workflow Example
import .main
# Define a multi-provider infrastructure deployment
deployment_workflow: main.BatchWorkflow = main.BatchWorkflow {
workflow_id: "prod_deploy_001"
name: "Production Infrastructure Deployment"
description: "Deploy web tier across UpCloud and AWS"
operations: [
# Create UpCloud servers
main.BatchOperation {
operation_id: "create_web_servers"
name: "Create Web Servers"
operation_type: "server"
provider: "upcloud"
action: "create"
parameters: {
"server_count": "3"
"server_type": "web"
"zone": "fi-hel2"
"plan": "2xCPU-4GB"
}
priority: 10
}
# Install Kubernetes after servers are ready
main.BatchOperation {
operation_id: "install_k8s"
name: "Install Kubernetes Cluster"
operation_type: "taskserv"
action: "create"
parameters: {
"taskserv": "kubernetes"
"version": "v1.31.0"
"cluster_name": "prod-cluster"
}
dependencies: [
main.DependencyDef {
target_operation_id: "create_web_servers"
dependency_type: "sequential"
timeout: 600
}
]
priority: 8
}
]
# Global workflow settings
max_parallel_operations: 3
fail_fast: False
# Use SurrealDB for state persistence
storage: main.StorageConfig {
backend: "surrealdb"
connection_config: {
"url": "ws://localhost:8000"
"namespace": "provisioning"
"database": "workflows"
}
enable_persistence: True
retention_hours: 720 # 30 days
}
}
Kubernetes Deployment
import .main
# Define a complete Kubernetes deployment
nginx_deployment: main.K8sDeploy = main.K8sDeploy {
name: "nginx-web"
namespace: "production"
create_ns: True
spec: main.K8sDeploySpec {
replicas: 3
containers: [
main.K8sContainers {
name: "nginx"
image: "nginx:1.21"
ports: [
main.K8sPort {
name: "http"
container: 80
target: 8080
}
]
resources_requests: main.K8sResources {
memory: "128Mi"
cpu: "100m"
}
resources_limits: main.K8sResources {
memory: "256Mi"
cpu: "200m"
}
}
]
}
# Expose via service
service: main.K8sService {
name: "nginx-service"
typ: "LoadBalancer"
ports: [
main.K8sPort {
name: "http"
target: 80
nodePort: 30080
}
]
}
}
Core Schemas
Server Management
Server: Complete server configuration with defaults inheritanceServerDefaults: Default settings for server provisioningStorage,StorageVol: Storage configuration and partitioning
Workflow & Batch Operations
BatchWorkflow: Multi-operation workflow with dependenciesBatchOperation: Individual operation within workflowsDependencyDef: Define sequential or conditional dependenciesRetryPolicy: Configure retry behavior and backoffRollbackStrategy: Automatic rollback on failures
Taskserv Management
TaskServDef: Infrastructure service definitionsTaskservDependencies: Dependency management for taskservsHealthCheck: Health monitoring configuration
Kubernetes Deployments
K8sDeploy: Complete Kubernetes deployment specificationK8sService: Service definitions with load balancingK8sVolume: Persistent storage configurationK8sResources: Resource limits and requests
Configuration & Settings
Settings: System-wide configurationSecretProvider: SOPS/KMS secret managementAIProvider: AI integration configuration
Advanced Features
Mixed Provider Support
Deploy across multiple cloud providers in a single workflow:
mixed_deployment: main.BatchWorkflow = main.BatchWorkflow {
workflow_id: "multi_cloud_001"
name: "Multi-Cloud Deployment"
operations: [
# UpCloud servers for web tier
main.BatchOperation {
operation_id: "upcloud_web"
provider: "upcloud"
parameters: {"zone": "fi-hel2", "count": "3"}
}
# AWS RDS for database
main.BatchOperation {
operation_id: "aws_database"
provider: "aws"
parameters: {"region": "eu-west-1", "engine": "postgresql"}
dependencies: [
main.DependencyDef {
target_operation_id: "upcloud_web"
dependency_type: "sequential"
}
]
}
]
}
Resource Constraints & Autoscaling
Configure intelligent resource management:
batch_executor: main.BatchExecutor = main.BatchExecutor {
executor_id: "production_executor"
name: "Production Batch Executor"
# Resource limits
resource_constraints: [
main.ResourceConstraint {
resource_type: "cpu"
resource_name: "total_cores"
max_units: 16
units_per_operation: 2
hard_constraint: True
}
]
# Auto-scaling configuration
autoscaling: main.BatchAutoscaling {
enabled: True
min_parallel: 2
max_parallel: 10
scale_up_threshold: 0.8
target_utilization: 0.65
}
}
Monitoring & Observability
monitoring_config: main.MonitoringConfig = main.MonitoringConfig {
enabled: True
backend: "prometheus"
enable_tracing: True
enable_notifications: True
notification_channels: [
"webhook:slack://ops-alerts",
"webhook:pagerduty://incidents"
]
log_level: "info"
}
Validation & Testing
Schema Validation
# Validate individual files
kcl run server_config.k
# Validate entire workflow
kcl run workflow_definition.k
# Output as JSON for integration
kcl run workflow_definition.k --format json
Built-in Constraints
All schemas include comprehensive validation:
# Server hostnames must be non-empty
server: main.Server = main.Server {
hostname: "web-01" # ✅ Valid
# hostname: "" # ❌ Validation error
}
# Resource constraints are enforced
resources: main.K8sResources = main.K8sResources {
memory: "128Mi" # ✅ Valid K8s format
# memory: "invalid" # ❌ Validation error
}
# Dependency cycles are prevented
operation: main.BatchOperation = main.BatchOperation {
operation_id: "op1"
dependencies: [
main.DependencyDef {
target_operation_id: "op2" # ✅ Valid dependency
# target_operation_id: "op1" # ❌ Self-reference prevented
}
]
}
Integration Examples
With Nushell Scripts
# Generate workflow from KCL
let workflow = (kcl run deployment.k --format json | from json)
# Submit to batch executor
$workflow | to json | http post http://localhost:8080/workflows/batch/submit
# Monitor progress
while true {
let status = (http get $"http://localhost:8080/workflows/batch/($workflow.workflow_id)")
if $status.status == "completed" { break }
sleep 5sec
}
With Rust Orchestrator
// Deserialize KCL output into Rust structs
let workflow: BatchWorkflow = serde_json::from_str(&kcl_output)?;
// Execute via orchestrator
let executor = BatchExecutor::new(workflow);
executor.execute().await?;
Package Metadata
- Version: 0.1.0
- API Version: v1
- KCL Compatibility: 0.11.0 - 0.12.0
- Build Date: 2025-09-28
Features
- ✅ Server Management
- ✅ Cluster Orchestration
- ✅ Provider Abstraction
- ✅ Workflow Automation
- ✅ Batch Operations
Best Practices
- Always import via main.k for stability
- Use descriptive operation_id values for dependency tracking
- Set appropriate timeouts based on operation complexity
- Enable monitoring for production workflows
- Test workflows with small counts before production
- Use retry policies for transient failures
- Configure rollback strategies for critical operations
Contributing
When adding new schemas:
- Follow existing naming conventions
- Add comprehensive validation rules
- Include documentation strings
- Export from
main.k - Add examples to
examples_batch.k - Update this README
License
This package is part of the Provisioning project and follows the same license terms.