<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Kubernetes on hereticles</title><link>https://icle.es/tags/kubernetes/</link><description>Recent content in Kubernetes on hereticles</description><generator>Hugo</generator><language>en</language><lastBuildDate>Mon, 25 May 2026 14:39:35 +0100</lastBuildDate><atom:link href="https://icle.es/tags/kubernetes/index.xml" rel="self" type="application/rss+xml"/><item><title>henge</title><link>https://icle.es/endeavours/henge/</link><pubDate>Sun, 01 Mar 2026 14:36:46 +0100</pubDate><guid>https://icle.es/endeavours/henge/</guid><description>&lt;p>My most interesting and intense technical work happened a log time ago now. The
closest recent work I did was building a
&lt;a href="https://icle.es/posts/poc-notifications/notifications.md">Proof of Concept Notification System for 500k users&lt;/a>&lt;/p>
&lt;p>I wanted to build and demonstrate some recent production grade experience -
specifically around &lt;a href="https://icle.es/tags/kubernetes">kubernetes&lt;/a> and
&lt;a href="https://icle.es/tags/golang">go&lt;/a>.&lt;/p>
&lt;p>My original plan was to build a simple feature flagging system. I had spent some
time thinking about it and I had a good idea ow what I wanted to build.&lt;/p></description><content:encoded><![CDATA[<p>My most interesting and intense technical work happened a log time ago now. The
closest recent work I did was building a
<a href="https://icle.es/posts/poc-notifications/notifications.md">Proof of Concept Notification System for 500k users</a></p>
<p>I wanted to build and demonstrate some recent production grade experience -
specifically around <a href="https://icle.es/tags/kubernetes">kubernetes</a> and
<a href="https://icle.es/tags/golang">go</a>.</p>
<p>My original plan was to build a simple feature flagging system. I had spent some
time thinking about it and I had a good idea ow what I wanted to build.</p>
<p>It didn&rsquo;t really connect with me though. It had some challenge, but I didn&rsquo;t
really feel the technical ability stretch.</p>
<p>I was also tinkering with some embedded projects - os-adjacent tinkering with a
raspberry pi pico, and a temperature sensor with an esp32. I was really enjoying
writing C code and I wondered if I could bring both of these together.</p>
<p>After some research, I identified an interesting niche gap. Configuration
management across a fleet of embedded devices. While there are enterprise level
platforms to support this, there was nothing at the hobbyist level - presumably
because everyone just duct-taped something together.</p>
<p>I could get my go on, get some kubernetes experience, even if it isn&rsquo;t strictly
necessary at the hobbyist level, and more importantly, I could write a C
reference client (at some point)</p>
<h2 id="minimum-capabilities">Minimum Capabilities</h2>
<ul>
<li>It should be possible to add a device,
<ul>
<li>Which would then be able to connect.</li>
</ul>
</li>
<li>It should be possible to create a schema with basic validation</li>
<li>Set a value against a field for a device</li>
<li>Which would push the config to the device</li>
</ul>
<p>I only had a few hours a week I could dedicate to it, and I didn&rsquo;t want it to
take six months.</p>
<h2 id="build-stages">Build Stages</h2>
<h3 id="stage-1--the-platform">Stage 1 — The Platform</h3>
<ul>
<li>Control plane in Go</li>
<li>Push mechanism</li>
<li>Minimal REST API: register devices, read/write config, check device state</li>
<li>Go reference client: connects, receives pushes, logs what it applied</li>
<li>Deployed on k8s cluster with proper configuration:
<ul>
<li>resource limits,</li>
<li>liveness/readiness probes,</li>
<li>rolling deployment,</li>
<li>persistent storage</li>
</ul>
</li>
<li>Public repo with README explaining engineering decisions</li>
<li>Correct reconnection with backoff</li>
<li>Done when: curl the API, change a value, Go client receives it within a
second, all running live on GKE</li>
</ul>
<h3 id="stage-2--the-c-client-optional">Stage 2 — The C Client (optional)</h3>
<ul>
<li>C client targeting Raspberry Pi (Linux, constrained environment)
<ul>
<li>Same protocol as Go client — control plane unchanged</li>
<li>Atomic config application (write to temp, verify, rename)</li>
<li>No memory leaks</li>
</ul>
</li>
<li>Something observable on the hardware when config changes</li>
<li>Done when: Raspberry Pi connected to live GKE service, config pushed, Pi
applies it, control plane records acknowledgement</li>
</ul>
<h3 id="stage-3--product-layer-ongoing-optional">Stage 3 — Product layer (ongoing, optional)</h3>
<ul>
<li>Rollout control (percentage-based, device groups)</li>
<li>Config history and audit trail</li>
<li>Simple web UI or keep API-first</li>
<li>Hosted version with auth, rate limiting, uptime guarantees</li>
<li>Terraform module for self-hosters</li>
<li>Only pursued if Stage 1 and 2 are solid and there&rsquo;s interest</li>
</ul>
<h2 id="data-storage">Data Storage</h2>
<p>Where to store data is a key consideration. In the early stages, we can use an
in-memory database.</p>
<p>Once persistence becomes relevant, there are many options. For a single node, we
can store the data locally. <a href="https://github.com/etcd-io/bbolt">bbolt</a> is a good
candidate here.</p>
<p>Once we need multi-node setups, we need a separate database. With my postgresql
experience, that is a strong, if heavy candidate. Redis is potentially another
option, as is rqlite (which I&rsquo;ve not used before)</p>
<p>I will leave this option to be decided later.</p>
<p>I also considered etcd, but I didn&rsquo;t want to integrate something and use it in a
way it was not intended without being abl e stress test it enough to have the
confidence that it&rsquo;ll work as advertised.</p>
<h2 id="links">Links</h2>
<ul>
<li><a href="https://codeberg.org/hereticles/henge">Source Code</a></li>
</ul>
]]></content:encoded></item></channel></rss>