<?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: Muhtalip Dede</title>
    <description>The latest articles on DEV Community by Muhtalip Dede (@muhtalipdede).</description>
    <link>https://dev.to/muhtalipdede</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%2F596699%2F3b22f4b8-7c35-4c45-bf6e-99fd7a593c12.jpg</url>
      <title>DEV Community: Muhtalip Dede</title>
      <link>https://dev.to/muhtalipdede</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/muhtalipdede"/>
    <language>en</language>
    <item>
      <title>Kubernetes OOMKilled — diagnose with a plan, not a wall of kubectl</title>
      <dc:creator>Muhtalip Dede</dc:creator>
      <pubDate>Fri, 14 Aug 2026 20:29:14 +0000</pubDate>
      <link>https://dev.to/muhtalipdede/kubernetes-oomkilled-diagnose-with-a-plan-not-a-wall-of-kubectl-4997</link>
      <guid>https://dev.to/muhtalipdede/kubernetes-oomkilled-diagnose-with-a-plan-not-a-wall-of-kubectl-4997</guid>
      <description>&lt;p&gt;OOMKilled is a classic day-2 rabbit hole: events, limits, restarts, then a risky scale or edit. kprompt turns the investigation prompt into a reviewable plan before apply.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kprompt.ai/blog/kubernetes-oomkilled" rel="noopener noreferrer"&gt;https://kprompt.ai/blog/kubernetes-oomkilled&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;OOMKilled is one of the most common “the app is broken” signals in Kubernetes — and one of the easiest to misread. The Pod may still show Running. Restarts climb. Logs look fine until they stop mid-request. Someone raises the memory limit “a bit,” the Deployment rolls, and two hours later it happens again. Or worse: they remove the limit entirely and the node starts evicting neighbors.&lt;/p&gt;

&lt;p&gt;This guide is the operator ladder for memory kills: how to confirm OOMKilled, how requests and limits differ, what kubectl shows, and how to apply a bounded fix with a reviewable plan. kprompt's explain path detects OOM findings and can propose a memory patch — still behind approval, because raising limits is a real cluster change.&lt;/p&gt;

&lt;h2&gt;
  
  
  What OOMKilled actually means
&lt;/h2&gt;

&lt;p&gt;When a container exceeds its memory limit, the Linux OOM killer (via cgroup enforcement) terminates the process. Kubernetes records the termination reason as OOMKilled. Exit code is often 137 (128 + SIGKILL). That is not an application “bug code” — it is the kernel saying the cgroup ran out of memory.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limit hit → container killed → kubelet may restart it (CrashLoopBackOff if it keeps dying)&lt;/li&gt;
&lt;li&gt;No memory limit → the container can grow until the node is under pressure (evictions, not always a clean OOMKilled on that Pod)&lt;/li&gt;
&lt;li&gt;Requests affect scheduling; limits affect kill behavior — confusing them is the most common ops mistake&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Confirm it before you patch
&lt;/h2&gt;

&lt;p&gt;Do not raise memory because “it feels like OOM.” Read the Pod status. The smoking gun is usually Last State / Last Termination State on the container: Reason OOMKilled, Exit Code 137.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Classic kubectl confirmation&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; staging
kubectl describe pod &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;api &lt;span class="nt"&gt;-n&lt;/span&gt; staging
&lt;span class="c"&gt;# Look under Containers → Last State:&lt;/span&gt;
&lt;span class="c"&gt;#   Reason: OOMKilled&lt;/span&gt;
&lt;span class="c"&gt;#   Exit Code: 137&lt;/span&gt;

