{"@attributes":{"version":"2.0"},"channel":{"title":"Jacob Colvin","link":"https:\/\/jacobcolvin.com\/","description":"Jacob Colvin is a Lead Software Engineer working on developer platforms and infrastructure, writing about Kubernetes, observability, and open source.","generator":"Hugo","language":"en-us","copyright":"<a href=\"https:\/\/creativecommons.org\/licenses\/by-nc\/4.0\/\" target=\"_blank\" rel=\"noopener\">CC BY-NC 4.0<\/a>","lastBuildDate":"Sun, 13 Jul 2025 00:00:00 +0000","item":[{"title":"Introducing kat: A TUI and rule-based rendering engine for Kubernetes manifests","link":"https:\/\/jacobcolvin.com\/posts\/2025\/07\/introducing-kat-a-tui-and-rule-based-rendering-engine-for-kubernetes-manifests\/","pubDate":"Sun, 13 Jul 2025 00:00:00 +0000","guid":"https:\/\/jacobcolvin.com\/posts\/2025\/07\/introducing-kat-a-tui-and-rule-based-rendering-engine-for-kubernetes-manifests\/","description":"<p>I don&rsquo;t know about you, but one of my favorite tools in the Kubernetes ecosystem is <a href=\"https:\/\/k9scli.io\/\"><code>k9s<\/code><\/a>. It&rsquo;s a terminal UI (TUI) for interacting with your Kubernetes clusters, and at work I have it open pretty much all of the time. After I started using it, I felt like my productivity skyrocketed, since anything you could want is just a few keystrokes away.<\/p>\n<p>However, when it comes to rendering and validating manifests locally, I found myself frustrated with the existing tools (or lack thereof). For me, I found that working with manifest generators like <code>helm<\/code> or <code>kustomize<\/code> often involved a repetitive cycle:<\/p>"},{"title":"Linkerd Multi-cluster Without a Public IP Address","link":"https:\/\/jacobcolvin.com\/posts\/2023\/04\/linkerd-multi-cluster-without-a-public-ip-address\/","pubDate":"Mon, 03 Apr 2023 00:00:00 +0000","guid":"https:\/\/jacobcolvin.com\/posts\/2023\/04\/linkerd-multi-cluster-without-a-public-ip-address\/","description":"<p>Recently, I&rsquo;ve set up <a href=\"https:\/\/github.com\/linkerd\/linkerd2\">Linkerd<\/a> in my homelab, and one of\nthe features I was really interested in was <a href=\"https:\/\/linkerd.io\/2.12\/tasks\/multicluster\/\">multi-cluster communication<\/a>.\nThis allows you to mirror services between clusters. Meaning, apps in one\ncluster can communicate with services in another cluster, as if they were in the\nsame cluster.<\/p>\n<p>Setting up multi-cluster communication with Linkerd is straightforward under\nideal conditions. However, it can be more challenging if one of the clusters\ncannot create services of type <code>LoadBalancer<\/code> (with a public, or otherwise\nroutable IP address). This is the case for me, as I have clusters both at home\nand in Hetzner, with my home Kubernetes cluster running behind NAT.<\/p>"},{"title":"Building a Twin-ITX Cluster","link":"https:\/\/jacobcolvin.com\/posts\/2023\/04\/building-a-twin-itx-cluster\/","pubDate":"Sun, 02 Apr 2023 00:00:00 +0000","guid":"https:\/\/jacobcolvin.com\/posts\/2023\/04\/building-a-twin-itx-cluster\/","description":"<p>I am building a cluster that includes a <a href=\"https:\/\/turingpi.com\/\">Turing Pi<\/a> (a\nmini-ITX cluster board), alongside a normal mini-ITX system. I wanted to put\nboth of these in a single chassis to save space, which is possible with a &ldquo;dual\nmini-itx&rdquo;, or &ldquo;twin-itx&rdquo; chassis. This article covers most of the chassis I\ndiscovered.<\/p>\n<p>As of writing, I have made a purchase (I went with the MyElectronics chassis).<\/p>\n<h2 id=\"1u\">1U<\/h2>\n<p>1U chassis will not fit a Turing Pi. So, I did not evaluate these.<\/p>"},{"title":"Backups for K8s and Beyond","link":"https:\/\/jacobcolvin.com\/posts\/2023\/01\/backups-for-k8s-and-beyond\/","pubDate":"Thu, 05 Jan 2023 00:00:00 +0000","guid":"https:\/\/jacobcolvin.com\/posts\/2023\/01\/backups-for-k8s-and-beyond\/","description":"<h2 id=\"intro\">Intro<\/h2>\n<p>Recently I have been moving my <a href=\"https:\/\/github.com\/MacroPower\/homelab\">homelab<\/a> to Kubernetes. This has\npresented the need for a backup solution for any persistent data I might have\nthere. For quite some time, I have been using <a href=\"https:\/\/github.com\/duplicati\/duplicati\">Duplicati<\/a> for my\nbackups, but I haven&rsquo;t been completely content with its performance, and have\nheard many horror stories of restores not working properly. So, I wanted to take\nthis opportunity to find a backup solution that worked well for my personal\ncomputers (I have Windows, Linux, and Darwin hosts), my storage servers (UnRaid\nand FreeNAS), as well as Kubernetes. Assuming that such a solution exists, of\ncourse!<\/p>"},{"title":"How to use Grafana and Prometheus to Rickroll your friends (or enemies)","link":"https:\/\/jacobcolvin.com\/posts\/2021\/07\/how-to-use-grafana-and-prometheus-to-rickroll-your-friends-or-enemies\/","pubDate":"Fri, 30 Jul 2021 00:00:00 +0000","guid":"https:\/\/jacobcolvin.com\/posts\/2021\/07\/how-to-use-grafana-and-prometheus-to-rickroll-your-friends-or-enemies\/","description":"<p>Source code: <a href=\"https:\/\/github.com\/MacroPower\/prometheus_video_renderer\">https:\/\/github.com\/MacroPower\/prometheus_video_renderer<\/a><\/p>\n<p>Read the blog post: <a href=\"https:\/\/grafana.com\/blog\/2021\/07\/30\/how-to-use-grafana-and-prometheus-to-rickroll-your-friends-or-enemies\/\">https:\/\/grafana.com\/blog\/2021\/07\/30\/how-to-use-grafana-and-prometheus-to-rickroll-your-friends-or-enemies\/<\/a><\/p>\n<div style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;\">\n <iframe allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen\" loading=\"eager\" referrerpolicy=\"strict-origin-when-cross-origin\" src=\"https:\/\/www.youtube.com\/embed\/aLvh0oId3Go?autoplay=1&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=1&amp;start=0\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;\" title=\"YouTube video\"><\/iframe>\n <\/div>"},{"title":"HTB Challenge - Reversing - Baby RE","link":"https:\/\/jacobcolvin.com\/posts\/2020\/10\/htb-challenge-reversing-baby-re\/","pubDate":"Sat, 24 Oct 2020 00:00:00 +0000","guid":"https:\/\/jacobcolvin.com\/posts\/2020\/10\/htb-challenge-reversing-baby-re\/","description":"<p>We can start off by running <a href=\"https:\/\/man7.org\/linux\/man-pages\/man1\/ltrace.1.html\">ltrace<\/a>, which runs a command and intercepts dynamic library &amp; sys calls.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-bash\" data-lang=\"bash\"><span style=\"display:flex;\"><span>ltrace -i -C .\/baby\n<\/span><\/span><\/code><\/pre><\/div><p>We&rsquo;re prompted and can start off by inserting random value, e.g. <code>asd<\/code>.<\/p>\n<p>A call to <code>strcmp<\/code> is intercepted by <code>ltrace<\/code>.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-c++\" data-lang=\"c++\"><span style=\"display:flex;\"><span>strcmp(<span style=\"color:#e6db74\">&#34;asd<\/span><span style=\"color:#ae81ff\">\\n<\/span><span style=\"color:#e6db74\">&#34;<\/span>, <span style=\"color:#e6db74\">&#34;ab[REDACTED]13<\/span><span style=\"color:#ae81ff\">\\n<\/span><span style=\"color:#e6db74\">&#34;<\/span>)\n<\/span><\/span><\/code><\/pre><\/div><p>Let&rsquo;s start by trying to pass <code>ab[REDACTED]13<\/code>.<\/p>\n<p>In this case it was just that simple, and we receive the flag.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"><code class=\"language-text\" data-lang=\"text\"><span style=\"display:flex;\"><span>HTB{B[REDACTED]Z}\n<\/span><\/span><\/code><\/pre><\/div><p>There were probably a lot of additional ways this one could have been solved, and I think I got lucky by starting in this direction.<\/p>"}]}}