From 4ae55f9bf446670206ae24b4e67deabee47a1164 Mon Sep 17 00:00:00 2001 From: Erich Blume Date: Wed, 25 Mar 2026 16:16:33 -0700 Subject: [PATCH] Review kubernetes-bootstrap tutorial: fix inaccuracies - Fix k3s table entry (BlumeOps uses k3s on ringtail) - Fix broken tailscale serve command (minikube ip returns IP, not port) - Rewrite NFS section to match actual static PV/PVC binding pattern - Fix "BluemeOps" typo - Add last-reviewed frontmatter Co-Authored-By: Claude Opus 4.6 (1M context) --- .../replication/kubernetes-bootstrap.md | 39 +++++++++++++++---- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/docs/tutorials/replication/kubernetes-bootstrap.md b/docs/tutorials/replication/kubernetes-bootstrap.md index cd74962..92d6aec 100644 --- a/docs/tutorials/replication/kubernetes-bootstrap.md +++ b/docs/tutorials/replication/kubernetes-bootstrap.md @@ -1,6 +1,7 @@ --- title: Kubernetes Bootstrap -modified: 2026-02-07 +modified: 2026-03-25 +last-reviewed: 2026-03-25 tags: - tutorials - replication @@ -20,7 +21,7 @@ For homelab use, lightweight distributions work well: | Distribution | Best For | BlumeOps Uses | |--------------|----------|---------------| | **Minikube** | Single-node, macOS | Yes | -| **k3s** | Single-node, Linux | - | +| **k3s** | Single-node, Linux | Yes (ringtail) | | **kind** | Local development | - | | **kubeadm** | Multi-node clusters | - | @@ -76,7 +77,7 @@ To access the cluster from other Tailscale devices, expose the API server: ### Option A: Tailscale Serve (Simple) ```bash -tailscale serve --bg --tcp 6443 tcp://localhost:$(minikube ip --format '{{.Port}}') +tailscale serve --bg --tcp 6443 tcp://$(minikube ip):8443 ``` ### Option B: Tailscale Kubernetes Operator (Advanced) @@ -125,22 +126,44 @@ kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storagec ### NFS for Shared Storage -If you have a NAS: +If you have a NAS on your tailnet, create a static PersistentVolume and PersistentVolumeClaim pair: + ```yaml apiVersion: v1 kind: PersistentVolume metadata: - name: nfs-share + name: media-nfs-pv spec: capacity: storage: 1Ti accessModes: - ReadWriteMany + persistentVolumeReclaimPolicy: Retain + storageClassName: "" nfs: - server: nas.your-tailnet.ts.net - path: /volume1/k8s + server: nas # Tailscale MagicDNS hostname + path: /volume1/media +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: media-nfs-pvc +spec: + accessModes: + - ReadWriteMany + storageClassName: "" + volumeName: media-nfs-pv + resources: + requests: + storage: 1Ti ``` +Key details: +- `storageClassName: ""` ensures static binding (not dynamic provisioning) +- `volumeName` in the PVC binds it to the specific PV +- `Retain` reclaim policy prevents accidental data loss +- Use the NAS's Tailscale hostname, not an IP address + ## What You Now Have - A Kubernetes cluster running on your server @@ -152,7 +175,7 @@ spec: - [[argocd-config|Configure ArgoCD]] - GitOps deployments - Install essential addons (ingress controller, cert-manager) -## BluemeOps Specifics +## BlumeOps Specifics BlumeOps' cluster configuration includes: - Tailscale operator for automatic ingress