kubectl get pod &lt;span class="nt"&gt;-n&lt;/span&gt; staging &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{range .items[*]}{.metadata.name}{"\t"}{range .status.containerStatuses[*]}{.name}{"="}{.lastState.terminated.reason}{" "}{end}{"\n"}{end}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also check current limits on the Deployment template — describe Pod shows what ran; the Deployment owns what will run next:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;See memory requests and limits&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get deploy api &lt;span class="nt"&gt;-n&lt;/span&gt; staging &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{range .spec.template.spec.containers[*]}{.name}{" limits="}{.resources.limits.memory}{" requests="}{.resources.requests.memory}{"\n"}{end}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Requests vs limits (the part people skip)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;OOM relevance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;requests.memory&lt;/td&gt;
&lt;td&gt;Scheduler places the Pod on a node with enough capacity&lt;/td&gt;
&lt;td&gt;Too low → noisy neighbor risk; does not by itself OOMKill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;limits.memory&lt;/td&gt;
&lt;td&gt;Hard cgroup cap for the container&lt;/td&gt;
&lt;td&gt;Exceed this → OOMKilled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No limit&lt;/td&gt;
&lt;td&gt;Container can use free node memory&lt;/td&gt;
&lt;td&gt;May avoid OOMKilled on that Pod; can hurt the node&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A healthy fix usually raises the limit (and often the request toward a sensible fraction of that limit) based on observed usage — not deleting limits to “make it stop.” If you have Prometheus, compare working set / RSS to the current limit before you double everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  kubectl explain ladder for memory kills
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Scope — which Deployment / Pod, which namespace and context&lt;/li&gt;
&lt;li&gt;Status — restarts, Ready, Last State reason&lt;/li&gt;
&lt;li&gt;Resources — limits and requests on the crashing container&lt;/li&gt;
&lt;li&gt;Events — Failed / OOM / eviction messages on Pod or node&lt;/li&gt;
&lt;li&gt;Logs — --previous for the crashed instance (may be empty if killed hard)&lt;/li&gt;
&lt;li&gt;Change — bump memory or roll back a bad image / leaky release&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Investigation sequence&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl describe deploy api &lt;span class="nt"&gt;-n&lt;/span&gt; staging
kubectl describe pod &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;api &lt;span class="nt"&gt;-n&lt;/span&gt; staging
kubectl logs deploy/api &lt;span class="nt"&gt;-n&lt;/span&gt; staging &lt;span class="nt"&gt;--previous&lt;/span&gt; &lt;span class="nt"&gt;--tail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100
kubectl get events &lt;span class="nt"&gt;-n&lt;/span&gt; staging &lt;span class="nt"&gt;--field-selector&lt;/span&gt; &lt;span class="nv"&gt;reason&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;OOMKilling &lt;span class="nt"&gt;--sort-by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'.lastTimestamp'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Natural-language explain → suggested patch
&lt;/h2&gt;

&lt;p&gt;kprompt's explain path walks live Deployment → Pod → Events → Logs style signals. When it finds OOMKilled on a container, it can propose a follow-up: raise the Deployment memory limit (typically doubling a known limit in the suggested plan) and show the plan for approval. Reads run immediately; the patch does not apply until you confirm — or you pass --approve in a context you trust.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Detect and review a memory fix&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ kprompt "explain why api is crashing" -n staging

# … findings include OOMKilled on container app …

Suggested fix (requires approval):
Plan
  1. patch Deployment/api memory limit (e.g. 64Mi → 128Mi)

Risk: medium
Apply? [y/N]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the intent-compiler shape: evidence from the apiserver, a concrete mutation plan, human gate. It is not “the model silently edited production.” If you reject the plan, nothing changes — dig into leaks, heap dumps, or a bad release instead.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use explain first on non-production or a staging clone of the workload&lt;/li&gt;
&lt;li&gt;Read the before→after memory numbers in the plan — doubling forever is not a strategy&lt;/li&gt;
&lt;li&gt;Prefer fixing leaks for steady growth; raise limits for genuine under-provisioning&lt;/li&gt;
&lt;li&gt;After apply, use --wait on related rollouts or watch the Deployment until restarts stabilize&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Manual patch when you want exact numbers
&lt;/h2&gt;

&lt;p&gt;Sometimes you already know the target (512Mi limit, 256Mi request). Use kubectl or a reviewed kprompt plan with an explicit change — do not approve a suggested bump you have not sanity-checked against metrics.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Explicit memory patch&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl &lt;span class="nb"&gt;set &lt;/span&gt;resources deploy/api &lt;span class="nt"&gt;-n&lt;/span&gt; staging &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--limits&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;512Mi &lt;span class="nt"&gt;--requests&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;256Mi

