24 Argo CD applications22 AppProjects10 image updater policiesautomated pruneself-healTraefik ingressCloudflare edgeExternal SecretsMetalLB load balancingNFS dynamic storageGitHub and GitLab runnersk3s upgrade plans24 Argo CD applications22 AppProjects10 image updater policiesautomated pruneself-healTraefik ingressCloudflare edgeExternal SecretsMetalLB load balancingNFS dynamic storageGitHub and GitLab runnersk3s upgrade plans
Development - proving change

A developmentKubernetes networkfor proving change before production.

KuberTech.dev is the development view of the same KuberTech network: the place Kubernetes, automation and GitOps changes are worked through before production is updated.

It keeps experimentation useful rather than reckless: realistic services, familiar boundaries, controlled blast radius and a record of what was promoted, tightened or rejected.

Argo CDk3sGitOpsTraefikExternal Secretsself-hosted runners
dev.network / developDEVELOPMENTKUBERTECHKTk3s + GitOpsedgeCloudflare edgeworkloads24 managed appsguardrails22 AppProjectsdeliveryCI runnersCHANGE INCALM OPSchangetestingboundary22 projectsrecoveryvisibleservices6 groups
Development network view
01about kubertech

KuberTech is the public face of a real Kubernetes platform, not a throwaway demo.

Simon Oakes has been building and running networks since 1997, starting with small private LANs at a time when UK internet access was still mostly dial-up, expensive and bandwidth-limited. Today the wider environment spans virtualised and co-located systems across datacentres, runs useful services and gives new tools a realistic place to prove themselves. This site turns that operating model into something public, reviewable and safe to share.

soakes@uk

From hands-on network building in 1997 to Kubernetes platform engineering.

KuberTech is the public slice of the development network Simon Oakes uses today to operate useful services, research new technology and keep Linux, Kubernetes, networking, automation and recovery skills grounded in practical infrastructure.

25+
years operating production infrastructure
2,500+
VM estates automated with Ansible
300+
DNS zones managed in production roles

topics this site is about

production + development

Kubernetes

k3s workloads, namespaces, AppProjects and cluster boundaries that are visible enough to review.

GitOps

Argo CD reconciliation, automated prune, self-heal and environment overlays for controlled change.

Platform engineering

Ingress, secrets, storage, runners, maintenance and recovery treated as one operating system.

DevOps automation

Repeatable build, validation, release and deployment paths rather than manual cluster ceremony.

Cloudflare edge

Pages, DNS, edge routing and safe public metadata handled as part of the delivery model.

CI/CD

GitHub Actions validation, paired builds, release artifacts and self-hosted runner boundaries.

Recovery

Snapshots, unseal paths, controlled reboots and upgrade sequencing kept visible before incidents.

Safe public detail

Real operational signals without publishing credentials, private endpoints or sensitive topology.

02operating style

A personal network, run with production habits.

It is a controlled slice of a larger environment used for real services, research and long-running practice across Kubernetes, Linux, networking, automation and recovery.

1997 to now

Long-running practice

That path started with small private LANs in the dial-up era, when reliable local networking was the practical way to connect systems and move data. It grew into a datacentre-hosted development platform, keeping learning tied to real systems instead of throwaway examples.

real services

Production discipline

Services are operated with the same habits expected at work: clear ownership, controlled exposure, repeatable change, maintenance windows and recovery paths.

reviewed desired state

GitOps control

Argo CD reconciles reviewed application state from Git, with automated prune and self-heal policies used to keep drift visible and correctable.

ISP roots

Network and edge depth

DNS, routing, VPNs, mail, ingress, certificates and edge connectivity are treated as part of the platform, not as detached service plumbing.

less manual drift

Automation muscle

Ingress, certificates, secret sync, storage, runners, maintenance and upgrades are handled as repeatable platform capabilities rather than manual cluster chores.

designed to fix

Recovery judgement

Vault snapshots, unseal automation, controlled reboots and k3s upgrade plans keep failure handling and maintenance visible before pressure arrives.

03development network

The .dev site is where change is developed before it reaches production.

KuberTech.dev shows the development side of the environment: what is being tested, how promotion works, which guardrails stay in place and what has recently changed.

current development work

Production and development split

promoted

The same codebase now supports two clear roles: kubertech.io is production, while kubertech.dev is the development environment used to work through change.

Build matrix coverage

promoted

Both site variants are built and validated together so the production and development narratives cannot drift silently.

Image updater policies

watching

Selected workloads use Image Updater boundaries that can be observed in development before production automation is allowed to change behaviour.

Platform upgrade path

validating

