<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kestrion</title>
    <description>The latest articles on DEV Community by Kestrion (@kestrion).</description>
    <link>https://dev.to/kestrion</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4076790%2Fa73d6b49-26ae-4550-b348-aea995027922.png</url>
      <title>DEV Community: Kestrion</title>
      <link>https://dev.to/kestrion</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kestrion"/>
    <language>en</language>
    <item>
      <title>The Kubernetes Checklist for Teams Without a Platform Team</title>
      <dc:creator>Kestrion</dc:creator>
      <pubDate>Thu, 13 Aug 2026 21:24:54 +0000</pubDate>
      <link>https://dev.to/kestrion/the-kubernetes-checklist-for-teams-without-a-platform-team-1ian</link>
      <guid>https://dev.to/kestrion/the-kubernetes-checklist-for-teams-without-a-platform-team-1ian</guid>
      <description>&lt;p&gt;Most Kubernetes advice assumes you have a platform team: specialists who own upgrades, ingress, security policies, and the 2 a.m. pages.&lt;/p&gt;

&lt;p&gt;The teams I am writing for usually have three to ten engineers, one of whom “knows Kubernetes,” and no dedicated platform team. They depend on a cluster that nobody fully owns.&lt;/p&gt;

&lt;p&gt;I work in enterprise environments where platform teams are large and everything is process. This article is the opposite exercise: what is the &lt;em&gt;minimum&lt;/em&gt; discipline a small team needs to run Kubernetes in production—and what enterprise baggage should it refuse to copy?&lt;/p&gt;

&lt;h2&gt;
  
  
  The question that matters more than any tool
&lt;/h2&gt;

&lt;p&gt;Before any checklist: &lt;strong&gt;who owns the platform after the migration is finished?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not “who set it up.” Who owns upgrades next year, certificate renewals, the CNI version, and deprecated APIs?&lt;/p&gt;

&lt;p&gt;If the answer is one person's name, you do not have a platform. You have key-person risk with YAML on top. If the answer is “nobody, really,” Kubernetes is invisible operational debt accumulating interest.&lt;/p&gt;

&lt;p&gt;The rest of this checklist exists to make that ownership small enough for a small team to carry.&lt;/p&gt;

&lt;p&gt;For each item, score 0 if it does not exist, 1 if it exists but is informal or untested, and 2 if it is documented and tested. The purpose is not to produce a flattering number. It is to expose the next few conversations the team needs to have.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Deployments: Git is the source of truth
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Treat Git as the source of truth for workloads and cluster configuration, including temporary fixes.&lt;/li&gt;
&lt;li&gt;Use one reconciliation path—for example, Argo CD or Flux—so production changes are reviewed and reproducible. Keep emergency access, but reconcile every emergency change back into Git.&lt;/li&gt;
&lt;li&gt;Define and test a rollback path for every service. A Git revert is useful only if your delivery process can deploy it safely.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This converts your cluster from a mystery into a diff. Every other practice gets easier once “what is running?” has an answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The rollout basics that prevent late-night incidents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Readiness probes that answer one question: can this pod serve traffic now? Include a dependency only when the application genuinely cannot serve a useful response without it.&lt;/li&gt;
&lt;li&gt;Graceful termination: handle SIGTERM and allow in-flight requests to drain. Add a short &lt;code&gt;preStop&lt;/code&gt; delay only when your routing path needs time to stop sending new traffic, then test the behavior under load.&lt;/li&gt;
&lt;li&gt;Resource requests based on measured usage so scheduling and capacity planning reflect reality. Add limits deliberately; the right choice differs for CPU, memory, and workload behavior.&lt;/li&gt;
&lt;li&gt;PodDisruptionBudgets for replicated workloads that must remain available during voluntary disruptions such as node drains. Size them from the replica count and failure tolerance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Security: the boring baseline, not the service mesh
&lt;/h2&gt;

&lt;p&gt;Small teams can over-index on advanced security machinery while skipping basics that matter in a customer security review:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RBAC scoped per human and per workload. Nobody uses &lt;code&gt;cluster-admin&lt;/code&gt; for daily work.&lt;/li&gt;
&lt;li&gt;Secrets via External Secrets Operator, Vault, or SOPS. Never store plaintext secrets in Git, and check who can run &lt;code&gt;kubectl get secret&lt;/code&gt; in shared namespaces.&lt;/li&gt;
&lt;li&gt;Admission policy: block &lt;code&gt;:latest&lt;/code&gt;, block privileged workloads, and require resource requests. Kyverno is one approachable option.&lt;/li&gt;
&lt;li&gt;NetworkPolicies around sensitive namespaces and workloads, starting with the traffic paths you actually understand.&lt;/li&gt;
&lt;li&gt;Restrict control-plane access to the networks and identities that need it; use the private-endpoint options of your managed provider where they fit your operating model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a stronger starting point than adding advanced machinery while basic access and secret handling remain unclear.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Observability: answers, not data
&lt;/h2&gt;

&lt;p&gt;You do not need every log, metric, and trace. You need to answer three questions quickly: is it broken, where, and since when?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prometheus—or a managed equivalent—plus golden-signal dashboards for your most important services.&lt;/li&gt;
&lt;li&gt;Alerts on symptoms users feel: error rate, latency, and saturation. Regularly review alerts that never produce action.&lt;/li&gt;
&lt;li&gt;Centralized logs with an explicit retention policy.&lt;/li&gt;
&lt;li&gt;Tracing when you have real multi-service debugging pain and the budget. “Not yet” can be a valid architecture decision.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Backup: a backup you have not restored is a rumor
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Velero—or a cloud-native equivalent—for Kubernetes resources and supported persistent volumes; database-native backups for databases.&lt;/li&gt;
&lt;li&gt;Backups stored outside the cluster and account they protect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test a restore.&lt;/strong&gt; Restore tests regularly expose missing permissions, credentials, data, or instructions. Find that out on a Tuesday afternoon, not during an incident.&lt;/li&gt;
&lt;li&gt;Write one page titled “the cluster is gone”: how long rebuilding from Git and backups should take, and who does what.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Upgrades: a schedule, not an emergency
&lt;/h2&gt;

&lt;p&gt;Kubernetes releases regularly and managed providers enforce their own support windows. Teams that wait until an upgrade is forced take on more changes at once and have less recent practice.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set a cadence that stays comfortably inside your provider's support window, and put it on the calendar.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;pluto&lt;/code&gt; or &lt;code&gt;kubent&lt;/code&gt; for deprecated APIs before every upgrade.&lt;/li&gt;
&lt;li&gt;Treat add-ons—ingress controller, cert-manager, CSI, and CNI—as part of the upgrade. Their compatibility can be as consequential as the control-plane version.&lt;/li&gt;
&lt;li&gt;Rehearse on a throwaway or staging cluster first.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What not to copy from enterprises
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Multi-cluster, multi-region setups before you have multi-customer problems.&lt;/li&gt;
&lt;li&gt;A service mesh “because security.” Start with NetworkPolicies.&lt;/li&gt;
&lt;li&gt;An internal developer portal for five engineers.&lt;/li&gt;
&lt;li&gt;Change advisory boards. For many small teams, Git history and pull-request review are the change process.&lt;/li&gt;
&lt;li&gt;Every logo in the CNCF landscape. The landscape is a map, not a shopping list.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Copy the &lt;strong&gt;discipline&lt;/strong&gt;: ownership, rollback, tested restores, and an upgrade cadence.&lt;/p&gt;

&lt;p&gt;Refuse the &lt;strong&gt;complexity&lt;/strong&gt;: architecture shaped by headcount you do not have.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one-hour exercise
&lt;/h2&gt;

&lt;p&gt;You do not need to implement all of this at once. The useful outcome is a short, ordered backlog—not a perfect score.&lt;/p&gt;

&lt;p&gt;Sit the team down and score each item from 0 to 2. Anything scoring 0 in backup, rollback, or secrets is a candidate for the next sprint—before another platform feature.&lt;/p&gt;

&lt;p&gt;I turned this exercise into a &lt;a href="https://kestrion.dev/scorecard/" rel="noopener noreferrer"&gt;50-question production readiness scorecard&lt;/a&gt; that runs in the browser. It covers deployment safety, ownership, cost, security, observability, disaster recovery, and upgrades.&lt;/p&gt;

&lt;p&gt;The goal is not a perfect platform. The goal is Kubernetes boring enough that your team can go back to shipping product.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/workloads/pods/probes/" rel="noopener noreferrer"&gt;Kubernetes documentation: probes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/" rel="noopener noreferrer"&gt;Kubernetes documentation: container lifecycle hooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/workloads/pods/disruptions/" rel="noopener noreferrer"&gt;Kubernetes documentation: disruptions and PodDisruptionBudgets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/" rel="noopener noreferrer"&gt;Kubernetes documentation: resource management&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>infrastructure</category>
      <category>kubernetes</category>
      <category>sre</category>
    </item>
  </channel>
</rss>
