<?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>Allen Ziegenfus</title><link>https://allenz.net/</link><description>Recent content on Allen Ziegenfus</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 03 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://allenz.net/index.xml" rel="self" type="application/rss+xml"/><item><title>Retrospectives: an opportunity for double-loop learning</title><link>https://allenz.net/writing/retrospectives-are-double-loop-learning/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate><guid>https://allenz.net/writing/retrospectives-are-double-loop-learning/</guid><description>Most of a team&amp;rsquo;s week is single-loop — execute the process, close the ticket. The retrospective is the one ritual that questions the process itself, and what quietly breaks when a team skips it.</description></item><item><title>What is code review actually for?</title><link>https://allenz.net/writing/what-code-review-is-actually-for/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate><guid>https://allenz.net/writing/what-code-review-is-actually-for/</guid><description>The mandatory, blocking PR gate is barely fifteen years old — and the research says review&amp;rsquo;s value diverges from its justification. What code review is actually for, and why most of its jobs are better served elsewhere.</description></item><item><title>StatefulSet vs Deployment for stateless-with-fragile-upgrade workloads</title><link>https://allenz.net/writing/statefulset-vs-deployment-for-stateless-with-fragile-upgrade-workloads/</link><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate><guid>https://allenz.net/writing/statefulset-vs-deployment-for-stateless-with-fragile-upgrade-workloads/</guid><description>A decision record for a workload that&amp;rsquo;s operationally stateless but has a fragile single-instance upgrade: StatefulSet vs Deployment, with live operational evidence and the case for Deployment plus a startup lock.</description></item><item><title>When Go templates outgrow you: a typed-language alternative for Crossplane compositions</title><link>https://allenz.net/writing/when-go-templates-outgrow-you-a-typed-language-alternative-for-crossplane-compositions/</link><pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate><guid>https://allenz.net/writing/when-go-templates-outgrow-you-a-typed-language-alternative-for-crossplane-compositions/</guid><description>When Crossplane&amp;rsquo;s Go-template compositions outgrow you — no types, no tests, global scope — KCL offers a typed, testable alternative. The multi-step pipeline architecture, and the bugs only end-to-end validation catches.</description></item><item><title>Environment-stable table ownership: surviving cross-environment restore with IAM database auth</title><link>https://allenz.net/writing/environment-stable-table-ownership-surviving-cross-environment-restore-with-iam-database-auth/</link><pubDate>Sat, 16 May 2026 00:00:00 +0000</pubDate><guid>https://allenz.net/writing/environment-stable-table-ownership-surviving-cross-environment-restore-with-iam-database-auth/</guid><description>Cloud SQL IAM database auth breaks cross-environment restores because table ownership encodes a per-environment service account. Make ownership environment-independent by owning every table as cloudsqlsuperuser.</description></item><item><title>Stable vs. rewritten identity: cross-environment database restore in a stateful platform</title><link>https://allenz.net/writing/stable-vs.-rewritten-identity-cross-environment-database-restore-in-a-stateful-platform/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><guid>https://allenz.net/writing/stable-vs.-rewritten-identity-cross-environment-database-restore-in-a-stateful-platform/</guid><description>When a platform bakes an environment-derived identity into its database on first boot, restoring across environments crash-loops on a mismatch. The fix is a product question: stabilize the identity, or rewrite it after restore?</description></item><item><title>Test your guardrails: policy-as-code that you actually verify</title><link>https://allenz.net/writing/test-your-guardrails-policy-as-code-that-you-actually-verify/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://allenz.net/writing/test-your-guardrails-policy-as-code-that-you-actually-verify/</guid><description>Policy-as-code that&amp;rsquo;s never tested usually fails open — it waves violations through and no one notices. How to test guardrails so they both deny when they must and pass when they must.</description></item><item><title>The admin stack that manages itself: bootstrapping a self-hosted IaC control plane</title><link>https://allenz.net/writing/the-admin-stack-that-manages-itself-bootstrapping-a-self-hosted-iac-control-plane/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://allenz.net/writing/the-admin-stack-that-manages-itself-bootstrapping-a-self-hosted-iac-control-plane/</guid><description>If your IaC orchestrator is itself configured as code, you need an admin stack that provisions every stack — including itself. The elegant pattern, and the two bootstrap problems no amount of declarative code removes.</description></item><item><title>When Terraform owns a shared resource as if it were dedicated</title><link>https://allenz.net/writing/when-terraform-owns-a-shared-resource-as-if-it-were-dedicated/</link><pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate><guid>https://allenz.net/writing/when-terraform-owns-a-shared-resource-as-if-it-were-dedicated/</guid><description>When a per-cluster Terraform module owns a project-global, shared resource, tearing down one cluster quietly breaks the others. Why resources with different lifecycles can&amp;rsquo;t share state — and the bootstrap-module fix.</description></item><item><title>Tearing down a managed-Kubernetes deployment without leaving a tail</title><link>https://allenz.net/writing/tearing-down-a-managed-kubernetes-deployment-without-leaving-a-tail/</link><pubDate>Tue, 28 Apr 2026 00:00:00 +0000</pubDate><guid>https://allenz.net/writing/tearing-down-a-managed-kubernetes-deployment-without-leaving-a-tail/</guid><description>A field guide to deleting a GKE or EKS deployment cleanly when the cluster, the in-cluster GitOps/Crossplane layer, and Terraform all disagree about who owns cleanup — orphans, deletion order, and the stuck cases.</description></item><item><title>Applying Terraform from CI is a stateful problem wearing a stateless tool</title><link>https://allenz.net/writing/applying-terraform-from-ci-is-a-stateful-problem-wearing-a-stateless-tool/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><guid>https://allenz.net/writing/applying-terraform-from-ci-is-a-stateful-problem-wearing-a-stateless-tool/</guid><description>GitHub Actions is a near-perfect stateless task runner — and a poor fit for applying Terraform, which is stateful, collaborative, and approval-gated. The practical case, from running it both ways.</description></item><item><title>Structured JSON logging for a legacy Java app on Kubernetes — without forking the image</title><link>https://allenz.net/writing/structured-json-logging-for-a-legacy-java-app-on-kubernetes-without-forking-the-image/</link><pubDate>Wed, 22 Apr 2026 00:00:00 +0000</pubDate><guid>https://allenz.net/writing/structured-json-logging-for-a-legacy-java-app-on-kubernetes-without-forking-the-image/</guid><description>How to retrofit machine-parseable JSON logging onto a legacy Java app on Kubernetes — both log4j2 and Tomcat&amp;rsquo;s JUL — without forking the vendor image, as an opt-in, fail-open, cleanly revertible layer.</description></item><item><title>Use GKE Connect Gateway to protect your private control plane</title><link>https://allenz.net/writing/use-gke-connect-gateway-to-protect-your-private-control-plane/</link><pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate><guid>https://allenz.net/writing/use-gke-connect-gateway-to-protect-your-private-control-plane/</guid><description>Reach a private GKE cluster&amp;rsquo;s API server without a bastion or authorized-networks — using the GKE-native Connect Gateway, with GCP IAM outside the gateway and Kubernetes RBAC inside.</description></item><item><title>The Crossplane Object that synced green and changed nothing</title><link>https://allenz.net/writing/the-crossplane-object-that-synced-green-and-changed-nothing/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><guid>https://allenz.net/writing/the-crossplane-object-that-synced-green-and-changed-nothing/</guid><description>Everything&amp;rsquo;s green — Argo CD Synced, Crossplane Ready — but the change never took effect. The trap where Crossplane management policies without Update meet Kubernetes immutability.</description></item><item><title>Why deleting an env var from your GitOps values doesn't remove it from the pod</title><link>https://allenz.net/writing/why-deleting-an-env-var-from-your-gitops-values-doesnt-remove-it-from-the-pod/</link><pubDate>Thu, 09 Apr 2026 00:00:00 +0000</pubDate><guid>https://allenz.net/writing/why-deleting-an-env-var-from-your-gitops-values-doesnt-remove-it-from-the-pod/</guid><description>You delete an env var from your Helm values, Argo CD reports Synced — and it&amp;rsquo;s still on the pod. Why strategic-merge-patch can&amp;rsquo;t remove list items, and the Server-Side Apply fix.</description></item><item><title>One GitHub App, two auth models: repo credentials, webhooks, and SSO for Argo CD</title><link>https://allenz.net/writing/one-github-app-two-auth-models-repo-credentials-webhooks-and-sso-for-argo-cd/</link><pubDate>Fri, 20 Mar 2026 00:00:00 +0000</pubDate><guid>https://allenz.net/writing/one-github-app-two-auth-models-repo-credentials-webhooks-and-sso-for-argo-cd/</guid><description>Argo CD needs three different things from GitHub — repo reads, webhook delivery, and human SSO. How a single GitHub App covers all three with short-lived installation tokens instead of a leak-prone PAT.</description></item><item><title>A clone-and-go installer: GCP Cloud Shell tutorials + Infrastructure Manager</title><link>https://allenz.net/writing/a-clone-and-go-installer-gcp-cloud-shell-tutorials--infrastructure-manager/</link><pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate><guid>https://allenz.net/writing/a-clone-and-go-installer-gcp-cloud-shell-tutorials--infrastructure-manager/</guid><description>Turning a many-step platform install — APIs, IAM, Terraform, state, secrets — into a browser-only, guided, clone-and-go onboarding with GCP Cloud Shell tutorials and Infrastructure Manager.</description></item><item><title>About</title><link>https://allenz.net/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://allenz.net/about/</guid><description>&lt;figure class="avatar"&gt;
&lt;img loading="lazy" src="https://allenz.net/profile.jpg"
alt="Allen Ziegenfus" width="150"/&gt;
&lt;/figure&gt;
&lt;p&gt;A software engineer whose career spans application development and, in recent years, cloud-native platform engineering. I build and operate Kubernetes platforms on GCP — Terraform, Argo CD, Helm, GitOps — and bring a long software-engineering background to the infrastructure underneath them. I work &lt;strong&gt;system-first and for low entropy&lt;/strong&gt;: designing for the whole system&amp;rsquo;s behavior over time, and keeping it predictable, reversible, and self-evident to operate.&lt;/p&gt;
&lt;h2 id="selected-experience"&gt;Selected experience&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Senior Software Engineer&lt;/strong&gt; · Liferay · &lt;em&gt;2025–present&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>