&lt;span class="c"&gt;# or edit the template&lt;/span&gt;
kubectl edit deploy api &lt;span class="nt"&gt;-n&lt;/span&gt; staging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  When raising memory is the wrong fix
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Memory leak — usage climbs until any limit dies; fix the app or roll back the release&lt;/li&gt;
&lt;li&gt;Cache without bound — tune the process (JVM heap, Node heap, Go pacer) to fit the cgroup&lt;/li&gt;
&lt;li&gt;Wrong container — sidecar OOMs while you patch the app container&lt;/li&gt;
&lt;li&gt;Node pressure — Pod evicted or node NotReady; look at node allocatable and neighbors&lt;/li&gt;
&lt;li&gt;Burst then idle — a higher limit may be fine; also consider HPA/VPA later, not blind doubles&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Production habits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Confirm OOMKilled in Last State before changing resources&lt;/li&gt;
&lt;li&gt;Change one variable at a time — memory patch or image rollback, not both blind&lt;/li&gt;
&lt;li&gt;Keep limits; size them from data&lt;/li&gt;
&lt;li&gt;Record the plan (kprompt history or -o json) for the incident timeline&lt;/li&gt;
&lt;li&gt;Revisit after 24h of metrics — did working set settle under the new limit?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it on a sandbox Deployment
&lt;/h2&gt;

&lt;p&gt;Spin a tiny limit on kind or staging, force an OOM, then run explain and decide whether to approve the suggested patch. Pair with the &lt;a href="https://kprompt.ai/blog/kubernetes-imagepullbackoff" rel="noopener noreferrer"&gt;ImagePullBackOff guide&lt;/a&gt; when the Pod never starts, and with the &lt;a href="https://kprompt.ai/blog/kubernetes-crashloopbackoff" rel="noopener noreferrer"&gt;CrashLoopBackOff guide&lt;/a&gt; when the memory kill is what keeps the container looping.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Quick start&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://kprompt.ai/install | bash
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;KPROMPT_GEMINI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;

kprompt &lt;span class="s2"&gt;"explain why api is crashing"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; staging
&lt;span class="c"&gt;# review Suggested fix → y or n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Try:&lt;/strong&gt; &lt;a href="https://kprompt.ai" rel="noopener noreferrer"&gt;kprompt.ai&lt;/a&gt; · &lt;a href="https://github.com/kprompt/kprompt" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;code&gt;brew install kprompt/tap/kprompt&lt;/code&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>sre</category>
      <category>devops</category>
      <category>debugging</category>
    </item>
    <item>
      <title>An intent compiler for Kubernetes — not another chat REPL</title>
      <dc:creator>Muhtalip Dede</dc:creator>
      <pubDate>Fri, 14 Aug 2026 20:28:01 +0000</pubDate>
      <link>https://dev.to/muhtalipdede/an-intent-compiler-for-kubernetes-not-another-chat-repl-3abh</link>
      <guid>https://dev.to/muhtalipdede/an-intent-compiler-for-kubernetes-not-another-chat-repl-3abh</guid>
      <description>&lt;p&gt;Chat CLIs optimize for turn-taking. Operators need a reviewable artifact before mutate.&lt;/p&gt;

&lt;p&gt;kprompt is built as an intent compiler: NL → PlanResult → safety → approve → apply. Same day-2 surface (Helm, Prom, GitOps…) under one approval loop. Experimental.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kprompt.ai/blog/intent-compiler-not-chat" rel="noopener noreferrer"&gt;https://kprompt.ai/blog/intent-compiler-not-chat&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Most Kubernetes AI demos look the same in a screenshot: a prompt box, some English, something that resembles kubectl. Underneath, products diverge. Some scan the cluster. Some run agents inside it. Some host chat in a SaaS control plane. And in the local CLI lane — where kubectl-ai and kprompt both sit — the important question is not who has the slicker REPL. It is what the tool emits before anything hits the apiserver.&lt;/p&gt;

&lt;p&gt;Our locked bet: kprompt is an intent compiler. Plain English compiles into a typed, reviewable PlanResult — actions, risk, hard denies — that a human or CI can gate, then apply. It is not a free-form agent chat optimized for “keep talking until the cluster moves.” That difference is the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same lane, different contract
&lt;/h2&gt;

