<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://lalet.me/feed.xml" rel="self" type="application/atom+xml" /><link href="https://lalet.me/" rel="alternate" type="text/html" /><updated>2026-06-22T02:50:32+00:00</updated><id>https://lalet.me/feed.xml</id><title type="html">Lalet Scaria</title><subtitle>Staff Engineer (Platform/Reliability) — notes on cloud platforms, Kubernetes, and reliability.</subtitle><author><name>Lalet Scaria</name></author><entry><title type="html">Homelab, Part 1: Setting Up the Hardware</title><link href="https://lalet.me/2026/06/21/homelab-part-1-hardware.html" rel="alternate" type="text/html" title="Homelab, Part 1: Setting Up the Hardware" /><published>2026-06-21T00:00:00+00:00</published><updated>2026-06-21T00:00:00+00:00</updated><id>https://lalet.me/2026/06/21/homelab-part-1-hardware</id><content type="html" xml:base="https://lalet.me/2026/06/21/homelab-part-1-hardware.html"><![CDATA[<p>This is the first post in a series on building out my homelab — a place to run
the same platform infrastructure I work on professionally (Kubernetes, GitOps,
observability) without a cloud bill attached to every experiment. Part 1 is the
foundation: the physical hardware and how it’s wired together.</p>

<h2 id="how-it-started--and-why-it-grew">How it started — and why it grew</h2>

<p>I’d been running a homelab on a couple of Raspberry Pis for a while. They were
the perfect place to poke at things — small, cheap, low-power, and forgiving
when I broke them.</p>

<p>Then AI agents took off, and I wanted to experiment with running models locally
with <strong>Ollama</strong>. That’s where the Pis hit a wall: great for tinkering, not so
great for anything compute- or memory-hungry. I wanted a real, multi-node
environment I could run a proper Kubernetes cluster on — and host local LLMs
without paying per token.</p>

<p>So I went shopping. The whole rule was <strong>cheap</strong>: everything here came off the
secondhand marketplace, which is exactly why mini-PCs and a few small boxes beat
a loud, power-hungry rack server.</p>

<h2 id="the-hardware">The hardware</h2>

<p>Four small machines, a switch, and a NAS — nothing rack-mounted.</p>

<h3 id="compute-2-dell-optiplex-3070-micro">Compute: 2× Dell OptiPlex 3070 Micro</h3>

<p>The two workhorses, which I named <strong><code class="language-plaintext highlighter-rouge">plex1</code></strong> and <strong><code class="language-plaintext highlighter-rouge">plex2</code></strong>. They’re identical,
so here’s the spec for one node (both are the same):</p>

<table>
  <thead>
    <tr>
      <th>Component</th>
      <th>Spec (per node)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>CPU</td>
      <td>Intel Core i5-8500T — 6 cores / 6 threads, 35 W</td>
    </tr>
    <tr>
      <td>RAM</td>
      <td>24 GB DDR4</td>
    </tr>
    <tr>
      <td>Boot disk</td>
      <td>~256 GB NVMe</td>
    </tr>
    <tr>
      <td>Data disk</td>
      <td>2 TB SATA SSD</td>
    </tr>
    <tr>
      <td>Hypervisor</td>
      <td>Proxmox VE 9.2.3</td>
    </tr>
  </tbody>
</table>

<p>The 3070 Micro hits the homelab sweet spot: a 35 W “T” CPU sips power and runs
silent, but six cores and 24 GB of RAM are plenty to host a multi-node cluster —
and finally enough headroom to run Ollama. The 2 TB SSD in each node holds the
VM disks (<code class="language-plaintext highlighter-rouge">local-ssd</code>); the smaller NVMe handles boot and Proxmox itself.</p>

<p>Two nodes instead of one bigger box was deliberate: it lets me split the
Kubernetes control plane across physical hosts and actually learn multi-node
clustering — the whole point of the exercise.</p>

<h3 id="2-raspberry-pi-5--where-it-all-started">2× Raspberry Pi 5 — where it all started</h3>

<p>The Pis are still around. They were the original homelab and my first set of
experiments, and they’ve earned a permanent spot. These days they handle the
lighter, always-on bits while the OptiPlex nodes do the heavy lifting.</p>

<h3 id="storage-buffalo-terastation-5200-nvr">Storage: Buffalo TeraStation 5200 NVR</h3>

<p>Bulk storage and backups live on a secondhand <strong>Buffalo TeraStation 5200 NVR</strong> —
a 2-bay business NAS, loaded with <strong>2× 4 TB</strong> drives. It has dual Gigabit ports,
so the box itself isn’t the bottleneck; in practice it runs well behind the
node-local SSDs, which is exactly why it stays in the “cold storage / backups”
tier and each compute node keeps its own local 2 TB SSD for anything live or
performance-sensitive.</p>

<h3 id="networking-tp-link-switch">Networking: TP-Link switch</h3>

<p>Everything sits on a single flat LAN:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>                Internet
                   │
          ┌────────┴─────────┐
          │   home router     │  gateway, DHCP
          └────────┬─────────┘
                   │
          ┌────────┴─────────┐
          │  TP-Link switch   │  unmanaged, 5 V powered
          └────────┬─────────┘
         ┌─────┬────┴───┬──────┬───────┐
       plex1  plex2   Buffalo  rpi5    rpi5
                       NAS
</code></pre></div></div>

<p>The switch is a plain, unmanaged 5 V-powered TP-Link unit — the same low-power
class of gear as the Pis themselves. No VLANs, no management, nothing fancy: the
OptiPlex Micros each have a single onboard 1 GbE NIC, and the switch just ties
the nodes, NAS, and Pis together off the home router. (Segmenting this into
VLANs is on the list for a later post.)</p>