k3s upgrade and maintenance automation is kept visible so sequencing, recovery and operator impact can be checked before production is touched.

Ingress and certificate flow

ready for production

Routing, TLS material and Cloudflare edge connectivity are validated together because they operate, and fail, as a system rather than isolated manifests.

promotion flow

01

Declare

Describe the change in a base application, development overlay, AppProject boundary or automation policy before it becomes cluster state.

02

Reconcile

Let Argo CD apply the development state and check the result against real platform services, not a throwaway example environment.

03

Observe

Review routing, secrets, storage, runner behaviour and maintenance impact before calling the change safe enough to promote.

04

Promote

Move the equivalent change into production only after the development environment has proved the path and exposed the operational consequences.

05

Record

Keep a short note of what changed, what was learned and whether the pattern should be reused, tightened or avoided.

guardrails that stay on

Same production-style boundaries

Development uses the same AppProjects, namespace boundaries and explicit repository sources as production, so testing happens inside realistic constraints.

No secret exposure

Secrets remain externalised and are never exposed through the public site, generated output or repository content.

Controlled failure

Development can expose failed approaches, but drift, hidden changes and unclear rollback paths are not allowed to become normal operating behaviour.

recent change notes

2026-06-08

promoted

Separate production and development narratives

KuberTech.io now presents the production network view while KuberTech.dev explains the development environment, guardrails and promotion flow.

2026-06-08

promoted

Validate both site variants

The build and validation path checks both production and development variants so the paired-domain model stays intentional.

2026-06-08

watching

Review public workload wording

Internal-facing workloads are described by purpose and access expectation so the site reads as controlled operation, not accidental exposure.

04managed applications

The inventory is organised by operational responsibility.

kubertech.dev groups Kubernetes applications by the role they play in the platform: workloads, ingress, certificates, secrets, storage, CI/CD runners and maintenance automation. The useful signal is not the manifest count; it is whether the operating model is easy to reason about and safe to change.

app

User workloads

8 appsToggle category

squid

namespace/squid

workload
policy
GitOps
scope
Bounded
wave
0

Caching forward proxy used for controlled network egress and development traffic patterns.

project
squid
source
squid-appify-k8s
path
overlays/<env>
exposure
internal service
proddevautomated pruneself-heal

vaultwarden

namespace/vaultwarden

workload
policy
GitOps
scope
Bounded
wave
0

Self-hosted password vault workload operated with private access, clear routing expectations and backup consideration.

project
vaultwarden
source
vaultwarden-appify-k8s
path
overlays/<env>
exposure
controlled routed workload
proddevautomated pruneself-heal

vlmcsd

namespace/vlmcsd

workload
policy
GitOps
scope
Bounded
wave
0

Internal licence activation workload for authorised development systems inside the wider network.

project
vlmcsd
source
vlmcsd-appify-k8s
path
overlays/<env>
exposure
internal-only service
proddevautomated pruneself-heal

phpipam

namespace/phpipam

workload
policy
GitOps
scope
Bounded
wave
0

IP address management workload for network records and address planning across the development network.

project
phpipam
source
phpipam-appify-k8s
path
overlays/<env>
exposure
routed workload
proddevautomated pruneself-heal

speedtest-tracker

namespace/speedtest-tracker

workload
policy
GitOps
scope
Bounded
wave
0

Internet performance monitoring workload used to track network behaviour over time.

project
speedtest-tracker
source
speedtest-tracker-appify-k8s
path
overlays/<env>
exposure
routed workload
proddevautomated pruneself-heal

termbin

namespace/termbin

workload
policy
GitOps
scope
Bounded
wave
0

Terminal-friendly paste service for controlled operator handoff and short-lived diagnostic notes.

project
termbin
source
termbin-appify-k8s
path
overlays/<env>
exposure
controlled routed workload
proddevautomated pruneself-heal

transfer

namespace/transfer

workload
policy
GitOps
scope
Bounded
wave
0

Command-line file handoff service used inside the wider network with controlled access expectations.

project
transfer
source
transfer-appify-k8s
path
overlays/<env>
exposure
controlled routed workload
proddevautomated pruneself-heal

ninerouter

namespace/ninerouter

workload
policy
GitOps
scope
Bounded
wave
0

Routed AI access service with image guard automation and controlled promotion expectations.

project
ninerouter
source
ninerouter-appify-k8s
path
overlays/<env>
exposure
routed workload
proddevautomated pruneself-heal
net

Networking and edge

4 appsToggle category

cloudflare

namespace/cloudflare

networking
policy
GitOps
scope
Bounded
wave
0

