Skip to content

Storage API

Factory functions for persistent storage.

Quick Reference

FactoryImportDescription
Pvc()typekro/simplePersistentVolumeClaim - request storage
PersistentVolume()typekro/simplePersistentVolume - provision storage
persistentVolumeClaim()typekroFull PVC API
persistentVolume()typekroFull PV API
storageClass()typekroStorageClass definition

Simple Factories

Pvc()

Request storage with minimal configuration.

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

const storage = Pvc({
  id: 'storage',
  name: 'app-storage',
  size: '10Gi',
  accessModes: ['ReadWriteOnce'],
  storageClass: 'fast-ssd'
});

// Status reference
return { bound: storage.status.phase === 'Bound' };

Parameters

ParameterTypeRequiredDescription
idstringYesResource ID for references
namestringYesPVC name
sizestringYesStorage size (e.g., 10Gi)
namespacestringNoTarget namespace
accessModesstring[]NoAccess modes (default: ['ReadWriteOnce'])
storageClassstringNoStorageClass name

PersistentVolume()

Provision storage directly.

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

const volume = PersistentVolume({
  id: 'volume',
  name: 'nfs-volume',
  size: '100Gi',
  accessModes: ['ReadWriteMany'],
  nfs: {
    server: '192.168.1.100',
    path: '/exports/data'
  }
});

Core Factories

For full Kubernetes API access, use core factories:

typescript
import { persistentVolumeClaim, persistentVolume, storageClass } from 'typekro';

// Full PVC configuration
const pvc = persistentVolumeClaim({
  metadata: { name: 'data-pvc', namespace: 'default' },
  spec: {
    accessModes: ['ReadWriteOnce'],
    resources: { requests: { storage: '10Gi' } },
    storageClassName: 'fast-ssd',
    volumeMode: 'Filesystem'
  }
});

// StorageClass definition
const sc = storageClass({
  metadata: { name: 'fast-ssd' },
  provisioner: 'kubernetes.io/aws-ebs',
  parameters: { type: 'gp3', iopsPerGB: '50' },
  reclaimPolicy: 'Delete',
  volumeBindingMode: 'WaitForFirstConsumer'
});

Complete Example

typescript
import { type } from 'arktype';
import { kubernetesComposition } from 'typekro';
import { StatefulSet, Service, Pvc } from 'typekro/simple';

const database = kubernetesComposition({
  name: 'database',
  apiVersion: 'data.example.com/v1',
  kind: 'Database',
  spec: type({ name: 'string', storageSize: 'string' }),
  status: type({ ready: 'boolean', bound: 'boolean' })
}, (spec) => {
  const storage = Pvc({
    id: 'storage',
    name: `${spec.name}-data`,
    size: spec.storageSize,
    storageClass: 'fast-ssd'
  });

  const db = StatefulSet({
    id: 'db',
    name: spec.name,
    image: 'postgres:15',
    serviceName: `${spec.name}-headless`,
    ports: [{ containerPort: 5432 }],
    volumeMounts: [{
      name: 'data',
      mountPath: '/var/lib/postgresql/data'
    }],
    volumes: [{
      name: 'data',
      persistentVolumeClaim: { claimName: storage.metadata.name }
    }]
  });

  Service({
    id: 'headless',
    name: `${spec.name}-headless`,
    selector: { app: spec.name },
    ports: [{ port: 5432 }],
    clusterIP: 'None'
  });

  return {
    ready: db.status.readyReplicas > 0,
    bound: storage.status.phase === 'Bound'
  };
});

Access Modes

ModeDescriptionUse Case
ReadWriteOnceSingle pod, single nodeDatabases, single-instance apps
ReadOnlyManyMultiple pods, read-onlyShared config, static assets
ReadWriteManyMultiple pods, read-writeShared data (requires NFS/CephFS)
ReadWriteOncePodSingle pod only (K8s 1.22+)Strict single-writer guarantee

Volume Modes

ModeDescription
FilesystemMount as directory (default)
BlockRaw block device

Reclaim Policies

PolicyDescription
RetainKeep PV after PVC deletion
DeleteDelete PV when PVC is deleted
RecycleBasic scrub (rm -rf /volume/*) - deprecated

Status Fields

PVC status fields available for references:

typescript
storage.status.phase           // 'Pending' | 'Bound' | 'Lost'
storage.status.capacity        // Actual provisioned capacity
storage.status.accessModes     // Actual access modes

Next Steps

Released under the Apache 2.0 License.