<h3 id="power--physical-setup">Power &amp; physical setup</h3>

<p>It’s all low-power by design — those 35 W CPUs idle quietly. <strong>No UPS yet</strong>;
that’s the next purchase, because the one thing this setup can’t currently
survive gracefully is a power blip.</p>

<h2 id="whats-actually-running-on-it">What’s actually running on it</h2>

<p>To make the hardware concrete — here’s the current Kubernetes cluster, running
as Proxmox VMs spread across the two nodes:</p>

<table>
  <thead>
    <tr>
      <th>VM</th>
      <th>Role</th>
      <th>Host</th>
      <th>vCPU</th>
      <th>RAM</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">cp1</code></td>
      <td>control plane</td>
      <td><code class="language-plaintext highlighter-rouge">plex1</code></td>
      <td>4</td>
      <td>4 GB</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">cp2</code></td>
      <td>control plane</td>
      <td><code class="language-plaintext highlighter-rouge">plex2</code></td>
      <td>4</td>
      <td>4 GB</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">worker1</code></td>
      <td>worker</td>
      <td><code class="language-plaintext highlighter-rouge">plex1</code></td>
      <td>6</td>
      <td>16 GB</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">worker2</code></td>
      <td>worker</td>
      <td><code class="language-plaintext highlighter-rouge">plex2</code></td>
      <td>6</td>
      <td>12 GB</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">worker3</code></td>
      <td>worker</td>
      <td><code class="language-plaintext highlighter-rouge">plex2</code></td>
      <td>6</td>
      <td>6 GB</td>
    </tr>
  </tbody>
</table>

<p>Two control-plane nodes and three workers, with the control plane split across
physical hosts so a single node reboot doesn’t take the cluster down. On top of
this runs my GitOps/observability stack and the local-AI experiments that
started this whole upgrade — the subject of later parts.</p>

<h2 id="decisions-and-trade-offs">Decisions and trade-offs</h2>

<ul>
  <li><strong>Secondhand mini-PCs over a rack server</strong> — quiet, low-power, fits anywhere,
and <em>cheap</em>. The cost is no IPMI/iLO and limited expansion, which I can live with.</li>
  <li><strong>Two nodes over one</strong> — redundancy and a real multi-node cluster to learn on,
rather than one big single point of failure.</li>
  <li><strong>Node-local SSD + a NAS for cold storage</strong> — fast, node-local storage for
anything live; the Buffalo NAS strictly for backups and bulk.</li>
</ul>

<h2 id="whats-next">What’s next</h2>

<p>With the metal racked (well, <em>shelved</em>) and on the network, <strong>Part 2</strong> covers the
virtualization layer: installing Proxmox, the <code class="language-plaintext highlighter-rouge">plex1</code>/<code class="language-plaintext highlighter-rouge">plex2</code> setup, and how the
Kubernetes VMs are laid out across them.</p>

<p>It’s all learning — and the whole world’s our stage, folks.</p>]]></content><author><name>Lalet Scaria</name></author><category term="homelab" /><category term="infrastructure" /><category term="proxmox" /><category term="kubernetes" /><summary type="html"><![CDATA[This is the first post in a series on building out my homelab — a place to run the same platform infrastructure I work on professionally (Kubernetes, GitOps, observability) without a cloud bill attached to every experiment. Part 1 is the foundation: the physical hardware and how it’s wired together.]]></summary></entry><entry><title type="html">Welcome to my blog</title><link href="https://lalet.me/2026/06/21/welcome-to-my-blog.html" rel="alternate" type="text/html" title="Welcome to my blog" /><published>2026-06-21T00:00:00+00:00</published><updated>2026-06-21T00:00:00+00:00</updated><id>https://lalet.me/2026/06/21/welcome-to-my-blog</id><content type="html" xml:base="https://lalet.me/2026/06/21/welcome-to-my-blog.html"><![CDATA[<p>This is the first post on my blog, where I’ll write up things I learn while
building and running platform infrastructure — Kubernetes, Terraform, GitOps,
observability, and the occasional rabbit hole.</p>

<h2 id="why-a-blog">Why a blog?</h2>

<p>Writing things down forces me to actually understand them. The goal is short,
practical notes I’d want to find again later.</p>

<h2 id="how-posts-work">How posts work</h2>

<p>Each post is a Markdown file in <code class="language-plaintext highlighter-rouge">_posts/</code> named <code class="language-plaintext highlighter-rouge">YYYY-MM-DD-title.md</code> with a bit
of front matter at the top:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">layout</span><span class="pi">:</span> <span class="s">post</span>
<span class="na">title</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Your</span><span class="nv"> </span><span class="s">title"</span>
<span class="na">date</span><span class="pi">:</span> <span class="s">2026-06-21</span>
<span class="na">tags</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">kubernetes</span><span class="pi">,</span> <span class="nv">terraform</span><span class="pi">]</span>
<span class="nn">---</span>
</code></pre></div></div>

<p>Then just write Markdown. Code blocks, lists, and links all work:</p>

<ul>
  <li>Fenced code blocks get syntax highlighting</li>
  <li><code class="language-plaintext highlighter-rouge">inline code</code> is supported</li>
  <li><a href="https://lalet.me">Links</a> work as expected</li>
</ul>

<p>That’s it — commit, push, and it goes live.</p>]]></content><author><name>Lalet Scaria</name></author><category term="meta" /><category term="learning" /><summary type="html"><![CDATA[This is the first post on my blog, where I’ll write up things I learn while building and running platform infrastructure — Kubernetes, Terraform, GitOps, observability, and the occasional rabbit hole.]]></summary></entry></feed>