Skip to main content

A transparent, lightweight Kubernetes manifest generator

Project description

k8smith

CI PyPI Python 3.11+ License: GPL v3

A transparent, lightweight Kubernetes manifest generator.

Philosophy

  • Transparency over abstraction — Generated YAML is predictable; no hidden defaults
  • Composition over inheritance — Build complex resources from simple pieces
  • Type safety at the boundary — Validate inputs with Pydantic, output plain dicts
  • Cloud-agnostic core — Vanilla K8s resources work anywhere; cloud extensions are optional

Installation

pip install k8smith
# or
uv add k8smith

Quick Start

from k8smith import (
    DeploymentSpec,
    Container,
    PodSpec,
    PodTemplateSpec,
    ResourceRequirements,
    ResourceQuantity,
    build_deployment,
    Manifest,
)

spec = DeploymentSpec(
    name="web",
    namespace="production",
    replicas=3,
    template=PodTemplateSpec(
        spec=PodSpec(
            containers=[
                Container(
                    name="web",
                    image="nginx:1.25",
                    resources=ResourceRequirements(
                        requests=ResourceQuantity(cpu="100m", memory="128Mi"),
                        limits=ResourceQuantity(memory="256Mi"),
                    ),
                )
            ]
        )
    ),
)

deployment = build_deployment(spec)

# Collect resources into a manifest
manifest = Manifest()
manifest.add(deployment)
print(manifest.to_yaml())

GPU Support (no workarounds needed!)

from k8smith import (
    Container,
    ResourceRequirements,
    ResourceQuantity,
)

container = Container(
    name="ml-worker",
    image="ml-training:v1",
    resources=ResourceRequirements(
        requests=ResourceQuantity(memory="4Gi", cpu="1"),
        limits=ResourceQuantity(
            memory="8Gi",
            extended={"nvidia.com/gpu": "1"},  # Just works!
        ),
    ),
)

GKE Extensions

from k8smith.gke import (
    GatewaySpec,
    HTTPRouteSpec,
    build_gateway,
    build_httproute,
)

gateway = build_gateway(GatewaySpec(
    name="main-gateway",
    namespace="gateway",
    gateway_class_name="gke-l7-global-external-managed",
    listeners=[{
        "name": "https",
        "port": 443,
        "protocol": "HTTPS",
    }],
))

Core Resources

Resource Builder
Deployment build_deployment(DeploymentSpec)
Service build_service(ServiceSpec)
StatefulSet build_statefulset(StatefulSetSpec)
DaemonSet build_daemonset(DaemonSetSpec)
CronJob build_cronjob(CronJobSpec)
ConfigMap build_configmap(ConfigMapSpec)
Secret build_secret(SecretSpec)
HPA build_hpa(HPASpec)
PDB build_pdb(PDBSpec)
ServiceAccount build_serviceaccount(ServiceAccountSpec)
Namespace build_namespace(NamespaceSpec)
Role build_role(RoleSpec)
ClusterRole build_clusterrole(ClusterRoleSpec)
RoleBinding build_rolebinding(RoleBindingSpec)
ClusterRoleBinding build_clusterrolebinding(ClusterRoleBindingSpec)

GKE Resources

Resource Builder
Gateway build_gateway(GatewaySpec)
HTTPRoute build_httproute(HTTPRouteSpec)
HealthCheckPolicy build_healthcheckpolicy(HealthCheckPolicySpec)
GCPBackendPolicy build_gcp_backend_policy(GCPBackendPolicySpec)
PodMonitoring build_pod_monitoring(PodMonitoringSpec)
ClusterPodMonitoring build_cluster_pod_monitoring(ClusterPodMonitoringSpec)

Why not cdk8s?

k8smith was created to replace cdk8s after encountering these issues:

cdk8s Problem k8smith Solution
Size.gibibytes(6) outputs 6144Mi Strings stay as strings: "6Gi"
Can't add nvidia.com/gpu via resources Built into ResourceQuantity.extended
Adds hostNetwork: false when not set Only outputs what you specify
Requires label cleanup post-processing No generated labels
JSII/Node.js dependency Pure Python

License

GPL-3.0 - See LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

k8smith-0.2.3.tar.gz (49.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

k8smith-0.2.3-py3-none-any.whl (42.6 kB view details)

Uploaded Python 3

File details

Details for the file k8smith-0.2.3.tar.gz.

File metadata

  • Download URL: k8smith-0.2.3.tar.gz
  • Upload date:
  • Size: 49.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for k8smith-0.2.3.tar.gz
Algorithm Hash digest
SHA256 d1f9cf50cc49f585ffd059cf20fd2c020af41343b79681c957e9b0a4483be3dd
MD5 ece9204732cd8aeb6a2602b8aa4b389b
BLAKE2b-256 6c16a39faced7f102d548aa6983a89fd2809cb19c823f2f0b3e43bae4beacad8

See more details on using hashes here.

Provenance

The following attestation bundles were made for k8smith-0.2.3.tar.gz:

Publisher: release.yml on eliminyro/k8smith

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file k8smith-0.2.3-py3-none-any.whl.

File metadata

  • Download URL: k8smith-0.2.3-py3-none-any.whl
  • Upload date:
  • Size: 42.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for k8smith-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 a71c65f0eaebc5007f39710ae93ec7d34965fbe49aead17fbff81ba413581581
MD5 775c4c7f22cdbe87eadaf6bb1d310c7f
BLAKE2b-256 46c81084ce8f9935403442143eea59a70a913c1f49e56037f92a4d1f62efa547

See more details on using hashes here.

Provenance

The following attestation bundles were made for k8smith-0.2.3-py3-none-any.whl:

Publisher: release.yml on eliminyro/k8smith

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page