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)
Ingress build_ingress(IngressSpec)
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.6.0.tar.gz (55.5 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.6.0-py3-none-any.whl (44.0 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for k8smith-0.6.0.tar.gz
Algorithm Hash digest
SHA256 96950270d6ea543262798ca5a3850a661a07c39443eb66724baac64ad95ce622
MD5 01096e0d4d346bdd7d9f57c1dbccd440
BLAKE2b-256 e1045adf67afc9553fe651b35603072831bf45be8e60cecd01f12aa80b9d7b5a

See more details on using hashes here.

Provenance

The following attestation bundles were made for k8smith-0.6.0.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.6.0-py3-none-any.whl.

File metadata

  • Download URL: k8smith-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 44.0 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.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0d290073fd130b6e28d834eb81bc47e7a0db3ab58c5456602bd95e88808c5d9d
MD5 87a2dc4e45b4ec83e49ea20837bffe1a
BLAKE2b-256 eaaa91343f8e6e76ea47dee84368c8f84c2928116b7fe9f868ad6f773dae9087

See more details on using hashes here.

Provenance

The following attestation bundles were made for k8smith-0.6.0-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