&lt;p&gt;We do not claim a unique category against every Kubernetes AI tool. The map is simpler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;K8sGPT — analyzer-first diagnosis (scan → explain). We are not a fleet scanner.&lt;/li&gt;
&lt;li&gt;Kagent — in-cluster agent framework. We ship an optional Observe-only agent, not a multi-agent platform.&lt;/li&gt;
&lt;li&gt;Hosted chat — managed control planes. We are BYOK and local by default.&lt;/li&gt;
&lt;li&gt;kubectl-ai — natural-language kubectl fluency. Same lane as us; different mutate contract.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trying to out-chat &lt;a href="https://github.com/GoogleCloudPlatform/kubectl-ai" rel="noopener noreferrer"&gt;kubectl-ai&lt;/a&gt; on agentic REPL features is a losing strategy. Google can ship conversation quality and tool-calling surface area faster than a small OSS project. Competing there means forever second place. Competing on a printable, policy-shaped plan artifact is a fight worth picking.&lt;/p&gt;

&lt;h2&gt;
  
  
  What “intent compiler” means in practice
&lt;/h2&gt;

&lt;p&gt;A chat REPL optimizes for turn-taking: the model calls tools, narrates, maybe runs kubectl. An intent compiler optimizes for an artifact you can refuse:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Compile → review → apply (or abort)&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kprompt &lt;span class="s2"&gt;"scale api to 3"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; staging
&lt;span class="go"&gt;
Plan
  1. kubectl scale deployment/api --replicas=3 -n staging

Risk: low
Apply? [y/N] n
Aborted.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;LLM proposes intent; Go packages own planning, safety, and execution&lt;/li&gt;
&lt;li&gt;Mutations default to plan-only until y/N or an explicit --approve&lt;/li&gt;
&lt;li&gt;Wipe-class prompts hard-deny before a useful apply path exists&lt;/li&gt;
&lt;li&gt;CI consumes the same PlanResult JSON humans see summarized in the terminal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Same prompt, machine-readable gate&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kprompt &lt;span class="s2"&gt;"scale api to 3"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; staging &lt;span class="nt"&gt;-o&lt;/span&gt; json | &lt;span class="se"&gt;\&lt;/span&gt;
  jq &lt;span class="s1"&gt;'{intent:.plan.intent, risk:.risk, denied:.risk.denied}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why the artifact matters more than the chat
&lt;/h2&gt;

&lt;p&gt;Platform teams already distrust “AI applied something.” They trust diffs, PRs, admission policy, and change tickets. A scrollback of model narration does not fit that muscle memory. A PlanResult does: intent, ordered actions, risk level, denied flag, applied boolean — something you can jq, archive, and teach juniors to read before they type y.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Chat REPL instinct&lt;/th&gt;
&lt;th&gt;Intent compiler instinct&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Keep the session going until it works&lt;/td&gt;
&lt;td&gt;Emit one plan; refuse or approve&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool calls are the product&lt;/td&gt;
&lt;td&gt;The gated plan is the product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speed to first kubectl&lt;/td&gt;
&lt;td&gt;Speed to a reviewable change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard to put in CI without scraping text&lt;/td&gt;
&lt;td&gt;JSON PlanResult is a first-class gate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Neither instinct is “wrong.” If you want kubectl fluency in an interactive session, a chat-shaped CLI is rational. If you want NL day-2 ops that behave like a change you would put in a pipeline, compile to a plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  One contract across tools
&lt;/h2&gt;

&lt;p&gt;The compiler model only pays off if it stretches past kubectl scale. kprompt routes day-2 backends — Helm install/upgrade previews, Prometheus performance explains, trace adapters, Workflow generation — through the same plan → safety → approve loop. The LLM does not become a second control plane; it proposes steps against real CLIs and APIs you already run.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Different backends, same gate&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kprompt &lt;span class="s2"&gt;"install redis"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; cache
kprompt &lt;span class="s2"&gt;"why is my api slow?"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; production
kprompt &lt;span class="s2"&gt;"explain why api is crashing"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; staging
&lt;span class="c"&gt;# Mutating suggestions still show a plan before apply&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Post-v1 originality we are building toward — not shipping as vapor demos — is cluster-level NL ops on that same contract: optimize my cluster style reports with optional approved fixes, and service dependency graphs grounded in Kubernetes (and traces when available). Still plan-before-apply. Never a silent controller.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we are not selling today
&lt;/h2&gt;

