<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Demuxer]]></title><description><![CDATA[Demuxer]]></description><link>https://demuxer.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6af386869f34908e619233ae/8196920f-4385-4e3a-831f-69cf32d67996.png</url><title>Demuxer</title><link>https://demuxer.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Thu, 12 Nov 2026 08:44:35 GMT</lastBuildDate><atom:link href="https://demuxer.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Right-size Kubernetes CPU and memory requests from 7 days of Prometheus]]></title><description><![CDATA[Most CPU and memory requests are set once, by a guess, and never looked at again. At Demuxer we build Kuberniq, a desktop Kubernetes client for macOS and…]]></description><link>https://demuxer.hashnode.dev/right-size-kubernetes-cpu-and-memory-requests-from-7-days-of-prometheus</link><guid isPermaLink="true">https://demuxer.hashnode.dev/right-size-kubernetes-cpu-and-memory-requests-from-7-days-of-prometheus</guid><category><![CDATA[Kubernetes]]></category><category><![CDATA[Devops]]></category><category><![CDATA[#prometheus]]></category><dc:creator><![CDATA[Demuxer]]></dc:creator><pubDate>Tue, 10 Nov 2026 21:13:32 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6af386869f34908e619233ae/337c4d63-9a1b-429d-9a07-8d8275f7ee6b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most CPU and memory requests are set once, by a guess, and never looked at again. At Demuxer we build Kuberniq, a desktop Kubernetes client for macOS and Windows, and this article shows how it compares each container's requests with what it used over the last seven days.</p>
<p><img src="https://cdn.hashnode.com/uploads/covers/6af386869f34908e619233ae/337c4d63-9a1b-429d-9a07-8d8275f7ee6b.png" alt="Right-size Kubernetes CPU and memory requests from 7 days of Prometheus" /></p>
<h2>The problem</h2>
<p>A request reserves CPU and memory on a node whether the container uses it or not. To check one, you query Prometheus by hand, something like a percentile of the CPU rate and the peak of the memory working set per pod, write the numbers down, open the manifest, compare, and edit the YAML. Doing that for every workload in a cluster takes an afternoon, so it rarely gets done.</p>
<h2>How Kuberniq does it</h2>
<ol>
<li>In the Analysis tool window, choose Recommendations.</li>
<li>Under Information, "The container requests more than it uses" lists the workloads. Select <code>recommendations/feature-store</code>.</li>
<li>The detail says that the container requests more than it uses, with 390m of CPU left over across its 3 replicas, and a table of current and recommended values: CPU request 490m to 360m, memory request 2.6 GiB to 2.6 GiB, memory limit 4 GiB to 2.9 GiB. The table says where the numbers come from, "7 days of Prometheus at monitoring/prometheus", and how: CPU at the 95th percentile of the average per pod, memory at the peak per pod. That's the screenshot.</li>
<li>Apply Recommendation… opens "Compare Deployment feature-store", with the 2 changes between In the cluster and After applying.</li>
<li>Apply sends them, and Kuberniq confirms with "Recommendation applied to feature-store."</li>
</ol>
<h2>What it doesn't do yet</h2>
<p>The recommendation covers the CPU request, the memory request and the memory limit. It doesn't set a CPU limit and doesn't change an autoscaler. It needs history to work from, and it changes the object in the cluster, not the manifest in your repository, so a Helm chart or a GitOps sync will put the old values back until you change them there too. There's also no Linux build; it runs on macOS and Windows.</p>
<h2>Try it</h2>
<p>The free license covers personal projects, study, teaching and open source, with the whole app and no account. If you size requests by hand today, we'd like to know whether the 95th percentile and the peak are the numbers you'd pick.</p>
<p>Download Kuberniq from its page: <a href="https://demuxer.dev/kuberniq?utm_source=hashnode&amp;utm_medium=organic&amp;utm_campaign=kuberniq-desktop&amp;utm_content=hashnode%2Frightsizing">https://demuxer.dev/kuberniq?utm_source=hashnode&amp;utm_medium=organic&amp;utm_campaign=kuberniq-desktop&amp;utm_content=hashnode%2Frightsizing</a></p>
]]></content:encoded></item><item><title><![CDATA[Edit Kubernetes YAML against the cluster's own schema, and see the diff before you apply]]></title><description><![CDATA[Changing a manifest in a live cluster is quick to do and easy to get wrong. At Demuxer we build Kuberniq, a desktop Kubernetes client for macOS and…]]></description><link>https://demuxer.hashnode.dev/edit-kubernetes-yaml-against-the-cluster-s-own-schema-and-see-the-diff-before-you-apply</link><guid isPermaLink="true">https://demuxer.hashnode.dev/edit-kubernetes-yaml-against-the-cluster-s-own-schema-and-see-the-diff-before-you-apply</guid><category><![CDATA[Kubernetes]]></category><category><![CDATA[Devops]]></category><category><![CDATA[YAML]]></category><dc:creator><![CDATA[Demuxer]]></dc:creator><pubDate>Tue, 10 Nov 2026 21:12:23 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6af386869f34908e619233ae/b6e33234-fd10-4c1f-b3ee-2cbd1a5bc2b8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Changing a manifest in a live cluster is quick to do and easy to get wrong. At Demuxer we build Kuberniq, a desktop Kubernetes client for macOS and Windows, and this article shows its YAML editor, which checks each field against the schema the cluster serves and shows the diff before anything is sent.</p>
<p><img src="https://cdn.hashnode.com/uploads/covers/6af386869f34908e619233ae/b6e33234-fd10-4c1f-b3ee-2cbd1a5bc2b8.png" alt="Edit Kubernetes YAML against the clusters own schema, and see the diff before you apply" /></p>
<h2>The problem</h2>
<p><code>kubectl edit deployment web</code> opens the manifest in your terminal editor, with no idea of what each field accepts. Type <code>replicas: "three"</code> and you only find out when you save and the API server refuses it. Once the edit goes through, you don't get a view of what changed against what was in the cluster unless you keep a copy and run <code>kubectl diff</code> on it.</p>
<h2>How Kuberniq does it</h2>
<ol>
<li>Open Deployments and click <code>web</code>. The manifest opens in an editor tab, with Compare… and Apply at the top.</li>
<li>On line 15, change <code>replicas: 2</code> to <code>replicas: "three"</code>. Kuberniq marks the value as you type, and hovering it shows <code>spec.replicas</code>, its type, <code>integer</code>, and the documentation the cluster serves for it: "Number of desired pods…"</li>
<li>Change it to <code>replicas: 3</code> and the marker goes away.</li>
<li>Compare… opens "Compare Deployment web", with In the cluster on the left and After applying on the right, and 1 change: <code>replicas: 2</code> becomes <code>replicas: 3</code>. That's the screenshot.</li>
<li>Apply sends the change, and Kuberniq confirms with "Deployment web applied".</li>
</ol>
<h2>What it doesn't do yet</h2>
<p>Kuberniq edits the object in the cluster, not the file in your Git repository. If the Deployment comes from Helm, Kustomize or a GitOps tool, the next sync puts back what the repository says, so make the same change there. There's also no Linux build; it runs on macOS and Windows.</p>
<h2>Try it</h2>
<p>The free license covers personal projects, study, teaching and open source, with the whole app and no account. If you edit manifests in the cluster, we'd like to know what you'd want the editor to check that it doesn't yet.</p>
<p>Download Kuberniq from its page: <a href="https://demuxer.dev/kuberniq?utm_source=hashnode&amp;utm_medium=organic&amp;utm_campaign=kuberniq-desktop&amp;utm_content=hashnode%2Fyaml-editor">https://demuxer.dev/kuberniq?utm_source=hashnode&amp;utm_medium=organic&amp;utm_campaign=kuberniq-desktop&amp;utm_content=hashnode%2Fyaml-editor</a></p>
]]></content:encoded></item><item><title><![CDATA[From a failed Kubernetes pod to its log and a shell, in one window]]></title><description><![CDATA[A pod fails, and the next ten minutes go to finding out why. At Demuxer we build Kuberniq, a desktop Kubernetes client for macOS and Windows, and this…]]></description><link>https://demuxer.hashnode.dev/from-a-failed-kubernetes-pod-to-its-log-and-a-shell-in-one-window</link><guid isPermaLink="true">https://demuxer.hashnode.dev/from-a-failed-kubernetes-pod-to-its-log-and-a-shell-in-one-window</guid><category><![CDATA[Kubernetes]]></category><category><![CDATA[Devops]]></category><category><![CDATA[kubectl]]></category><dc:creator><![CDATA[Demuxer]]></dc:creator><pubDate>Tue, 10 Nov 2026 21:11:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6af386869f34908e619233ae/55285218-a988-4a1c-8a62-e388b16b92a3.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A pod fails, and the next ten minutes go to finding out why. At Demuxer we build Kuberniq, a desktop Kubernetes client for macOS and Windows, and this article shows how it takes you from the failure to the log and to a shell in a container.</p>
<p><img src="https://cdn.hashnode.com/uploads/covers/6af386869f34908e619233ae/55285218-a988-4a1c-8a62-e388b16b92a3.png" alt="From a failed Kubernetes pod to its log and a shell, in one window" /></p>
<h2>The problem</h2>
<p>In a terminal, you find the pod with <code>kubectl get pods -n shop</code>, copy its name with the random suffix, run <code>kubectl logs worker-6c8d9b7f4-qz8mt --previous</code> to see why the last run ended, and then <code>kubectl exec -it api-7d9f8c6b5d-m4h7c -c api -- sh</code> to look from inside a neighbour pod. Every step needs the exact name of a pod that may already have been replaced.</p>
<h2>How Kuberniq does it</h2>
<ol>
<li>When a pod fails, Kuberniq shows a notification. In our demo cluster it reads "The pod worker-6c8d9b7f4-qz8mt failed", with a View log button.</li>
<li>View log opens the Logs tool window on that pod. The screenshot shows <code>worker-6c8d9b7f4-qz8mt</code> in CrashLoopBackOff, and its log: three attempts to reach <code>rabbitmq.shop.svc.cluster.local</code>, then <code>level=fatal msg="cannot consume the queue without a broker"</code>. The toolbar follows the end of the log, wraps long lines, shows timestamps and downloads the log.</li>
<li>To look from inside another pod, open Pods, type <code>api-</code> in the filter, right-click <code>api-7d9f8c6b5d-m4h7c</code> and choose Open Terminal. The Terminal tool window opens a shell in the container <code>api</code>, at <code>/app #</code>.</li>
</ol>
<p>The Pods table also shows the CPU and memory of each pod and how they compare with its requests and limits, so a pod near its memory limit stands out before you open anything.</p>
<h2>What it doesn't do yet</h2>
<p>Kuberniq shows the log the cluster still keeps for the container. When the pod is deleted, its log goes with it, and Kuberniq doesn't store logs anywhere of its own or search across them over time. There's also no Linux build; it runs on macOS and Windows.</p>
<h2>Try it</h2>
<p>The free license covers personal projects, study, teaching and open source, with the whole app and no account. If you debug pods from the terminal today, we'd like to know which step you'd still do there after trying Kuberniq.</p>
<p>Download Kuberniq from its page: <a href="https://demuxer.dev/kuberniq?utm_source=hashnode&amp;utm_medium=organic&amp;utm_campaign=kuberniq-desktop&amp;utm_content=hashnode%2Flogs-terminal">https://demuxer.dev/kuberniq?utm_source=hashnode&amp;utm_medium=organic&amp;utm_campaign=kuberniq-desktop&amp;utm_content=hashnode%2Flogs-terminal</a></p>
]]></content:encoded></item><item><title><![CDATA[Find what's broken across every namespace of a Kubernetes cluster]]></title><description><![CDATA[When a service misbehaves, the first question is where in the cluster the problem is. At Demuxer we build Kuberniq, a desktop Kubernetes client for macOS…]]></description><link>https://demuxer.hashnode.dev/find-what-s-broken-across-every-namespace-of-a-kubernetes-cluster</link><guid isPermaLink="true">https://demuxer.hashnode.dev/find-what-s-broken-across-every-namespace-of-a-kubernetes-cluster</guid><category><![CDATA[Kubernetes]]></category><category><![CDATA[Devops]]></category><category><![CDATA[troubleshooting]]></category><dc:creator><![CDATA[Demuxer]]></dc:creator><pubDate>Tue, 10 Nov 2026 21:09:56 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6af386869f34908e619233ae/f4fd3990-85b6-4080-8cbe-a3ca136885ba.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When a service misbehaves, the first question is where in the cluster the problem is. At Demuxer we build Kuberniq, a desktop Kubernetes client for macOS and Windows, and this article shows its analysis, which answers that question for the whole cluster at once.</p>
<p><img src="https://cdn.hashnode.com/uploads/covers/6af386869f34908e619233ae/f4fd3990-85b6-4080-8cbe-a3ca136885ba.png" alt="Find whats broken across every namespace of a Kubernetes cluster" /></p>
<h2>The problem</h2>
<p>Without a tool, the search is a round of commands. You run <code>kubectl get pods -A</code> and scan for anything that isn't Running, <code>kubectl describe pod</code> on each suspect to read its events, <code>kubectl get nodes</code> to see whether a node dropped out, and then you look up what <code>ImagePullBackOff</code> or <code>OOMKilled</code> means in that case and what to do about it. On a cluster with a couple of hundred pods spread over dozens of namespaces, the one canary that can't pull its image is easy to miss.</p>
<h2>How Kuberniq does it</h2>
<ol>
<li>Open the cluster and set the namespace dropdown to All namespaces.</li>
<li>Open Overview and pick a range: 1 h, 6 h, 24 h or 7 d. The summary shows nodes ready, pods running, pending and failed, CPU and memory requested against allocatable and used, and restarts, with charts of CPU and memory from the cluster's Prometheus. In the screenshot, 13 of 14 nodes are ready, 242 pods are running and 3 have failed.</li>
<li>The Analysis tool window at the bottom groups the findings into Errors, Warnings and Information, and the tabs narrow them to Failures, Reliability or Recommendations.</li>
<li>Select a finding to read it. In the screenshot, under Errors (6), "The image cannot be pulled" points at <code>search/search-api-canary-rrql5bqvl-mmlmx</code>. The detail says that the container cannot pull <code>ghcr.io/shop/search-api:2.15.0-rc.1</code>, then Why: "the name or the tag does not exist, the registry asks for a credential the pod does not have, or the registry does not answer", and What to do: "Check the name and the tag of the image and, for a private registry, the imagePullSecrets of the pod."</li>
</ol>
<p>The same list has a node that is not ready, a container that restarts in a loop and a container that went past its memory limit, each with its own Why and What to do.</p>
<h2>What it doesn't do yet</h2>
<p>The analysis says what to do, and you make the fix yourself; the exception is the CPU and memory recommendations, which you apply through a diff. It reads the cluster when you open it and when you analyze again, so it doesn't watch the cluster while Kuberniq is closed and doesn't send alerts to chat or to a pager. The rules are the ones Kuberniq ships with, and you can't write your own.</p>
<h2>Try it</h2>
<p>The free license covers personal projects, study, teaching and open source, with the whole app and no account. If you try the analysis on one of your clusters, we'd like to know which finding it missed and which one you'd rather not see.</p>
<p>Download Kuberniq from its page: <a href="https://demuxer.dev/kuberniq?utm_source=hashnode&amp;utm_medium=organic&amp;utm_campaign=kuberniq-desktop&amp;utm_content=hashnode%2Fanalysis">https://demuxer.dev/kuberniq?utm_source=hashnode&amp;utm_medium=organic&amp;utm_campaign=kuberniq-desktop&amp;utm_content=hashnode%2Fanalysis</a></p>
]]></content:encoded></item><item><title><![CDATA[Open every cluster in your kubeconfig, with no account]]></title><description><![CDATA[Most people who run Kubernetes keep several clusters in one kubeconfig: production, staging, one on the laptop, sometimes one per region or per customer…]]></description><link>https://demuxer.hashnode.dev/open-every-cluster-in-your-kubeconfig-with-no-account</link><guid isPermaLink="true">https://demuxer.hashnode.dev/open-every-cluster-in-your-kubeconfig-with-no-account</guid><category><![CDATA[Devops]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[kubectl]]></category><dc:creator><![CDATA[Demuxer]]></dc:creator><pubDate>Tue, 10 Nov 2026 21:06:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6af386869f34908e619233ae/9a7a295b-f9b0-49dc-80a5-ee714b5d6e6e.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most people who run Kubernetes keep several clusters in one kubeconfig: production, staging, one on the laptop, sometimes one per region or per customer. At Demuxer we build Kuberniq, a desktop Kubernetes client for macOS and Windows, and this article shows how it opens those clusters.</p>
<p><img src="https://cdn.hashnode.com/uploads/covers/6af386869f34908e619233ae/9a7a295b-f9b0-49dc-80a5-ee714b5d6e6e.png" alt="Open every cluster in your kubeconfig, with no account" /></p>
<h2>The problem</h2>
<p>In a terminal, moving between clusters means changing the current context. You run <code>kubectl config get-contexts</code> to see the names, <code>kubectl config use-context shop-prod</code> to pick one, and from then on every command in every shell goes to that cluster until someone changes it again. kubectx makes the switch shorter, but the current context is still one setting that all your terminals share. Some desktop clients add a step of their own before you see anything, such as signing in to an account with them.</p>
<h2>How Kuberniq does it</h2>
<p>Kuberniq reads the same kubeconfig as kubectl, from <code>KUBECONFIG</code> or <code>~/.kube/config</code>, and asks for no account.</p>
<ol>
<li>The welcome screen lists every context in the file, each with its cluster and the address of its API server. In our demo, <code>shop-prod</code> is an EKS context, shown with its ARN and its <code>eks.amazonaws.com</code> endpoint. With many contexts, Search clusters narrows the list, and Reload reads the file again after you change it.</li>
<li>Select the context and click Open.</li>
<li>A window opens on that cluster. On the left, the Resources tree groups the kinds into Workloads, Network, Configuration, Storage, Access control, Cluster and Custom resources, with a count next to each kind. At the top, the namespace dropdown picks one namespace or All namespaces, and the status bar shows the version the cluster reports, here <code>Kubernetes v1.33.1-eks-7b0f2a1</code>.</li>
<li>Pick All namespaces and every table covers the whole cluster. The screenshot shows <code>shop-prod</code> that way: 246 pods and 49 Deployments, listed with their namespace, ready replicas and age.</li>
</ol>
<p>The credentials stay where they are: Kuberniq reads them from the kubeconfig and doesn't copy them to an account or a service of ours.</p>
<h2>What it doesn't do yet</h2>
<p>Kuberniq doesn't discover clusters on its own. If a cluster isn't in your kubeconfig, or kubectl can't reach it from there, it won't show up in Kuberniq either. There's also no Linux build; it runs on macOS and Windows.</p>
<h2>Try it</h2>
<p>The free license covers personal projects, study, teaching and open source, with the whole app and no account. If you keep many contexts in one kubeconfig, we'd like to hear how you move between them today and where Kuberniq gets in the way.</p>
<p>Download Kuberniq from its page: <a href="https://demuxer.dev/kuberniq?utm_source=hashnode&amp;utm_medium=organic&amp;utm_campaign=kuberniq-desktop&amp;utm_content=hashnode%2Fkubeconfig">https://demuxer.dev/kuberniq?utm_source=hashnode&amp;utm_medium=organic&amp;utm_campaign=kuberniq-desktop&amp;utm_content=hashnode%2Fkubeconfig</a></p>
]]></content:encoded></item></channel></rss>