Skip to content

Workloads API ​

Simple factory functions for Kubernetes workload resources with type safety and sensible defaults.

Quick Reference ​

FactoryUse CaseKey Status Field
Deployment()Stateless apps, web serversstatus.readyReplicas
StatefulSet()Databases, stateful servicesstatus.readyReplicas
Job()One-time batch processingstatus.succeeded
CronJob()Scheduled tasksstatus.lastScheduleTime
DaemonSet()Node-level agentsstatus.numberReady

Deployment() ​

typescript
import { Deployment } from 'typekro/simple';

const app = Deployment({
  id: 'app',           // Required for cross-resource references
  name: 'my-app',
  image: 'nginx:latest',
  replicas: 3,
  ports: [{ containerPort: 80 }],
  env: { NODE_ENV: 'production' },
  resources: {
    requests: { cpu: '100m', memory: '128Mi' },
    limits: { cpu: '500m', memory: '512Mi' }
  }
});

// Status reference
return { ready: app.status.readyReplicas > 0 };

StatefulSet() ​

typescript
import { StatefulSet, Service } from 'typekro/simple';

const db = StatefulSet({
  id: 'db',
  name: 'postgres',
  image: 'postgres:15',
  replicas: 3,
  serviceName: 'postgres-headless',
  ports: [{ containerPort: 5432 }],
  env: { POSTGRES_PASSWORD: 'secret' }
});

const headless = Service({
  id: 'headless',
  name: 'postgres-headless',
  selector: { app: 'postgres' },
  ports: [{ port: 5432 }],
  clusterIP: 'None'
});

return { ready: db.status.readyReplicas >= spec.replicas };

Job() ​

typescript
import { Job } from 'typekro/simple';

const job = Job({
  id: 'migration',
  name: 'db-migration',
  image: 'migrate:v1',
  command: ['migrate', '--up'],
  env: { DATABASE_URL: spec.dbUrl },
  completions: 1,
  backoffLimit: 3
});

return { completed: job.status.succeeded >= 1 };

CronJob() ​

typescript
import { CronJob } from 'typekro/simple';

const backup = CronJob({
  id: 'backup',
  name: 'daily-backup',
  image: 'backup:latest',
  schedule: '0 2 * * *',  // Daily at 2 AM
  command: ['backup-db']
});

return { lastBackup: backup.status.lastScheduleTime || 'never' };

DaemonSet() ​

typescript
import { DaemonSet } from 'typekro/simple';

const agent = DaemonSet({
  id: 'agent',
  name: 'log-collector',
  image: 'fluentd:latest',
  env: { LOG_LEVEL: 'info' },
  volumeMounts: [{ name: 'logs', mountPath: '/var/log', readOnly: true }],
  volumes: [{ name: 'logs', hostPath: { path: '/var/log' } }]
});

return { ready: agent.status.numberReady > 0 };

Complete Example ​

typescript
import { type } from 'arktype';
import { kubernetesComposition } from 'typekro';
import { Deployment, Service, ConfigMap } from 'typekro/simple';

const WebAppSpec = type({
  name: 'string',
  image: 'string',
  replicas: 'number'
});

const webapp = kubernetesComposition({
  name: 'webapp',
  apiVersion: 'example.com/v1',
  kind: 'WebApp',
  spec: WebAppSpec,
  status: type({ ready: 'boolean', endpoint: 'string' })
}, (spec) => {
  const config = ConfigMap({
    id: 'config',
    name: `${spec.name}-config`,
    data: { LOG_LEVEL: 'info' }
  });

  const app = Deployment({
    id: 'app',
    name: spec.name,
    image: spec.image,
    replicas: spec.replicas,
    ports: [{ containerPort: 3000 }],
    env: { LOG_LEVEL: config.data.LOG_LEVEL }
  });

  const svc = Service({
    id: 'svc',
    name: `${spec.name}-svc`,
    selector: { app: spec.name },
    ports: [{ port: 80, targetPort: 3000 }]
  });

  return {
    ready: app.status.readyReplicas >= spec.replicas,
    endpoint: `http://${svc.status.clusterIP}`
  };
});

Configuration Options ​

All workload factories accept these common options:

typescript
interface CommonConfig {
  id: string;                    // Required for cross-references
  name: string;                  // Resource name
  image: string;                 // Container image
  env?: Record<string, string>;  // Environment variables
  resources?: {
    requests?: { cpu?: string; memory?: string };
    limits?: { cpu?: string; memory?: string };
  };
}

Best Practices ​

  1. Always include id - Required for status references and cross-resource dependencies
  2. Set resource limits - Prevents runaway containers from affecting cluster stability
  3. Use appropriate workload type - Deployment for stateless, StatefulSet for stateful, etc.

Enhanced Resource Methods ​

All workload factories return Enhanced resources with additional methods:

typescript
const deploy = Deployment({ id: 'app', name: 'app', image: 'nginx' });

// Custom readiness evaluation
deploy.withReadinessEvaluator((resource) => ({
  ready: resource.status?.readyReplicas === resource.spec?.replicas,
  message: `${resource.status?.readyReplicas}/${resource.spec?.replicas} ready`
}));

// Explicit dependencies
deploy.withDependencies('database', 'configMap');

See Custom Integrations for details.

Next Steps ​

Released under the Apache 2.0 License.