<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Kubernetes on Minoko Labs</title><link>https://minoko.life/tags/kubernetes/</link><description>Recent content in Kubernetes on Minoko Labs</description><generator>Hugo -- 0.154.0</generator><language>en-us</language><lastBuildDate>Tue, 27 Jan 2026 12:00:00 +0000</lastBuildDate><atom:link href="https://minoko.life/tags/kubernetes/index.xml" rel="self" type="application/rss+xml"/><item><title>Mochi: An Algorithmic Trading Backtest Platform on Kubernetes</title><link>https://minoko.life/posts/mochi-backtest-architecture/</link><pubDate>Tue, 27 Jan 2026 12:00:00 +0000</pubDate><guid>https://minoko.life/posts/mochi-backtest-architecture/</guid><description>Architecture of a multi-language backtest pipeline using Argo Workflows, Trino, MinIO, and a React dashboard on a homelab Kubernetes cluster</description></item><item><title>Kubernetes Local PVs and Symlinks Do Not Mix</title><link>https://minoko.life/posts/kubernetes-local-pv-symlink/</link><pubDate>Mon, 26 Jan 2026 20:00:00 +0100</pubDate><guid>https://minoko.life/posts/kubernetes-local-pv-symlink/</guid><description>Why Kubernetes local persistent volumes fail to mount when the hostPath is a symlink, and how to fix it with bind mounts.</description></item><item><title>Avoiding Stale Builds with Kaniko and Container Registry Caching</title><link>https://minoko.life/posts/kaniko-cache-stale-builds/</link><pubDate>Sun, 18 Jan 2026 14:00:00 +0000</pubDate><guid>https://minoko.life/posts/kaniko-cache-stale-builds/</guid><description>Debug and fix stale container builds caused by Kaniko layer caching and Kubernetes node image caching when using mutable tags like latest.</description></item><item><title>Clean URLs with NGINX Ingress Redirects</title><link>https://minoko.life/posts/nginx-ingress-path-redirect/</link><pubDate>Sun, 18 Jan 2026 12:50:00 +0000</pubDate><guid>https://minoko.life/posts/nginx-ingress-path-redirect/</guid><description>Use a separate Ingress with permanent-redirect annotation to create clean URL redirects when configuration snippets are disabled.</description></item><item><title>VLAN Traffic Separation with MikroTik and OPNsense</title><link>https://minoko.life/posts/vlan-traffic-separation-mikrotik-opnsense/</link><pubDate>Fri, 09 Jan 2026 21:12:46 +0000</pubDate><guid>https://minoko.life/posts/vlan-traffic-separation-mikrotik-opnsense/</guid><description>Configure VLAN separation on a MikroTik CRS310 switch with OPNsense to isolate Kubernetes traffic from bulk data transfers on a dual-homed node.</description></item><item><title>Configuring Alertmanager Slack Notifications with kube-prometheus-stack</title><link>https://minoko.life/posts/alertmanager-slack-notifications/</link><pubDate>Sun, 04 Jan 2026 00:55:04 +0000</pubDate><guid>https://minoko.life/posts/alertmanager-slack-notifications/</guid><description>Setting up Prometheus Alertmanager to send notifications to Slack, including gotchas with Prometheus operator compatibility and Linkerd sidecar injection.</description></item><item><title>Adding NetworkPolicies for Defense-in-Depth with Linkerd</title><link>https://minoko.life/posts/networkpolicy-defense-in-depth/</link><pubDate>Sat, 03 Jan 2026 23:49:47 +0000</pubDate><guid>https://minoko.life/posts/networkpolicy-defense-in-depth/</guid><description>Implementing Kubernetes NetworkPolicies alongside Linkerd mTLS to restrict pod-to-pod communication in critical namespaces.</description></item><item><title>In-Cluster GitLab Runner with Kubernetes Executor</title><link>https://minoko.life/posts/in-cluster-gitlab-runner-kubernetes/</link><pubDate>Sat, 03 Jan 2026 20:51:28 +0000</pubDate><guid>https://minoko.life/posts/in-cluster-gitlab-runner-kubernetes/</guid><description>Deploy a GitLab Runner inside your Kubernetes cluster using the Kubernetes executor. CI jobs spawn as pods, use Kaniko for rootless Docker builds, and cache dependencies in MinIO.</description></item><item><title>Building a GPU-Accelerated RAG System for Gold Market Intelligence</title><link>https://minoko.life/posts/gold-intelligence-rag-system/</link><pubDate>Sat, 03 Jan 2026 20:48:34 +0000</pubDate><guid>https://minoko.life/posts/gold-intelligence-rag-system/</guid><description>&lt;p&gt;This post documents the implementation of a Retrieval-Augmented Generation (RAG) system for gold market intelligence, running entirely on a homelab Kubernetes cluster with GPU acceleration.&lt;/p&gt;
&lt;h2 id="the-goal"&gt;The Goal&lt;/h2&gt;
&lt;p&gt;Build a self-hosted AI system that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ingests gold market data from multiple sources (FRED, GoldAPI, RSS feeds)&lt;/li&gt;
&lt;li&gt;Stores embeddings in a vector database&lt;/li&gt;
&lt;li&gt;Provides natural language query capabilities using a local LLM&lt;/li&gt;
&lt;li&gt;Runs on an NVIDIA RTX 5070 Ti GPU&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="architecture"&gt;Architecture&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
│ Data Ingestion │───▶│ Embedding Service │───▶│ Qdrant │
│ (CronJobs) │ │ (nomic-embed-text) │ │ (Vector Store) │
└─────────────────────┘ └─────────────────────┘ └──────────┬──────────┘
│
┌─────────────────────┐ ┌─────────────────────┐ │
│ Query Service │◀───│ Ollama │◀──────────────┘
│ (RAG API + UI) │ │ (Llama 3.1 8B) │
└─────────────────────┘ └─────────────────────┘
│ │
│ ┌──────┴──────┐
▼ │ RTX 5070 Ti │
Web UI @ :80 │ (16GB) │
└─────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="components"&gt;Components&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Image&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ollama&lt;/td&gt;
&lt;td&gt;LLM inference (Llama 3.1 8B) + embeddings (nomic-embed-text)&lt;/td&gt;
&lt;td&gt;ollama/ollama&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qdrant&lt;/td&gt;
&lt;td&gt;Vector database for storing embeddings&lt;/td&gt;
&lt;td&gt;qdrant/qdrant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Ingestion&lt;/td&gt;
&lt;td&gt;CronJobs fetching from FRED, GoldAPI, RSS&lt;/td&gt;
&lt;td&gt;Custom Python/FastAPI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embedding Service&lt;/td&gt;
&lt;td&gt;Converts text to vectors, stores in Qdrant&lt;/td&gt;
&lt;td&gt;Custom Python/FastAPI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Query Service&lt;/td&gt;
&lt;td&gt;RAG pipeline + web UI&lt;/td&gt;
&lt;td&gt;Custom Python/FastAPI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="data-sources"&gt;Data Sources&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Data&lt;/th&gt;
&lt;th&gt;Schedule&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FRED&lt;/td&gt;
&lt;td&gt;Gold price history, CPI, Fed Funds Rate, 10Y Treasury, USD Index&lt;/td&gt;
&lt;td&gt;Every 6 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GoldAPI.io&lt;/td&gt;
&lt;td&gt;Real-time XAU/USD spot price&lt;/td&gt;
&lt;td&gt;Hourly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RSS Feeds&lt;/td&gt;
&lt;td&gt;Market news from Investing.com&lt;/td&gt;
&lt;td&gt;Every 4 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="implementation"&gt;Implementation&lt;/h2&gt;
&lt;h3 id="repository-structure"&gt;Repository Structure&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gold-intelligence/
├── .gitlab-ci.yml
├── services/
│ ├── data-ingestion/
│ │ ├── Dockerfile
│ │ ├── requirements.txt
│ │ └── src/
│ │ ├── main.py
│ │ └── collectors/
│ │ ├── fred.py
│ │ ├── gold_api.py
│ │ └── news_rss.py
│ ├── embedding-service/
│ │ ├── Dockerfile
│ │ ├── requirements.txt
│ │ └── src/
│ │ ├── main.py
│ │ ├── embedder.py
│ │ └── qdrant_client.py
│ └── query-service/
│ ├── Dockerfile
│ ├── requirements.txt
│ └── src/
│ ├── main.py
│ ├── rag_pipeline.py
│ ├── ollama_client.py
│ └── static/ # Web UI
├── helm/
│ ├── data-ingestion/
│ ├── embedding-service/
│ ├── query-service/
│ ├── ollama-values.yaml
│ └── qdrant-values.yaml
└── kubernetes/
└── argocd/
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="ollama-configuration"&gt;Ollama Configuration&lt;/h3&gt;
&lt;p&gt;The key to GPU acceleration is the &lt;code&gt;runtimeClassName: nvidia&lt;/code&gt; in the Helm values:&lt;/p&gt;</description></item><item><title>Enabling HTTPS on Wiki.js with Let's Encrypt via OPNsense</title><link>https://minoko.life/posts/wikijs-https-letsencrypt/</link><pubDate>Sat, 03 Jan 2026 19:49:58 +0000</pubDate><guid>https://minoko.life/posts/wikijs-https-letsencrypt/</guid><description>Migrate Wiki.js from HTTP to HTTPS using a Let&amp;#39;s Encrypt wildcard certificate managed by OPNsense, with automatic synchronization to Kubernetes via a CronJob.</description></item><item><title>Adding Comments with Comentario: Self-Hosted PostgreSQL-Backed Comments</title><link>https://minoko.life/posts/adding-comments-with-comentario/</link><pubDate>Sat, 03 Jan 2026 12:00:00 +0000</pubDate><guid>https://minoko.life/posts/adding-comments-with-comentario/</guid><description>Deploy Comentario as a self-hosted PostgreSQL-backed comment system for Hugo blogs, with GitHub OAuth, custom theming, and HAProxy TLS termination.</description></item><item><title>Exposing an NVIDIA RTX 5070 Ti GPU in Kubernetes with Time-Slicing</title><link>https://minoko.life/posts/nvidia-gpu-kubernetes-blackwell/</link><pubDate>Fri, 02 Jan 2026 23:00:00 +0000</pubDate><guid>https://minoko.life/posts/nvidia-gpu-kubernetes-blackwell/</guid><description>Expose an NVIDIA RTX 5070 Ti Blackwell GPU in Kubernetes with time-slicing support, including PyTorch compatibility requirements for sm_120 compute capability.</description></item><item><title>OPNsense IDS Monitoring with Suricata, Loki, and Grafana</title><link>https://minoko.life/posts/opnsense-ids-monitoring-with-loki/</link><pubDate>Thu, 01 Jan 2026 23:30:00 +0000</pubDate><guid>https://minoko.life/posts/opnsense-ids-monitoring-with-loki/</guid><description>Forward OPNsense Suricata IDS alerts to Loki via syslog and visualize intrusion detection events in Grafana alongside firewall logs.</description></item><item><title>Automatic Certificate Rotation with cert-manager and Linkerd</title><link>https://minoko.life/posts/cert-manager-linkerd-rotation/</link><pubDate>Thu, 01 Jan 2026 12:00:00 +0000</pubDate><guid>https://minoko.life/posts/cert-manager-linkerd-rotation/</guid><description>Automate Linkerd identity issuer certificate rotation using cert-manager, with a CronJob to sync secret formats and Prometheus alerts for expiry warnings.</description></item><item><title>Enabling CPU and Memory Stats in k9s on Bare-Metal Kubernetes</title><link>https://minoko.life/posts/k9s-cpu-memory-metrics/</link><pubDate>Thu, 01 Jan 2026 10:00:00 +0000</pubDate><guid>https://minoko.life/posts/k9s-cpu-memory-metrics/</guid><description>Enable CPU and memory metrics in k9s on bare-metal kubeadm clusters by installing metrics-server with the required kubelet TLS configuration.</description></item><item><title>GitOps Blog Deployment with ArgoCD and Automatic Image Updates</title><link>https://minoko.life/posts/gitops-blog-deployment-with-argocd/</link><pubDate>Mon, 29 Dec 2025 19:00:00 +0000</pubDate><guid>https://minoko.life/posts/gitops-blog-deployment-with-argocd/</guid><description>Set up a fully automated blog deployment pipeline using ArgoCD and Image Updater, where pushing to main automatically builds, detects, and deploys new container images to Kubernetes.</description></item><item><title>Configuring OPNsense Firewall Rules via API for Cross-VLAN Kubernetes</title><link>https://minoko.life/posts/opnsense-api-kubernetes-firewall/</link><pubDate>Sun, 28 Dec 2025 21:14:00 +0000</pubDate><guid>https://minoko.life/posts/opnsense-api-kubernetes-firewall/</guid><description>Configure OPNsense firewall rules via REST API to allow Kubernetes traffic between VLANs, including firewall rules, node preparation, and HAProxy backend updates for a cross-network cluster.</description></item><item><title>Why You Need --disable-eviction for Homelab Kubernetes Node Drains</title><link>https://minoko.life/posts/disable-eviction-node-drains/</link><pubDate>Sun, 28 Dec 2025 21:00:00 +0000</pubDate><guid>https://minoko.life/posts/disable-eviction-node-drains/</guid><description>Solve PodDisruptionBudget deadlocks in homelab Kubernetes clusters by using --disable-eviction during node drains when running single-replica workloads.</description></item><item><title>Why Your Kubernetes Control Plane Has a NoSchedule Taint</title><link>https://minoko.life/posts/control-plane-taint/</link><pubDate>Sun, 28 Dec 2025 13:00:00 +0000</pubDate><guid>https://minoko.life/posts/control-plane-taint/</guid><description>Understand why Kubernetes control plane nodes have a NoSchedule taint and when you should (or shouldn&amp;#39;t) remove it to run workloads on control plane nodes.</description></item><item><title>Backing Up etcd to MinIO with a Kubernetes CronJob</title><link>https://minoko.life/posts/backing-up-etcd-to-minio/</link><pubDate>Sun, 28 Dec 2025 12:00:00 +0000</pubDate><guid>https://minoko.life/posts/backing-up-etcd-to-minio/</guid><description>Create automated daily etcd backups using a Kubernetes CronJob that snapshots cluster state and uploads to MinIO with automatic retention management.</description></item><item><title>Upgrading Kubernetes with Ansible: A Homelab Guide</title><link>https://minoko.life/posts/upgrading-kubernetes-with-ansible/</link><pubDate>Sat, 27 Dec 2025 20:00:00 +0000</pubDate><guid>https://minoko.life/posts/upgrading-kubernetes-with-ansible/</guid><description>Automate Kubernetes cluster upgrades with Ansible playbooks that handle etcd backups, version validation, serial worker upgrades, and health verification.</description></item><item><title>Backing Up Kubernetes Data to Scaleway Object Storage</title><link>https://minoko.life/posts/backup-minio-to-scaleway/</link><pubDate>Sat, 27 Dec 2025 18:00:00 +0000</pubDate><guid>https://minoko.life/posts/backup-minio-to-scaleway/</guid><description>Set up offsite cloud backups for Kubernetes databases using MinIO mirror and Scaleway Object Storage, with scheduled sync via CronJob and automatic retention.</description></item></channel></rss>