Cloudflare edge connectivity for controlled ingress into the KuberTech network.

project
cloudflare
source
cloudflare-appify-k8s
path
base app patched by overlays/<env>
exposure
edge connectivity
proddevautomated pruneself-heal

metallb-crds

namespace/metallb-system

networking
policy
GitOps
scope
Bounded
wave
0

Installs MetalLB custom resources ahead of the controller so load-balancer state has a reliable API surface.

project
metallb
source
metallb-crds-appify-k8s
path
base/apps/metallb-crds.yaml
exposure
cluster internal
proddevautomated pruneself-heal

metallb

namespace/metallb-system

networking
policy
GitOps
scope
Bounded
wave
0

Provides load-balancer IP allocation for services inside the Kubernetes network.

project
metallb
source
MetalLB Helm chart
path
base app patched by overlays/<env>
exposure
cluster networking
proddevautomated pruneself-heal

traefik

namespace/kube-system

networking
policy
GitOps
scope
Bounded
wave
0

Ingress routing layer for HTTP and TCP services, separated from TLS material and edge policy.

project
traefik
source
traefik chart + traefik-appify-k8s
path
charts/traefik/<env>/values.yaml
exposure
ingress edge
proddevautomated pruneself-heal
sec

Secrets and certificates

4 appsToggle category

external-secrets

namespace/external-secrets

secrets
policy
GitOps
scope
Bounded
wave
1

Synchronises external secret material into Kubernetes namespaces without publishing sensitive values in Git.

project
external-secrets
source
external-secrets Helm chart
path
base/apps/external-secrets.yaml
exposure
cluster internal
proddevautomated pruneself-heal

reflector

namespace/reflector

secrets
policy
GitOps
scope
Bounded
wave
2

Reflects selected secrets and config maps into target namespaces where shared platform material is required.

project
reflector
source
reflector Helm chart
path
base app patched by overlays/<env>
exposure
cluster internal
proddevautomated pruneself-heal

cert-manager

namespace/cert-manager

secrets
policy
GitOps
scope
Bounded
wave
0

Automates certificate resources and lifecycle management for services inside the cluster.

project
cert-manager
source
cert-manager chart + cert-manager-appify-k8s
path
overlays/<env>
exposure
cluster internal
proddevautomated pruneself-heal

traefik-tls

namespace/external-secrets

secrets
policy
GitOps
scope
Bounded
wave
4

Creates the TLS secret material consumed by Traefik routes without coupling certificates directly to ingress configuration.

project
external-secrets
source
traefik-tls-appify-k8s
path
overlays/<env>
exposure
TLS support
proddevautomated pruneself-heal
ci

CI/CD runners

2 appsToggle category
ci

github-actions-runners

cicd

Self-hosted GitHub Actions runners for trusted automation jobs close to the platform.

policyGitOpsscopeBoundedwave0
namespace
github-actions-runners
project
github-actions-runners
exposure
cluster internal
source
github-actions-runner-appify-k8s
ci

gitlab-runner

cicd

GitLab runner fleet for pipeline work that benefits from being close to the Kubernetes platform.

policyGitOpsscopeBoundedwave0
namespace
gitlab
project
gitlab-runner
exposure
cluster internal
source
gitlab-runner chart + gitlab-runner-appify-k8s
pvc

Storage

1 appsToggle category
pvc

nfs-subdir-external-provisioner

storage

Dynamic NFS-backed persistent volume provisioning for workloads that need shared storage.

policyGitOpsscopeBoundedwave0
namespace
kube-system
project
nfs-subdir-external-provisioner
exposure
storage class
source
nfs-subdir-external-provisioner chart + values repo
ops

Maintenance and recovery

4 appsToggle category

kured

namespace/kube-system

maintenance
policy
GitOps
scope
Bounded
wave
5

Coordinates node reboots inside a defined maintenance window so patching remains predictable.

project
kured
source
kured Helm chart
path
base/apps/kured.yaml
exposure
cluster internal
proddevautomated pruneself-heal

vault-unseal

namespace/vault-unseal

maintenance
policy
GitOps
scope
Bounded
wave
0

Automates Vault unseal operations so the platform secret backend has a recoverable operating path.

project
vault-unseal
source
vault-unseal chart + vault-unseal-appify-k8s
path
charts/vault-unseal/<env>/values.yaml
exposure
cluster internal
proddevautomated pruneself-heal

vault-raft-snapshot-agent

namespace/vault-raft-snapshot-agent

maintenance
policy
GitOps
scope
Bounded
wave
0

Captures Vault raft snapshots so backup and recovery posture is part of normal operations.

