Local Kubernetes Environment Manager - Simplified local K8s development with Kind
Project description
LoKO - Local Kubernetes Oasis - simplified Kubernetes development environments
A Python CLI utility to manage local Kubernetes environments with Kind, providing simplified configuration management, version upgrades, DNS, wildcard certificates, local container registry, and extensive customization options.
Features
- ๐ Easy Setup: Initialize local Kubernetes clusters with a single command
- ๐ Smart Version Management: Upgrade component versions using Renovate-style comments
- ๐พ Automatic Backups: Config files are automatically backed up before upgrades
- ๐จ Custom Templates: Use your own Jinja2 templates for configuration generation
- โ๏ธ Extensive CLI Overrides: Override any configuration value via command-line flags
- ๐ฆ Built-in Local Registry: Local container registry with TLS support
- ๐ Automatic HTTPS: Built-in certificate management with mkcert
- ๐ Local DNS: Automatic DNS configuration for local development
- ๐ Metrics & Monitoring: Built-in metrics-server for resource monitoring and HPA support
- ๐ Comprehensive Status: Detailed view of cluster resources with
loko status - ๐งฉ Granular Service Management: List, deploy, and undeploy individual services with
loko service - ๐ฏ Advanced Node Scheduling: Flexible node labeling and workload placement
- ๐ Registry Mirroring: Automatic caching/mirroring of external registries (Docker Hub, Quay, etc.)
- ๐ง Service Presets: Pre-configured settings for common services (MySQL, PostgreSQL, Valkey, etc.)
- ๐ ๏ธ Helm-based Deployment: Deploy services from public repositories (groundhog2k, etc.)
- ๐๏ธ Centralized Helm Repos: Define repositories once, reference everywhere
- ๐ Automatic Secrets Management: Automatically generate, fetch and save service credentials with deduplication
- ๐ Port Availability Checking: Pre-flight validation ensures all required ports are available before cluster creation
- โก Smart Error Handling: Clear, actionable error messages guide you to solutions
Prerequisites
- Python 3.9 or higher
- Docker
- Kind
- mkcert (for HTTPS certificates)
- Helm
- Helmfile (optional, for service deployment)
- (optional) nss (for macOS) or libnss3-tools (for Linux) - needed for Firefox to trust mkcert certificates
Installation
From PyPI (recommended)
Using pip:
pip install loko-k8s
Using uv:
uv tool install loko-k8s
From Source
git clone https://github.com/bojanraic/loko.git
cd loko
pip install -e .
Using uv (for development)
git clone https://github.com/bojanraic/loko.git
cd loko
uv sync
uv run loko --help
Quick Start
-
Check prerequisites:
loko check-prerequisites -
Generate a default configuration:
loko generate-config -
Initialize your environment:
loko init -
Create the full environment:
loko create
Demo
Watch Loko in action - see the complete workflow from installation to cluster validation:
Demo highlights:
- Installing loko
- Generating a default configuration with auto-detected IP
- Creating a local Kubernetes cluster with Kind
- Deploying services (Traefik, container registry, PostgreSQL) with Helm
- Validating the cluster setup
- Checking environment status
- Upgrading component versions
- Viewing service secrets & connecting to PostgreSQL and test application
- Stopping and starting environment
- Installing shell completion (via
--install-completion)
Commands
Environment Lifecycle
loko init- Initialize environment (generate configs, setup certs, network)loko create- Create full environment with complete workflowloko start- Start all cluster containersloko stop- Stop all cluster containersloko destroy- Destroy the environmentloko recreate- Destroy and recreate the environmentloko clean- Destroy environment and remove all artifacts
Status & Validation
loko status- Show comprehensive environment statusloko validate- Validate the environmentloko check-prerequisites- Check if required tools are installed
Configuration & Secrets
loko generate-config- Generate default loko.yamlloko config upgrade- Upgrade component versions using Renovate commentsloko config helm-repo-add- Add Helm repositories to configloko config helm-repo-remove- Remove Helm repositories from configloko service list- List enabled services and their statusloko service deploy- Deploy all or specific servicesloko service undeploy- Undeploy all or specific servicesloko secret fetch- Fetch service credentials from clusterloko secret show- Display saved service credentialsloko config presets- View available service presets (coming soon)
Checking Cluster Status
Use the status command to get a comprehensive overview of your local Kubernetes environment:
loko status
This will display:
- Cluster Status: Overall health of the Kubernetes cluster
- Container Status: Status of all related containers (nodes, DNS, etc.)
- Node Status: List of all nodes with their roles and status
- DNS Status: Status of the local DNS service
Version Management & Upgrades
Loko uses Renovate-style comments in your configuration file to track and upgrade component versions. This approach allows you to:
- Keep component versions up-to-date
- Track version sources directly in your config
- Automatically query Docker Hub and Helm repositories for latest versions
How It Works
Add Renovate comments above the version fields in your loko.yaml:
kubernetes:
image: kindest/node
# renovate: datasource=docker depName=kindest/node
tag: v1.34.0
internal-components:
# renovate: datasource=helm depName=traefik repositoryUrl=https://traefik.github.io/charts
- traefik: "37.3.0"
services:
system:
- name: mysql
config:
chart: groundhog2k/mysql
# renovate: datasource=helm depName=mysql repositoryUrl=https://groundhog2k.github.io/helm-charts
version: 3.0.7
Supported Datasources
- Docker Hub (
datasource=docker): Fetches latest tags from Docker Hub - Helm Repositories (
datasource=helm): Fetches latest chart versions from Helm repos
Running Upgrades
loko config upgrade
This will:
- ๐ Scan your config for Renovate comments
- ๐ Query each datasource for the latest version (in parallel)
- ๐พ Create a backup (
loko-prev.yaml) - โ Update versions in place
- ๐ Show a summary of changes
Performance: Helm repository checks are performed in parallel, significantly reducing upgrade time when checking multiple repositories. For example, checking 5 repositories completes ~1.3x faster than sequential checks.
Example output:
Upgrading component versions...
๐ Checking kindest/node (docker)...
๐ Checking traefik (helm)...
๐ Checking mysql (helm)...
Updates found:
kindest/node: v1.32.0 โ v1.34.0
traefik: 31.2.0 โ 37.3.0
mysql: 3.0.5 โ 3.0.7
๐พ Backup created: loko-prev.yaml
โ
Updated 3 version(s) in loko.yaml
โฑ๏ธ Total fetch time: 8.18s (Helm ops: 8.18s)
Restoring from Backup
If an upgrade causes issues, easily revert:
mv loko-prev.yaml loko.yaml
Managing Helm Repositories
Loko provides commands to manage Helm repositories in your configuration file. This allows you to:
- Add custom Helm repositories for service deployments
- Manage repositories with a simple CLI interface
- Use added repositories with services and version upgrades
Adding Repositories
Add one or more Helm repositories in a single command:
# Add a single repository
loko config helm-repo-add \
--helm-repo-name bitnami \
--helm-repo-url https://charts.bitnami.com/bitnami
# Add multiple repositories at once
loko config helm-repo-add \
--helm-repo-name bitnami --helm-repo-url https://charts.bitnami.com/bitnami \
--helm-repo-name jetstack --helm-repo-url https://charts.jetstack.io
Removing Repositories
Remove one or more repositories:
# Remove a single repository
loko config helm-repo-remove --helm-repo-name bitnami
# Remove multiple repositories
loko config helm-repo-remove \
--helm-repo-name bitnami \
--helm-repo-name jetstack
Using Added Repositories
Added repositories appear in your config and can be referenced:
environment:
helm-repositories:
- name: bitnami
url: https://charts.bitnami.com/bitnami/
- name: jetstack
url: https://charts.jetstack.io/
services:
user:
- name: my-app
config:
repo:
ref: bitnami # Reference the added repository
chart: bitnami/nginx
version: 1.0.0
Managing Service Credentials
Service credentials (database passwords, etc.) are automatically generated during deployment. Loko provide a dedicated command group to manage them:
# Fetch credentials from the cluster
loko secret fetch
# Display saved credentials
loko secret show
Tip:
loko secret showwill automatically trigger afetchif the secrets file doesn't exist yet.
Credentials are saved locally to:
<base-dir>/<env-name>/service-secrets.txt
Example services with auto-generated credentials:
- MySQL (root password)
- PostgreSQL (postgres password)
- MongoDB (root password)
- RabbitMQ (admin password)
- Valkey (default password)
Directory Structure
When you run loko init or loko create, a .local directory is created (configurable via base-dir).
.
โโโ loko.yaml # Main configuration file
โโโ .local/ # Default directory for cluster data and configs
โ โโโ <env-name>/ # Environment-specific directory (e.g. dev-me)
โ โโโ certs/ # TLS certificates and keys
โ โ โโโ rootCA.pem # Root CA certificate
โ โ โโโ <domain>.pem # Domain certificate
โ โ โโโ <domain>-key.pem # Domain private key
โ โ โโโ <domain>-combined.pem # Combined cert and key
โ โโโ config/ # Generated configuration files
โ โ โโโ cluster.yaml # KinD cluster configuration
โ โ โโโ containerd/ # Container runtime config (per registry)
โ โ โ โโโ cr.dev.me/hosts.toml
โ โ โ โโโ docker.io/hosts.toml
โ โ โโโ dnsmasq.conf # Local DNS configuration
โ โ โโโ helmfile.yaml # Helm releases definition
โ โโโ logs/ # Kubernetes node logs
โ โโโ storage/ # Persistent volume data
โ โโโ kubeconfig # Cluster access configuration
โ โโโ service-secrets.txt # Generated service credentials
Note: The
.localdirectory is git-ignored by default.
Service Management
Loko permits granular control over your services through the services command group.
Listing Services
View all enabled services, their type, namespace, and current status:
loko service list
You can filter by type:
loko service list --user # Only user services
loko service list --system # Only system services
loko service list --internal # Only internal components (Traefik, Registry, etc.)
Deploying and Undeploying
Deploy or undeploy specific services:
# Deploy all user and system services
loko service deploy
# Deploy a specific service
loko service deploy mongodb
# Undeploy a specific service
loko service undeploy garage
# Include internal services
loko service deploy --internal
The deploy and undeploy commands default to targeting user and system services. Use --all or specific type flags to include internal components.
Note: selective deployment uses
helmfile --selectorunder the hood.
Service Types and DNS Structure
-
System Services (
service.local.domain):- Core infrastructure services (databases, message queues, etc.)
- Direct DNS resolution (e.g.,
mysql.dev.me,postgres.dev.me) - No wildcard resolution for security
-
Applications (
${LOCAL_APPS_DOMAIN}):- Custom applications and services
- Either under
.appssubdomain (service.apps.local.domain) or direct domain (service.local.domain) - Configurable via
use-apps-subdomainsetting
-
Core Infrastructure:
- Registry service (e.g.,
cr.dev.me)
- Registry service (e.g.,
Accessing Services
Once the environment is running, services are accessible through:
-
Direct Port Access:
# Example for PostgreSQL psql -h localhost -p 5432 -U postgres
-
Domain Names:
# Example for system service psql -h postgres.dev.me -U postgres
-
Service Credentials:
- Passwords are automatically generated and stored in
<local-dir>/<env-name>/service-secrets.txt - Or fetch them with:
loko secret
- Passwords are automatically generated and stored in
Using the Local Container Registry
The environment includes a local container registry accessible at <registry-name>.<local-domain>.
-
Push Images:
docker tag myapp:latest cr.dev.me/myapp:latest docker push cr.dev.me/myapp:latest
-
Use in Kubernetes:
image: cr.dev.me/myapp:latest
Node Scheduling and Workload Placement
The environment supports advanced node scheduling configurations to separate infrastructure and application workloads.
Node Labels
Configure custom labels in loko.yaml:
nodes:
labels:
control-plane:
tier: "infrastructure"
worker:
tier: "application"
Scheduling Flags
internal-components-on-control-plane: Forces infrastructure components (Traefik, registry) to run only on control-plane nodes.run-services-on-workers-only: Forces application services (databases, etc.) to run only on worker nodes.
OCI Registry and Helm Chart Validation
Loko includes validation workflows for testing OCI registry functionality.
Run validation with:
loko validate
This runs a comprehensive check including:
- Cluster status and node readiness
- DNS service health
- System pods status
- Kubectl connectivity
- Registry & TLS Validation: Builds a test image, pushes to local registry, deploys a test app, and verifies connectivity.
Configuration
The environment is configured through loko.yaml. You can generate a default one with loko generate-config.
Schema Structure
environment:
# General settings
name: string # Name of the environment
base-dir: string # Base directory for storage
expand-env-vars: boolean # Whether to expand OS and k8s-env variables
# Centralized repository definitions
helm-repositories: array # List of Helm repositories
# Provider configuration
provider:
name: string # Provider name (currently only "kind" supported)
runtime: string # Container runtime (docker or podman)
# Kubernetes configuration
kubernetes:
api-port: integer # API server port
image: string # Node image
tag: string # Node image tag
# Node configuration
nodes:
servers: integer # Number of control-plane nodes
workers: integer # Number of worker nodes
allow-scheduling-on-control-plane: boolean
internal-components-on-control-plane: boolean
# Network configuration
local-ip: string # Local IP for DNS resolution
local-domain: string # Domain name
local-dns-port: integer # DNS resolver port (default 53)
local-lb-ports: array # Load balancer ports
use-apps-subdomain: boolean # Use apps subdomain
apps-subdomain: string # Subdomain for apps
# Registry configuration
registry:
name: string
storage:
size: string
# Internal components
internal-components: array # List of internal components with versions
# Service configuration
use-service-presets: boolean # Whether to use service presets
run-services-on-workers-only: boolean
enable-metrics-server: boolean
services:
system: array # List of system services to deploy
user: array # List of user-defined services
CLI Overrides
Loko provides extensive CLI options to override almost any configuration value during initialization:
loko init --name my-cluster --workers 3 --registry-storage 50Gi --no-schedule-on-control
See loko init --help for all available overrides.
Custom DNS Port
Loko runs a lightweight DNS container on your machine so that services such as postgres.dev.me resolve locally. By default it binds to the standard DNS port 53, but some hosts already listen on that port. If you need to avoid a conflict, set local-dns-port in loko.yaml (or pass --local-dns-port to loko init). Loko will start the DNS container on the specified port and automatically update the /etc/resolver/<domain> entry so lookups continue to work.
Troubleshooting
-
DNS Resolution Issues
- Verify local DNS container is running:
loko status - Check DNS configuration:
cat /etc/resolver/<your-domain>
- Verify local DNS container is running:
-
Certificate Issues
- Regenerate certificates:
loko init(will re-run certificate setup) - Verify cert location:
ls <local-dir>/<env-name>/certs/
- Regenerate certificates:
-
Service Access Issues
- Validate environment:
loko validate - Verify ingress:
kubectl get ingress -A - Check credentials:
loko secret
- Validate environment:
-
OCI Registry Issues
- Test registry connectivity:
docker pull cr.dev.me/test:latest - Run validation:
loko validate
- Test registry connectivity:
-
Version Upgrade Issues
- Restore from backup:
mv loko-prev.yaml loko.yaml - Check Renovate comment syntax in config file
- Restore from backup:
Development
Setup
git clone https://github.com/bojanraic/loko.git
cd loko
uv sync
uv run loko --help
Running Tests
uv run loko --help
uv run loko init --help
License
This project is licensed under the MIT License - see the LICENSE file 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
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 loko_k8s-0.0.9.tar.gz.
File metadata
- Download URL: loko_k8s-0.0.9.tar.gz
- Upload date:
- Size: 60.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c8d022286367d26964a8a28a11306a1b46dc0e2e9a9945cced4396d8a66d276
|
|
| MD5 |
7178a2ab50b188d91e73a09190e4e331
|
|
| BLAKE2b-256 |
19ece7340f73f2cbe7a4ad29e5d2bc88b86963dcab47856147f762b9be2a3334
|
Provenance
The following attestation bundles were made for loko_k8s-0.0.9.tar.gz:
Publisher:
publish.yml on bojanraic/loko
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
loko_k8s-0.0.9.tar.gz -
Subject digest:
8c8d022286367d26964a8a28a11306a1b46dc0e2e9a9945cced4396d8a66d276 - Sigstore transparency entry: 810248506
- Sigstore integration time:
-
Permalink:
bojanraic/loko@f2af60903f1ccf37f78a3f2f04e95fd467722a0d -
Branch / Tag:
refs/tags/0.0.9 - Owner: https://github.com/bojanraic
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f2af60903f1ccf37f78a3f2f04e95fd467722a0d -
Trigger Event:
release
-
Statement type:
File details
Details for the file loko_k8s-0.0.9-py3-none-any.whl.
File metadata
- Download URL: loko_k8s-0.0.9-py3-none-any.whl
- Upload date:
- Size: 74.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
858496a3475f8598b84ea5f33a0a5e93a4a0c8c089d1199c9da148ec0456af3e
|
|
| MD5 |
3c13cebf9ded74286656bdd2c3e3576f
|
|
| BLAKE2b-256 |
6411a18f443ce3f3368ecfdca724a4e5166d39e716c2df259667bb8ea2eef940
|
Provenance
The following attestation bundles were made for loko_k8s-0.0.9-py3-none-any.whl:
Publisher:
publish.yml on bojanraic/loko
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
loko_k8s-0.0.9-py3-none-any.whl -
Subject digest:
858496a3475f8598b84ea5f33a0a5e93a4a0c8c089d1199c9da148ec0456af3e - Sigstore transparency entry: 810248507
- Sigstore integration time:
-
Permalink:
bojanraic/loko@f2af60903f1ccf37f78a3f2f04e95fd467722a0d -
Branch / Tag:
refs/tags/0.0.9 - Owner: https://github.com/bojanraic
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f2af60903f1ccf37f78a3f2f04e95fd467722a0d -
Trigger Event:
release
-
Statement type: