Flashing Raspberry Pi OS
Introduction
In a Kubernetes-based homelab environment, having consistent and repeatable node provisioning is critical. In my own setup, I run a Raspberry Pi–based K3s cluster as part of a larger rack architecture that also includes CI/CD pipelines (via Gitea runners), containerized AI services, and edge services that I deploy and test locally before pushing to production. Flashing Raspberry Pi OS is the first foundational step in bringing a new node into that system, ensuring it can reliably join the cluster, run workloads, and participate in automated deployments.
This guide walks through the process of flashing Raspberry Pi OS in a way that aligns with infrastructure-as-code thinking, so each node in the cluster behaves predictably and can be reproduced or replaced without manual drift.
Steps to Flash Raspberry Pi OS for Cluster Nodes
1. Download Raspberry Pi OS
Download the official Raspberry Pi OS image from the Raspberry Pi website. For cluster nodes, I typically use Raspberry Pi OS Lite (64-bit) to keep the system lightweight for Kubernetes workloads.
2. Install Raspberry Pi Imager
Install Raspberry Pi Imager on your workstation. This tool simplifies writing OS images to SD cards or SSDs.
3. Select Operating System
Open Raspberry Pi Imager and choose:
- Raspberry Pi OS (Lite, 64-bit)
4. Select Storage Device
Insert your SD card or SSD and select it as the target device.
5. Preconfigure Settings (Recommended)
Before flashing, open advanced settings and configure:
- Hostname (e.g.,
k3s-node-1,k3s-node-2) - Enable SSH
- Set username and password
- Configure Wi-Fi (if not using Ethernet in rack setup)
- Set locale/timezone
In my rack setup, I strongly prefer Ethernet-only nodes to keep latency stable across the Kubernetes cluster.
6. Flash the Image
Click “Write” and allow the process to complete. This will erase and install Raspberry Pi OS onto the storage device.
7. Boot the Node
Insert the storage device into the Raspberry Pi and power it on. The node will boot and apply initial configuration.
8. Verify Network Access
From your main machine or control node, verify the node is reachable:
ssh pi@k3s-node-1.local
Post-Flash Cluster Preparation (Homelab Context)
Once flashed, I integrate the node into my broader homelab stack:
- Join it to the K3s cluster running across the rack
- Register it with Gitea CI/CD runners for automated deployments
- Install monitoring agents for system observability
- Label it based on role (compute, AI inference, storage, etc.)
This keeps the system modular, where nodes are interchangeable parts of a larger distributed infrastructure.
Conclusion
Flashing Raspberry Pi OS is more than just imaging an SD card—it is the first step in building a reproducible edge computing environment. In a homelab rack like mine, where Kubernetes, CI/CD automation, and local AI services all run together, consistent node setup ensures stability and scalability. Once a node is flashed and standardized, it becomes a plug-and-play unit in the cluster, ready to handle workloads, run pipelines, and participate in the larger distributed system.
More in infrastructure-engineering
Continue exploring articles in this category.
Sep 7, 2025
K3s on Raspberry Pis
Step-by-step guide to setting up a K3s Kubernetes cluster on Raspberry Pi nodes — networking, configuration, a…
Sep 13, 2025
Hardware List and Costs
Full hardware list and cost breakdown for my ARM64 homelab Kubernetes cluster — Raspberry Pis, switches, stora…
Sep 24, 2025
Static IPs and Networking
How to configure static IP addresses and networking on Raspberry Pi nodes so every Kubernetes cluster member h…
Case Study
Bible Verse — Case Study
Production SaaS Platform · Full-Stack · Founder & Sole Engineer
A domain-driven SaaS platform with five independently scalable system boundaries: scripture content delivery, RAG-backed AI study, real-time community interaction, async media processing, and infrastructure services — built and operated end-to-end.
Our Results
How We Built It
- RAG pipeline grounding AI responses in actual scripture rather than model memory
- Hybrid Llama / OpenAI routing — local inference for cost, API fallback for quality at the edge
- Non-blocking media processing — FFmpeg jobs enqueued via BullMQ, API never waits on transcoding
- Cross-instance real-time consistency via Redis pub/sub behind WebSocket and WebRTC layers
Lessons Learned
- Domain boundaries enforced at the service layer prevent coupling long before scale demands microservices.
- RAG retrieval quality matters more than model size — better embeddings outperform a larger model on poor context.
- Async queue design should be first-class, not bolted on; BullMQ worker isolation saved the request path repeatedly.
Stack
Written by
5+ years building production systems · AI, Backend & Infrastructure · Founder of Bible Logic
Full-stack engineer with 5+ years of hands-on experience designing and shipping production systems — from Nuxt 3 frontends and Nitro APIs to self-hosted Kubernetes clusters, RAG pipelines, and real-time AI applications. Everything I write comes from systems I've designed, deployed, and operated in production.