&lt;p&gt;Honesty is part of the positioning. The Apache-2.0 CLI is free, local, and BYOK. Org policy sync, shared audit, and Team enrollment are explored for later — there is nothing to buy on the site today, and this post is not a pricing page. When governance ships, it should attach to the same PlanResult artifact, not invent a parallel chatbot product.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not a hosted agent in your cluster (OSS path)&lt;/li&gt;
&lt;li&gt;Not “unique NL kubectl” — kubectl-ai shares that job&lt;/li&gt;
&lt;li&gt;Not a replacement for RBAC, admission, or GitOps&lt;/li&gt;
&lt;li&gt;Experimental — hard denies help; they are not a production certificate&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to evaluate us in one afternoon
&lt;/h2&gt;

&lt;p&gt;Do not score kprompt on who tells a better joke in a 40-turn chat. Score the contract:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same mutate prompt in kubectl-ai and kprompt — what prints before apply?&lt;/li&gt;
&lt;li&gt;Wipe-class prompt — does it fail closed?&lt;/li&gt;
&lt;li&gt;JSON gate — can CI reject denied/high-risk without scraping ANSI?&lt;/li&gt;
&lt;li&gt;Wrong namespace / scale to zero — does the plan make the blast radius obvious?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thirty-minute drill&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://kprompt.ai/install | bash
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;KPROMPT_GEMINI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;

kprompt &lt;span class="s2"&gt;"delete all pods"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; staging
kprompt &lt;span class="s2"&gt;"scale api to 0"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; staging &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq .risk
kprompt &lt;span class="s2"&gt;"scale api to 2"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; staging
&lt;span class="c"&gt;# read plan → n or y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Design principle we will not trade away
&lt;/h2&gt;

&lt;p&gt;Compile to PlanResult, not chat scroll. The LLM proposes; the product artifact is a structured plan humans and policy can gate. Feature parity with agentic REPLs is explicitly out of scope as a north star. If a future feature cannot show up in a reviewable plan (or a clear read-only report), it probably is not a kprompt feature.&lt;/p&gt;

&lt;p&gt;For the peer map, read the &lt;a href="https://kprompt.ai/blog/kubernetes-ai-tools-comparison" rel="noopener noreferrer"&gt;AI tools comparison&lt;/a&gt;. For a direct head-to-head, see &lt;a href="https://kprompt.ai/blog/kprompt-vs-kubectl-ai" rel="noopener noreferrer"&gt;kprompt vs kubectl-ai&lt;/a&gt;. For the safety loop, read &lt;a href="https://kprompt.ai/blog/kubernetes-safety-plan-approve" rel="noopener noreferrer"&gt;plan → approve&lt;/a&gt;. For CI schema, read &lt;a href="https://kprompt.ai/blog/planresult-json-deep-dive" rel="noopener noreferrer"&gt;PlanResult JSON deep dive&lt;/a&gt; and &lt;a href="https://kprompt.ai/blog/kubernetes-ci-cd-plan-gates" rel="noopener noreferrer"&gt;PlanResult gates&lt;/a&gt;. Talk to your cluster — but make the cluster change look like something you would sign.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try:&lt;/strong&gt; &lt;a href="https://kprompt.ai" rel="noopener noreferrer"&gt;kprompt.ai&lt;/a&gt; · &lt;a href="https://github.com/kprompt/kprompt" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;code&gt;brew install kprompt/tap/kprompt&lt;/code&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>architecture</category>
      <category>ai</category>
    </item>
    <item>
      <title>kprompt vs kubectl-ai: plan-before-apply vs NL kubectl</title>
      <dc:creator>Muhtalip Dede</dc:creator>
      <pubDate>Fri, 14 Aug 2026 20:26:45 +0000</pubDate>
      <link>https://dev.to/muhtalipdede/kprompt-vs-kubectl-ai-plan-before-apply-vs-nl-kubectl-5ggk</link>
      <guid>https://dev.to/muhtalipdede/kprompt-vs-kubectl-ai-plan-before-apply-vs-nl-kubectl-5ggk</guid>
      <description>&lt;p&gt;If you are shopping for a “kubectl-ai alternative,” you are already in the right lane: local kubeconfig + BYOK + natural language. The fork in the road is the mutate contract.&lt;/p&gt;