project
vault-raft-snapshot-agent
source
vault-raft-snapshot-agent-appify-k8s
path
overlays/<env>
exposure
cluster internal
proddevautomated pruneself-heal

system-upgrade

namespace/system-upgrade

maintenance
policy
GitOps
scope
Bounded
wave
0

System Upgrade Controller for automated k3s upgrade plans and repeatable node maintenance.

project
system-upgrade
source
system-upgrade-appify-k8s
path
overlays/<env>
exposure
cluster internal
proddevautomated pruneself-heal
api

Platform APIs

1 appsToggle category
api

metrics

platform

Provides Kubernetes resource metrics used for scheduling, checks and day-to-day platform visibility.

policyGitOpsscopeBoundedwave3
namespace
kube-system
project
metrics-server
exposure
cluster internal
source
metrics-server Helm chart
05reconciliation model

Argo CD boundaries make the operating contract visible.

The development plane is represented through Argo CD Applications, AppProjects, Image Updater policies and storage resources so repository access, namespaces and automation scope are clear before anything reaches the cluster.

24
Argo CD applications
22
AppProjects
7
shared base apps
16
overlay apps
1
storage apps
10
image updater policies
representative GitOps-managed applications

external-secrets

namespace/external-secrets

external-secrets Helm chart
GitOps-managedScoped

traefik

namespace/kube-system

traefik chart + traefik-appify-k8s
GitOps-managedScoped

github-actions-runners

namespace/github-actions-runners

github-actions-runner-appify-k8s
GitOps-managedScoped

system-upgrade

namespace/system-upgrade

system-upgrade-appify-k8s
GitOps-managedScoped

nfs-subdir-external-provisioner

namespace/kube-system

nfs-subdir-external-provisioner chart + values repo
GitOps-managedScoped
06platform services

Core services are treated as platform capabilities.

Ingress, certificates, secrets, load balancing, storage, maintenance and build runners are separated into service groups so each capability has a clear purpose, boundary and recovery expectation.

networking

Ingress edge

3 apps

Traefik handles cluster routing, TLS material is reconciled separately, and Cloudflare provides the controlled external edge path.

traefiktraefik-tlscloudflare

secrets

Certificate and secret flow

3 apps

Certificate resources, external secret sync and namespace reflection are managed as first-class platform services rather than ad-hoc workload details.

cert-managerexternal-secretsreflector

networking

Load balancing

2 apps

MetalLB CRDs and controller state are split so the controller reconciles only after its API surface is present.

metallb-crdsmetallb

storage

Storage provisioning

1 apps

NFS-backed dynamic provisioning supplies persistent volumes for workloads that need shared storage without hand-built volume steps.

nfs-subdir-external-provisioner

maintenance

Operational maintenance

4 apps

Reboots, k3s upgrade plans, Vault unseal and Vault raft snapshots are managed through GitOps-controlled applications so recovery work is visible.

kuredsystem-upgradevault-raft-snapshot-agentvault-unseal

automation

Build runners

2 apps

Self-hosted GitHub and GitLab runners keep automation close to the platform while remaining declared, bounded and GitOps-managed.

github-actions-runnersgitlab-runner
07gitops workflow

The repository layout is part of how the platform is operated.

Base applications, environment overlays, AppProjects and automation policies are split deliberately so changes can be reviewed, constrained, reconciled and promoted without relying on memory or manual cluster work.

Promotion model

dev overlay before prod overlay

Development and production sides use the same application model, giving platform and workload changes a repeatable path from testing to release.

Sync policy

automated prune + self-heal

Automated reconciliation keeps the cluster aligned to reviewed Git state, including pruning obsolete resources and self-healing configuration drift.

step 01

Declare

Applications and AppProjects are versioned in apps-appify-k8s under shared base and environment overlay paths.

step 02

Constrain

AppProjects limit each app to explicit source repositories, namespaces and cluster permissions before reconciliation starts.

step 03

Reconcile

Argo CD applies desired state with automated prune and self-heal enabled across the app set.

step 04

Promote

The development overlay proves platform and workload changes before the same operating model moves to production.

base/apps

Shared Argo CD Applications used by both production and development environments so common platform behaviour is defined once.

overlays/prod/apps

Production application resources and patches for the public network view.

overlays/dev/apps

Development application resources and patches for testing before production promotion.

overlays/*/projects

AppProject boundaries for allowed repositories, namespaces and cluster resources.

overlays/*/argocd

Argo CD Image Updater write-back policies for selected workloads where image automation is intentionally bounded.

overlays/*/storage

Storage provider Applications kept separate from normal workload apps so persistence concerns are easy to review.