- Add Kubernetes examples demonstrating deployment of various applications (PostgreSQL, Redis, generic). This improves the documentation and provides practical usage examples. - Add `tokio` dependency for async examples. This enables the use of asynchronous operations in the examples. - Add `once_cell` dependency for improved resource management in Kubernetes module. This allows efficient management of singletons and other resources.
135 lines
4.8 KiB
Rust
135 lines
4.8 KiB
Rust
//! Generic Application Deployment Example
|
|
//!
|
|
//! This example shows how to deploy any containerized application using the
|
|
//! KubernetesManager convenience methods. This works for any Docker image.
|
|
|
|
use sal_kubernetes::KubernetesManager;
|
|
use std::collections::HashMap;
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
// Create Kubernetes manager
|
|
let km = KubernetesManager::new("default").await?;
|
|
|
|
// Clean up any existing resources first
|
|
println!("=== Cleaning up existing resources ===");
|
|
let apps_to_clean = ["web-server", "node-app", "mongodb"];
|
|
|
|
for app in &apps_to_clean {
|
|
match km.deployment_delete(app).await {
|
|
Ok(_) => println!("✓ Deleted existing deployment: {}", app),
|
|
Err(_) => println!("✓ No existing deployment to delete: {}", app),
|
|
}
|
|
|
|
match km.service_delete(app).await {
|
|
Ok(_) => println!("✓ Deleted existing service: {}", app),
|
|
Err(_) => println!("✓ No existing service to delete: {}", app),
|
|
}
|
|
}
|
|
|
|
// Example 1: Simple web server deployment
|
|
println!("\n=== Example 1: Simple Nginx Web Server ===");
|
|
|
|
km.deploy_application("web-server", "nginx:latest", 2, 80, None, None)
|
|
.await?;
|
|
println!("✅ Nginx web server deployed!");
|
|
|
|
// Example 2: Node.js application with labels
|
|
println!("\n=== Example 2: Node.js Application ===");
|
|
|
|
let mut node_labels = HashMap::new();
|
|
node_labels.insert("app".to_string(), "node-app".to_string());
|
|
node_labels.insert("tier".to_string(), "backend".to_string());
|
|
node_labels.insert("environment".to_string(), "production".to_string());
|
|
|
|
// Configure Node.js environment variables
|
|
let mut node_env_vars = HashMap::new();
|
|
node_env_vars.insert("NODE_ENV".to_string(), "production".to_string());
|
|
node_env_vars.insert("PORT".to_string(), "3000".to_string());
|
|
node_env_vars.insert("LOG_LEVEL".to_string(), "info".to_string());
|
|
node_env_vars.insert("MAX_CONNECTIONS".to_string(), "1000".to_string());
|
|
|
|
km.deploy_application(
|
|
"node-app", // name
|
|
"node:18-alpine", // image
|
|
3, // replicas - scale to 3 instances
|
|
3000, // port
|
|
Some(node_labels), // labels
|
|
Some(node_env_vars), // environment variables
|
|
)
|
|
.await?;
|
|
|
|
println!("✅ Node.js application deployed!");
|
|
|
|
// Example 3: Database deployment (any database)
|
|
println!("\n=== Example 3: MongoDB Database ===");
|
|
|
|
let mut mongo_labels = HashMap::new();
|
|
mongo_labels.insert("app".to_string(), "mongodb".to_string());
|
|
mongo_labels.insert("type".to_string(), "database".to_string());
|
|
mongo_labels.insert("engine".to_string(), "mongodb".to_string());
|
|
|
|
// Configure MongoDB environment variables
|
|
let mut mongo_env_vars = HashMap::new();
|
|
mongo_env_vars.insert(
|
|
"MONGO_INITDB_ROOT_USERNAME".to_string(),
|
|
"admin".to_string(),
|
|
);
|
|
mongo_env_vars.insert(
|
|
"MONGO_INITDB_ROOT_PASSWORD".to_string(),
|
|
"mongopassword".to_string(),
|
|
);
|
|
mongo_env_vars.insert("MONGO_INITDB_DATABASE".to_string(), "myapp".to_string());
|
|
|
|
km.deploy_application(
|
|
"mongodb", // name
|
|
"mongo:6.0", // image
|
|
1, // replicas - single instance for simplicity
|
|
27017, // port
|
|
Some(mongo_labels), // labels
|
|
Some(mongo_env_vars), // environment variables
|
|
)
|
|
.await?;
|
|
|
|
println!("✅ MongoDB deployed!");
|
|
|
|
// Check status of all deployments
|
|
println!("\n=== Checking Deployment Status ===");
|
|
|
|
let deployments = km.deployments_list().await?;
|
|
|
|
for deployment in &deployments {
|
|
if let Some(name) = &deployment.metadata.name {
|
|
let total_replicas = deployment
|
|
.spec
|
|
.as_ref()
|
|
.and_then(|s| s.replicas)
|
|
.unwrap_or(0);
|
|
let ready_replicas = deployment
|
|
.status
|
|
.as_ref()
|
|
.and_then(|s| s.ready_replicas)
|
|
.unwrap_or(0);
|
|
|
|
println!(
|
|
"{}: {}/{} replicas ready",
|
|
name, ready_replicas, total_replicas
|
|
);
|
|
}
|
|
}
|
|
|
|
println!("\n🎉 All deployments completed!");
|
|
println!("\n💡 Key Points:");
|
|
println!(" • Any Docker image can be deployed using this simple interface");
|
|
println!(" • Use labels to organize and identify your applications");
|
|
println!(
|
|
" • The same method works for databases, web servers, APIs, and any containerized app"
|
|
);
|
|
println!(" • For advanced configuration, use the individual KubernetesManager methods");
|
|
println!(
|
|
" • Environment variables and resource limits can be added via direct Kubernetes API"
|
|
);
|
|
|
|
Ok(())
|
|
}
|