&lt;p&gt;kprompt compiles intent into a typed PlanResult (actions, risk, hard denies), then requires approve before apply — including CI JSON gates. kubectl-ai is often a faster path to kubectl-shaped execution.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kprompt.ai/blog/kprompt-vs-kubectl-ai" rel="noopener noreferrer"&gt;https://kprompt.ai/blog/kprompt-vs-kubectl-ai&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;If you searched for a &lt;a href="https://github.com/GoogleCloudPlatform/kubectl-ai" rel="noopener noreferrer"&gt;kubectl-ai&lt;/a&gt; alternative or “AI Kubernetes CLI,” you will land on Google’s kubectl-ai and a handful of peers. kprompt sits in the same lane: local binary, your kubeconfig, natural language in. The useful question is not who has the slicker chat — it is what happens before anything mutates the cluster. For a job-first alternatives map (keep kubectl-ai vs switch), see &lt;a href="https://kprompt.ai/blog/kubectl-ai-alternatives" rel="noopener noreferrer"&gt;kubectl-ai alternatives&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Short answer: use kubectl-ai when you want an agentic REPL that is excellent at generating and running kubectl. Use kprompt when you want an &lt;a href="https://kprompt.ai/blog/intent-compiler-not-chat" rel="noopener noreferrer"&gt;intent compiler&lt;/a&gt; — a typed, reviewable plan with risk and hard denies, optional CI JSON, and day-2 backends (Helm, metrics, GitOps) under one approval loop. Same problem space; different contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick decision
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You care about…&lt;/th&gt;
&lt;th&gt;Prefer&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fast kubectl fluency / interactive chat with tool calls&lt;/td&gt;
&lt;td&gt;kubectl-ai&lt;/td&gt;
&lt;td&gt;REPL-first; strong model + tool-calling surface from Google’s project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reviewable plan before every mutate&lt;/td&gt;
&lt;td&gt;kprompt&lt;/td&gt;
&lt;td&gt;Plan → safety → y/N (or --approve); wipe-class hard denies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gate plans in CI with stable JSON&lt;/td&gt;
&lt;td&gt;kprompt&lt;/td&gt;
&lt;td&gt;PlanResult on stdout; human UI on stderr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One NL layer across Helm / Prom / GitOps&lt;/td&gt;
&lt;td&gt;kprompt&lt;/td&gt;
&lt;td&gt;Multi-tool routes with aggregate plan + single approval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP server / IDE agent integration today&lt;/td&gt;
&lt;td&gt;Either&lt;/td&gt;
&lt;td&gt;kubectl-ai has broad MCP mode; kprompt mcp serve is read/plan-only — mutations return a PlanResult, never auto-apply&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BYOK + Apache-2.0 laptop-local CLI&lt;/td&gt;
&lt;td&gt;Either&lt;/td&gt;
&lt;td&gt;Both keep kubeconfig local; pick by mutate contract&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Side-by-side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;kubectl-ai&lt;/th&gt;
&lt;th&gt;kprompt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Primary artifact&lt;/td&gt;
&lt;td&gt;Conversation + generated kubectl / tool calls&lt;/td&gt;
&lt;td&gt;PlanResult (actions, risk, denies)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default mutate UX&lt;/td&gt;
&lt;td&gt;Agent executes kubectl (modes vary)&lt;/td&gt;
&lt;td&gt;Show plan → approve on TTY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safety model&lt;/td&gt;
&lt;td&gt;Tool / mode dependent&lt;/td&gt;
&lt;td&gt;Risk scoring + hard denies (wipe-class)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI / policy gate&lt;/td&gt;
&lt;td&gt;Bring your own wrappers&lt;/td&gt;
&lt;td&gt;First-class --output json PlanResult&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Day-2 stack&lt;/td&gt;
&lt;td&gt;kubectl (+ extensible tools / MCP)&lt;/td&gt;
&lt;td&gt;Helm, Argo, Prom, OTel, Grafana, GitOps… via tools detect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Positioning&lt;/td&gt;
&lt;td&gt;AI-powered kubectl assistant&lt;/td&gt;
&lt;td&gt;Intent compiler → AI SRE direction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What a scale looks like in each
&lt;/h2&gt;

