Generic Kubernetes resources using lightkube
Project description
Kubernetes Provider
Generic Kubernetes resource management for Pragmatiks using lightkube.
Declaratively manage Kubernetes workloads, networking, configuration, and cluster-scoped resources. Workload resources authenticate through a shared kubernetes/config resource and use server-side apply for idempotent operations.
Prerequisites
- A reachable Kubernetes cluster -- managed by the GCP provider (
gcp/gke), external, or the cluster the controller itself runs in - Credentials for that cluster: a GKE cluster dependency, a mounted kubeconfig file, or in-cluster pod service-account credentials
- RBAC permissions on the target cluster for the resources you want to manage (typically
cluster-adminor namespace-scoped roles)
Installation
pragma providers install kubernetes
Resources
| Resource | Type Slug | Description |
|---|---|---|
| Config | kubernetes/config |
Authenticated cluster access shared by every workload resource |
| Namespace | kubernetes/namespace |
Cluster-scoped namespace isolation |
| Deployment | kubernetes/deployment |
Stateless workload with rolling updates |
| StatefulSet | kubernetes/statefulset |
Stateful workload with persistent storage and stable pod identity |
| Service | kubernetes/service |
Network exposure (ClusterIP, NodePort, LoadBalancer, Headless) |
| ConfigMap | kubernetes/configmap |
Non-sensitive configuration data |
| Secret | kubernetes/secret |
Sensitive data (credentials, tokens, TLS certs) |
All workload resources require a config dependency pointing to a kubernetes/config resource for authentication.
Config
Authenticated cluster access used by every other resource in this provider. Supports three modes, letting you target existing clusters without owning their lifecycle:
in_cluster-- use the pod's mounted service account at/var/run/secrets/kubernetes.io/serviceaccount. Fails at validation if no credentials are mounted.gke_cluster-- build credentials from agcp/gkedependency.kubeconfig_file-- read a kubeconfig YAML from/etc/pragma-kubeconfig/. The path must be absolute, under the allowed root, and not a symlink.
Config:
mode("in_cluster"|"gke_cluster"|"kubeconfig_file") -- Authentication mode (immutable)cluster(dependency, required forgke_cluster) -- GKE cluster dependency (immutable)kubeconfig_path(string, required forkubeconfig_file) -- Absolute path under/etc/pragma-kubeconfig/(immutable)
Outputs:
mode-- Mode the config is operating in
resources:
in-cluster-config:
provider: kubernetes
resource: config
config:
mode: in_cluster
gke-config:
provider: kubernetes
resource: config
config:
mode: gke_cluster
cluster: ${{ my-cluster }}
file-config:
provider: kubernetes
resource: config
config:
mode: kubeconfig_file
kubeconfig_path: /etc/pragma-kubeconfig/staging.yaml
Namespace
Cluster-scoped resource for workload isolation. Namespaces do not belong to another namespace.
Config:
config(dependency) --kubernetes/configresource for cluster accesslabels(dict, optional) -- Labels to apply to the namespace
Outputs:
name-- Namespace name
resources:
dev-namespace:
provider: kubernetes
resource: namespace
config:
config: ${{ my-config }}
labels:
environment: development
team: platform
Deployment
Manages stateless workloads with configurable replicas, rolling update strategy, health probes, environment variables, and resource limits. Waits for all replicas to be ready before reporting success (default timeout: 300s).
Config:
config(dependency) --kubernetes/configresource for cluster accessnamespace(string, default:"default") -- Target namespace (immutable)replicas(int, default:1) -- Desired pod replicasselector(dict) -- Label selector for pods (immutable)labels(dict, optional) -- Pod labels; defaults toselectorif not setcontainers(list) -- Container specs: image, ports, env, probes, resourcesstrategy("RollingUpdate"|"Recreate", default:"RollingUpdate") -- Update strategy
Outputs:
name,namespace,replicas,ready_replicas,available_replicas
resources:
api-deployment:
provider: kubernetes
resource: deployment
config:
config: ${{ my-config }}
namespace: production
replicas: 3
selector:
app: api
containers:
- name: api
image: gcr.io/my-project/api:latest
ports:
- container_port: 8080
name: http
env:
LOG_LEVEL: info
env_from_secret:
DATABASE_URL: db-credentials.url
resources:
cpu: "250m"
memory: "512Mi"
cpu_limit: "1000m"
memory_limit: "1Gi"
readiness_probe:
http_get:
path: /healthz
port: 8080
initial_delay_seconds: 5
period_seconds: 10
StatefulSet
Manages stateful workloads with stable pod identity, persistent storage via PVC templates, and ordered deployment. Associates with a headless service for DNS-based pod discovery. Waits for all replicas to be ready before reporting success.
Config:
config(dependency) --kubernetes/configresource for cluster accessnamespace(string, default:"default") -- Target namespace (immutable)replicas(int, default:1) -- Desired pod replicasservice_name(string) -- Headless service for pod DNS (immutable)selector(dict, optional) -- Label selector; defaults to{"app": "<name>"}containers(list) -- Container specs: image, ports, env, volume mounts, probesvolume_claim_templates(list, optional) -- PVC templates for persistent storage
Outputs:
name,namespace,replicas,ready_replicas,service_name
resources:
postgres:
provider: kubernetes
resource: statefulset
config:
config: ${{ my-config }}
namespace: data
replicas: 3
service_name: postgres-headless
containers:
- name: postgres
image: postgres:16
ports:
- container_port: 5432
name: postgres
env:
- name: POSTGRES_DB
value: myapp
volume_mounts:
- name: data
mount_path: /var/lib/postgresql/data
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
cpu: "2000m"
memory: "4Gi"
readiness_probe:
tcp_socket_port: 5432
initial_delay_seconds: 15
period_seconds: 10
volume_claim_templates:
- name: data
storage_class: premium-rwo
access_modes:
- ReadWriteOnce
storage: 50Gi
Service
Exposes workloads via ClusterIP, NodePort, LoadBalancer, or Headless service types. Services are immediately ready after apply (no polling). Headless services automatically set clusterIP: None.
Config:
config(dependency) --kubernetes/configresource for cluster accessnamespace(string, default:"default") -- Target namespace (immutable)type("ClusterIP"|"NodePort"|"LoadBalancer"|"Headless", default:"ClusterIP") -- Service typeselector(dict) -- Label selector for target podsports(list) -- Port mappings: port, target_port, protocol, namecluster_ip(string, optional) -- Explicit cluster IP
Outputs:
name,namespace,cluster_ip,type
resources:
api-service:
provider: kubernetes
resource: service
config:
config: ${{ my-config }}
namespace: production
type: ClusterIP
selector:
app: api
ports:
- name: http
port: 80
target_port: 8080
postgres-headless:
provider: kubernetes
resource: service
config:
config: ${{ my-config }}
namespace: data
type: Headless
selector:
app: postgres
ports:
- name: postgres
port: 5432
ConfigMap
Stores non-sensitive configuration data as key-value pairs. ConfigMaps can be mounted as files or exposed as environment variables in pods.
Config:
config(dependency) --kubernetes/configresource for cluster accessnamespace(string, default:"default") -- Target namespace (immutable)data(dict) -- Key-value pairs to store
Outputs:
name,namespace,data
resources:
app-config:
provider: kubernetes
resource: configmap
config:
config: ${{ my-config }}
namespace: production
data:
APP_ENV: production
LOG_FORMAT: json
MAX_CONNECTIONS: "100"
Secret
Stores sensitive data (credentials, tokens, TLS certificates). Data values are automatically base64-encoded. Supports both pre-encoded data and plain-text string_data fields.
Config:
config(dependency) --kubernetes/configresource for cluster accessnamespace(string, default:"default") -- Target namespace (immutable)type(string, default:"Opaque") -- Secret type (e.g.,Opaque,kubernetes.io/tls)data(dict, optional) -- Key-value pairs (will be base64-encoded)string_data(dict, optional) -- Plain-text key-value pairs (Kubernetes encodes them)
Outputs:
name,namespace,type,data
resources:
db-credentials:
provider: kubernetes
resource: secret
config:
config: ${{ my-config }}
namespace: production
type: Opaque
string_data:
url: postgresql://user:pass@postgres:5432/myapp
username: user
password: pass
Cross-Provider Usage
The Kubernetes provider is designed to work alongside the GCP provider. A typical pattern is: GCP provisions the cluster, a kubernetes/config resource authenticates to it, and the workload resources depend on the config.
resources:
# GCP creates the cluster
my-cluster:
provider: gcp
resource: gke
config:
project_id: my-project
location: europe-west4
name: prod-cluster
credentials: ${{ secrets.gcp_credentials }}
# kubernetes/config mediates cluster access for all workload resources
my-config:
provider: kubernetes
resource: config
config:
mode: gke_cluster
cluster: ${{ my-cluster }}
# Kubernetes workload resources depend on the config
app-namespace:
provider: kubernetes
resource: namespace
config:
config: ${{ my-config }}
labels:
environment: production
app-config:
provider: kubernetes
resource: configmap
config:
config: ${{ my-config }}
namespace: ${{ app-namespace.name }}
data:
APP_ENV: production
app-secrets:
provider: kubernetes
resource: secret
config:
config: ${{ my-config }}
namespace: ${{ app-namespace.name }}
string_data:
api_key: ${{ secrets.api_key }}
app:
provider: kubernetes
resource: deployment
config:
config: ${{ my-config }}
namespace: ${{ app-namespace.name }}
replicas: 3
selector:
app: my-app
containers:
- name: app
image: gcr.io/my-project/app:latest
ports:
- container_port: 8080
env_from_secret:
API_KEY: app-secrets.api_key
app-service:
provider: kubernetes
resource: service
config:
config: ${{ my-config }}
namespace: ${{ app-namespace.name }}
type: LoadBalancer
selector:
app: my-app
ports:
- port: 80
target_port: 8080
Resources are applied in dependency order. The platform resolves ${{ my-cluster }}, ${{ my-config }}, and ${{ app-namespace.name }} references automatically, ensuring the GKE cluster and kubernetes/config resources are ready before any workload resources are created.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pragmatiks_kubernetes_provider-0.179.0.tar.gz.
File metadata
- Download URL: pragmatiks_kubernetes_provider-0.179.0.tar.gz
- Upload date:
- Size: 20.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
54f9b05993cfc4e08f478b8b84a957e9af74c2392b891d4b880cdb4501be0077
|
|
| MD5 |
540e0fcc4d58514dffd7f4a10bc77447
|
|
| BLAKE2b-256 |
d550e694f424833926eb1f90c73c0d60acb47cea6ad2919e922c657cee3fffe1
|
File details
Details for the file pragmatiks_kubernetes_provider-0.179.0-py3-none-any.whl.
File metadata
- Download URL: pragmatiks_kubernetes_provider-0.179.0-py3-none-any.whl
- Upload date:
- Size: 30.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9dad42e1964bb53070a379dbeda8e9546ea60f4e1160e18b1aea3ab5e1e39eec
|
|
| MD5 |
0f2bdebd423ff7be156876e6e88c770a
|
|
| BLAKE2b-256 |
22c1d456e373f6b0d43520c43b134594e15879210302caeba666bc26dbee1584
|