sherpack-kube
Kubernetes integration for Sherpack - storage drivers, release management, and cluster operations.
Overview
sherpack-kube provides the complete Kubernetes lifecycle management layer for Sherpack. It handles storing release state, applying resources to clusters, executing hooks, tracking health, and managing rollbacks.
Features
- Storage Drivers - Persist release state in Secrets, ConfigMaps, or files
- Release Management - Full lifecycle with state machine and auto-recovery
- Server-Side Apply - Modern Kubernetes apply with conflict detection
- CRD Handling - Intent-based policies, smart updates with safety analysis (24 change types)
- Hooks System - Pre/post install/upgrade/rollback/delete with policies
- Health Checks - Deployment readiness, HTTP probes, custom commands
- Diff Engine - Three-way merge visualization
- Sync Waves - Resource ordering with dependencies
- Progress Reporting - Real-time feedback during operations
CRD Handling
Sherpack provides sophisticated CRD (CustomResourceDefinition) handling that addresses Helm's major limitations.
Intent-Based Policies
Unlike Helm's location-based approach (crds/ vs templates/), Sherpack uses intent-based policies:
use ;
// Three policies determine CRD behavior
Managed // Owned by release - installed, updated, protected on uninstall
Shared // Multiple releases use it - never deleted
External // Pre-existing CRD - don't touch at all
Policy Annotations
Set CRD policy via annotations:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: certificates.cert-manager.io
annotations:
# Explicit Sherpack policy
sherpack.io/crd-policy: shared
# Or use Helm-compatible annotation
helm.sh/resource-policy: keep # Translates to "shared"
Safe Update Analysis
CRD updates are analyzed for safety with 24 change types:
use ;
let analyzer = new;
let changes = analyzer.analyze?;
for change in &changes
Detected Change Types
| Category | Safe Changes | Dangerous Changes |
|---|---|---|
| Versions | Add new version | Remove version, change storage version |
| Schema | Add optional field | Remove required field, change field type |
| Validation | Relax constraints | Tighten constraints |
| Scope | - | Change Namespaced ↔ Cluster |
| Names | - | Change plural/singular/kind |
| Printer | Add column | Remove column |
Deletion Protection
use ;
let protection = new;
// Analyze impact before deletion
let impact = protection.analyze_deletion_impact.await?;
println!;
println!;
for in impact.sorted_namespaces
// Check if confirmation is needed
let confirmation = from_impact;
if confirmation.required
CRD Location Tracking
Track where CRDs come from for debugging:
use CrdLocation;
match crd.location
Lint Warnings
use ;
let warnings = lint_crds;
for warning in &warnings
CLI Flags
# Skip CRD installation
# Force CRD updates (bypass safety checks)
# Show CRD changes before applying
# Delete CRDs on uninstall (requires confirmation)
Comparison with Helm
| Feature | Helm | Sherpack |
|---|---|---|
| Policy model | Location-based | Intent-based |
| CRD updates | Never (blocked) | Safe by default, configurable |
| Patch strategy | Strategic (broken) | Server-Side Apply |
| Templating | No (in crds/) | Yes (with lint warnings) |
| Dependency ordering | None | Automatic |
| Wait for ready | No | Yes (configurable) |
| Dry-run | Broken | Full support |
| Deletion | Blocked | Configurable with confirmation |
| Diff output | None | Rich diff with impact analysis |
Quick Start
use ;
use Client;
async
Storage Drivers
Overview
Sherpack stores release metadata (values, manifests, status) using pluggable storage drivers.
use ;
// Configure storage
let config = StorageConfig ;
Available Drivers
Secrets Driver (Default)
use SecretsDriver;
let driver = new;
// Stores as: Secret/sh.sherpack.release.v1.{name}.v{revision}
Pros:
- Data encrypted at rest (if cluster encryption enabled)
- Standard Kubernetes RBAC
- Familiar pattern (same as Helm)
ConfigMap Driver
use ConfigMapDriver;
let driver = new;
// Stores as: ConfigMap/sh.sherpack.release.v1.{name}.v{revision}
Pros:
- Visible in standard ConfigMap tools
- No Secret access required
File Driver
use FileDriver;
let driver = new;
// Stores as: /var/lib/sherpack/releases/{namespace}/{name}/v{revision}.yaml
Pros:
- Works without Kubernetes
- Easy backup/restore
- Good for testing
Mock Driver (Testing)
use ;
let mock = new;
// Perform operations...
// Check what happened
let counts = mock.operation_counts;
assert_eq!;
assert_eq!;
Large Release Handling
Kubernetes Secrets/ConfigMaps have a ~1MB limit. Sherpack handles large releases automatically:
use LargeReleaseStrategy;
// Split into multiple objects
let config = StorageConfig ;
// Or store manifests separately
let config = StorageConfig ;
Release Management
Release State Machine
┌─────────────────────────────┐
│ │
▼ │
┌─────────┐ ┌──────────┐ ┌──────────┐ ┌────────────┐
│ Pending │──▶│ Deployed │──▶│ Superseded│ │ Failed │
└─────────┘ └──────────┘ └──────────┘ └────────────┘
│ │ ▲ ▲
│ │ │ │
│ └──────────────┘ │
│ (upgrade) │
│ │
└─────────────────────────────────────────────┘
(error)
StoredRelease
use ;
let release = StoredRelease ;
Auto-Recovery
Detect and recover stale releases:
use KubeClient;
// Find releases stuck in pending state
let stale = sherpack.find_stale_releases.await?;
for release in stale
Resource Management
Server-Side Apply
Sherpack uses Kubernetes Server-Side Apply for all resource operations:
use ;
let manager = new;
// Apply with field manager
let result = manager.apply.await?;
match result
Resource Discovery
Automatically discover API resources:
// ResourceManager discovers available resources
let manager = new.await?;
// Handles both core and custom resources
manager.apply.await?; // apps/v1 Deployment
manager.apply.await?; // cert-manager.io/v1 Certificate
Ordered Application
Resources are applied in the correct order:
- Namespaces
- CRDs
- RBAC (ServiceAccount, Role, RoleBinding, ClusterRole, ClusterRoleBinding)
- ConfigMaps, Secrets
- Services
- Deployments, StatefulSets, DaemonSets
- Ingress
- Custom resources
Hooks System
Hook Phases
| Phase | When |
|---|---|
pre-install |
Before any resources are created |
post-install |
After all resources are created |
pre-upgrade |
Before upgrade starts |
post-upgrade |
After upgrade completes |
pre-rollback |
Before rollback starts |
post-rollback |
After rollback completes |
pre-delete |
Before uninstall starts |
post-delete |
After all resources deleted |
test |
Manual test execution |
Defining Hooks
apiVersion: batch/v1
kind: Job
metadata:
name: db-migrate
annotations:
sherpack.io/hook: pre-upgrade
sherpack.io/hook-weight: "5"
sherpack.io/hook-delete-policy: hook-succeeded
spec:
template:
spec:
containers:
- name: migrate
image: myapp:migrate
command:
restartPolicy: Never
Hook Policies
use ;
// Failure policies
Fail // Abort operation (default)
Continue // Log and continue
Rollback // Trigger rollback
// Cleanup policies
BeforeHookCreation // Delete before creating new
HookSucceeded // Delete on success
HookFailed // Delete on failure
Hook Execution
use ;
let executor = new;
// Execute hooks for a phase
let results = executor.execute.await?;
for result in results
Health Checks
Built-in Checks
use ;
let checker = new;
let config = HealthCheckConfig ;
let status = checker.check.await?;
match status
Custom Health Checks
apiVersion: v1
kind: Pod
metadata:
name: health-check
annotations:
sherpack.io/health-check: "true"
sherpack.io/health-check-type: http
sherpack.io/health-check-path: /healthz
sherpack.io/health-check-port: "8080"
Or command-based:
annotations:
sherpack.io/health-check: "true"
sherpack.io/health-check-type: command
sherpack.io/health-check-command: "/bin/check-ready.sh"
Resource Health States
use ;
let health = checker.check_resource.await?;
match health.state
Diff Engine
Compare Releases
use ;
let engine = new;
// Diff between two releases
let diff = engine.diff?;
for change in &diff.changes
Three-Way Merge
Compare live cluster state with desired:
// Get live state from cluster
let live = manager.get_current_state.await?;
// Three-way diff: original → live → new
let diff = engine.three_way_diff?;
for change in diff.changes
Sync Waves
Resource Ordering
Control resource application order:
apiVersion: apps/v1
kind: Deployment
metadata:
name: database
annotations:
sherpack.io/sync-wave: "-1" # Apply first
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
annotations:
sherpack.io/sync-wave: "0" # Apply second
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
annotations:
sherpack.io/sync-wave: "1" # Apply last
Execution Plan
use ;
let config = WaveExecutionConfig ;
let plan = from_manifests?;
println!;
for wave in &plan.waves
// Execute with waits
plan.execute.await?;
Progress Reporting
Real-Time Feedback
use ;
let reporter = new;
// During installation
reporter.resource_status;
reporter.resource_status;
reporter.resource_status;
// Terminal output:
// ✓ Deployment/backend [3/3 ready]
Status Types
use ResourceState;
Pending // Not yet started
Creating // Being created
Waiting // Waiting for replicas
Ready // Fully ready
Failed // Failed
Deleted // Successfully deleted
Client Operations
Install
let options = builder
.name
.namespace
.values
.wait
.timeout
.dry_run
.build;
let release = client.install.await?;
Upgrade
let options = builder
.values
.wait
.reuse_values
.reset_values
.force
.build;
let release = client.upgrade.await?;
Rollback
let options = builder
.revision // Target revision
.wait
.build;
let release = client.rollback.await?;
Uninstall
let options = builder
.keep_history
.wait
.build;
client.uninstall.await?;
List Releases
let releases = client.list.await?;
for release in releases
Get History
let history = client.history.await?;
for revision in history
Annotations Reference
| Annotation | Description | Values |
|---|---|---|
sherpack.io/hook |
Hook phase | pre-install, post-install, etc. |
sherpack.io/hook-weight |
Execution order | Integer (lower = first) |
sherpack.io/hook-delete-policy |
Cleanup policy | before-hook-creation, hook-succeeded, hook-failed |
sherpack.io/resource-policy |
Resource policy | keep (don't delete on uninstall) |
sherpack.io/sync-wave |
Wave order | Integer |
sherpack.io/health-check |
Enable health check | true |
sherpack.io/health-check-type |
Check type | http, command |
Dependencies
kube/k8s-openapi- Kubernetes clientsherpack-core- Core typessherpack-engine- Template renderingtokio- Async runtimezstd/flate2- Compressionsimilar- Diff algorithmreqwest- HTTP for health checks
License
MIT OR Apache-2.0