&lt;p&gt;Illustrative shapes — versions and flags change; read current docs for each project.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;kubectl-ai — NL → kubectl fluency&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl-ai &lt;span class="s2"&gt;"scale deployment api to 3 in staging"&lt;/span&gt;
&lt;span class="c"&gt;# Typically proposes / runs the matching kubectl&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;kprompt — compile → review → apply&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kprompt "scale api to 3" -n staging

Plan
  1. scale Deployment/api replicas → 3

Risk: low
Apply? [y/N]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your team’s fear is “the model applied something I did not see,” kprompt’s default path is built around that fear. If your team’s fear is “I am slow at remembering kubectl under pressure,” kubectl-ai’s REPL is built around that fear. Both are legitimate.&lt;/p&gt;

&lt;h2&gt;
  
  
  When kprompt is the better fit
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Shared clusters where every mutate needs a visible plan&lt;/li&gt;
&lt;li&gt;CI pipelines that must jq on risk.denied / plan.actions&lt;/li&gt;
&lt;li&gt;Prompts that span Helm install, Prom explain, then an approved scale&lt;/li&gt;
&lt;li&gt;Hard deny for wipe jokes and unscoped deletes as product behavior&lt;/li&gt;
&lt;li&gt;You want the long-term AI SRE path (investigate / blast-radius) without giving up approval&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When kubectl-ai is the better fit
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You want a chat REPL that stays close to raw kubectl&lt;/li&gt;
&lt;li&gt;MCP / IDE agent workflows are the primary integration&lt;/li&gt;
&lt;li&gt;You already standardize on Google’s kubectl-ai releases and models&lt;/li&gt;
&lt;li&gt;You prefer maximum conversational flexibility over a fixed PlanResult schema&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Honest limits (both sides)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Neither replaces RBAC, admission controllers, or GitOps as source of truth&lt;/li&gt;
&lt;li&gt;Neither is production-hardened by slogan — try on kind / staging first&lt;/li&gt;
&lt;li&gt;kprompt is experimental OSS; plans can be wrong — always read the plan&lt;/li&gt;
&lt;li&gt;kubectl-ai is a fast-moving Google project — features and UX shift; check upstream README&lt;/li&gt;
&lt;li&gt;We are not claiming to out-chat kubectl-ai on agentic REPL quality&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try kprompt in five minutes
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Install + safe read + one mutate plan&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;kprompt/tap/kprompt
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;KPROMPT_GEMINI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;

kprompt &lt;span class="s2"&gt;"list deployments"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; staging
kprompt &lt;span class="s2"&gt;"scale api to 2"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; staging   &lt;span class="c"&gt;# review plan, then y/N&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the wider peer map (K8sGPT, Kagent, hosted chat), see the &lt;a href="https://kprompt.ai/blog/kubernetes-ai-tools-comparison" rel="noopener noreferrer"&gt;AI tools comparison&lt;/a&gt;. For where kprompt is headed beyond AI kubectl, see &lt;a href="https://kprompt.ai/blog/ai-sre-not-ai-kubectl" rel="noopener noreferrer"&gt;Beyond AI kubectl: why kprompt is aiming at AI SRE&lt;/a&gt; and &lt;a href="https://kprompt.ai/docs/roadmap" rel="noopener noreferrer"&gt;Roadmap &amp;amp; vision&lt;/a&gt;. Configure BYOK models on &lt;a href="https://kprompt.ai/docs/providers" rel="noopener noreferrer"&gt;Providers&lt;/a&gt;. Optional always-on alerts: &lt;a href="https://kprompt.ai/docs/agent" rel="noopener noreferrer"&gt;Observe agent&lt;/a&gt;. &lt;a href="https://kprompt.ai/docs/safety" rel="noopener noreferrer"&gt;Safety docs&lt;/a&gt; before shared-cluster --approve.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try:&lt;/strong&gt; &lt;a href="https://kprompt.ai" rel="noopener noreferrer"&gt;kprompt.ai&lt;/a&gt; · &lt;a href="https://github.com/kprompt/kprompt" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;code&gt;brew install kprompt/tap/kprompt&lt;/code&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>cli</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
