<?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: Lyndon Brown</title>
    <description>The latest articles on DEV Community by Lyndon Brown (@lyndon_brown_).</description>
    <link>https://dev.to/lyndon_brown_</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3218371%2F48ae41fe-5ef7-41d9-8788-0eac8de678d3.jpg</url>
      <title>DEV Community: Lyndon Brown</title>
      <link>https://dev.to/lyndon_brown_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lyndon_brown_"/>
    <language>en</language>
    <item>
      <title>The Real State of Helm Chart Reliability (2025): Hidden Risks in 100+ Open‑Source Charts</title>
      <dc:creator>Lyndon Brown</dc:creator>
      <pubDate>Tue, 04 Nov 2025 19:55:35 +0000</pubDate>
      <link>https://dev.to/lyndon_brown_/the-real-state-of-helm-chart-reliability-2025-hidden-risks-in-100-open-source-charts-2cn1</link>
      <guid>https://dev.to/lyndon_brown_/the-real-state-of-helm-chart-reliability-2025-hidden-risks-in-100-open-source-charts-2cn1</guid>
      <description>&lt;h1&gt;
  
  
  tldr
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.prequel.dev" rel="noopener noreferrer"&gt;Prequel&lt;/a&gt;&lt;/strong&gt;'s reliability research team audited 105 popular Kubernetes Helm charts to reveal missing reliability safeguards.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The average score was ~3.98/10
&lt;/li&gt;
&lt;li&gt;48% (50 charts) rated "High Risk" (score ≤3/10)
&lt;/li&gt;
&lt;li&gt;Only 17% (18 charts) were rated "Reliable" (≥7/10)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Key missing features include&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pod Topology Spread Constraints (93% absent)&lt;/li&gt;
&lt;li&gt;PodDisruptionBudget (74% absent)&lt;/li&gt;
&lt;li&gt;Horizontal Pod Autoscalers (75% absent)&lt;/li&gt;
&lt;li&gt;CPU/Memory resource requests/limits (50–60% absent)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Several 0/10 charts were DaemonSets (e.g., Fluent Bit, node-exporter, GPU plugins) where PDB/TopologySpread/HPA/Replicas are generally not applicable.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;It’s important to note that a low score does not necessarily mean the software itself is bad; rather, it means the default deployment setup might not offer high reliability standards.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;We recommend end users patch missing controls via &lt;code&gt;values.yaml&lt;/code&gt; or via Helm overlays.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Users should use continuous reliability protection tools like &lt;strong&gt;Prequel&lt;/strong&gt; to identify missing safeguards and monitor for impact.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fks3dnvgfyr494vk1x1wq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fks3dnvgfyr494vk1x1wq.png" alt="helm quote" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Reliability is one of the main reasons teams adopt Kubernetes, it promises self-healing workloads, automated rollouts, and consistent recovery across environments. However, it is easy to undercut these advantages. A Helm chart packages the Kubernetes manifests that define how an application is deployed. When those charts omit best practices or include misconfigurations, the resulting deployments can become unreliable.&lt;/p&gt;

&lt;p&gt;This report presents a comprehensive reliability audit of 105 popular Helm charts. The goal is to identify how well these charts adhere to known best practices that improve uptime, resiliency, and safe operations in Kubernetes environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do we mean by "reliability" in this context?&lt;/strong&gt; Essentially, we looked for Kubernetes manifest settings that help applications &lt;strong&gt;survive disruptions, autoscale to handle load, and avoid common failure modes&lt;/strong&gt;. These settings correspond to widely recommended practices such as configuring PodDisruptionBudgets, spreading pods across zones and nodes, defining CPU/Memory requests, enabling Horizontal Pod Autoscaling with sensible minimums, etc. When these features are properly set, applications are better protected against outages (both planned and unplanned).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbe51sewvnn5ekjfxzvos.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbe51sewvnn5ekjfxzvos.png" alt=" " width="800" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How did we collect the data?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The Prequel Reliability Research Team (PRRT) evaluated a total of &lt;strong&gt;105 Helm charts&lt;/strong&gt;, selected to cover a broad range of popular open-source applications and infrastructure components. These include charts for observability tools (e.g. Grafana, Prometheus), databases and storage systems (e.g. MySQL, Elasticsearch), networking and security add-ons (e.g. NGINX Ingress, Calico), messaging systems (e.g. Kafka, Pulsar), machine learning tools, and more. Each chart was analyzed using both its default manifests and a minimal "HA‑capability" render to reveal what's supported when scaled.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What was our criteria?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We checked each chart against &lt;strong&gt;10 key reliability criteria&lt;/strong&gt;. Each criterion corresponds to a best-practice configuration that improves reliability. Each chart was rendered twice: once with default values (out-of-the-box) and once with a minimal "HA-capability" override (e.g., setting replicaCount/replicas ≥ 2 and enabling autoscaling/HPA when available). Capability-style criteria (PDB, TopologySpreadConstraints, HPA) are considered "preseConsider writing an overlay chart or a wrapper that adds missing pieces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: &lt;em&gt;Daemonset(DS)‑based charts do not use PDB, TopologySpreadConstraints, HPA, or Replicas in the same way as Deployments/StatefulSets. For DS we emphasize CPU/Memory Requests/Limits and Liveness. Interpret DS scores with this in mind.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The specific criteria audited were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PodDisruptionBudget (PDB)&lt;/strong&gt; - Does the chart define a PodDisruptionBudget for its pods? A PDB ensures that a &lt;em&gt;minimum number of pods stay up during voluntary disruptions&lt;/em&gt; (like node drains or upgrades), so that maintenance events don't accidentally take down the entire application[2].&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a PDB &lt;em&gt;limits&lt;/em&gt; how many pods can be offline at once, preserving availability[3].&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Topology Spread Constraints&lt;/strong&gt; (N/A for DaemonSets ;one pod per node; spread is implicit) - Does the chart use topologySpreadConstraints to spread replicas across nodes/zones? This feature prevents all pods from landing on the same node or zone. By distributing pods across failure domains, it &lt;strong&gt;reduces the blast radius&lt;/strong&gt; - if one node or AZ goes down, it won't take out every replica[4].&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Topology spread constraints thus improve resiliency in multi-node or multi-zone clusters.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Horizontal Pod Autoscaler (HPA)&lt;/strong&gt; (N/A for DaemonSets; HPA does not scale DS) - Does the chart include a HorizontalPodAutoscaler resource (or support enabling it via values)? An HPA will automatically adjust the number of pod replicas based on workload (CPU, memory, or custom metrics)[5].&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This ensures the application can scale out to handle surges in demand and scale back down to save resources, thereby preventing overload and maintaining performance during peak loads. In practice, an HPA with minReplicas ≥ 2 will ensure redundancy.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;CPU Requests&lt;/strong&gt; - Do the pods have CPU requests set? A CPU request reserves a certain amount of CPU for the container. Setting requests is vital because it lets the Kubernetes scheduler know the pod's needs, and prevents scheduling too many high-demand pods on one node.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Without CPU requests, pods might be squeezed onto a node without guaranteed compute, leading to unpredictability. We treat absence of CPU requests as a reliability risk.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;CPU Limits&lt;/strong&gt; - Do the pods have CPU limits defined? CPU limits cap how much CPU time a container can use. This is important to prevent a single pod from monopolizing the CPU on a node.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Left unchecked, a misbehaving pod can starve co‑located workloads (including system components), hurting overall cluster stability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Note&lt;/strong&gt;: &lt;em&gt;The use of CPU limits is debated; limits can introduce CPU throttling under load (sometimes even when usage appears within the configured limit), which may cause latency spikes. We still treat the presence of reasonable limits as a reliability factor because they improve predictability and blast‑radius control.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Memory Requests&lt;/strong&gt; - Do the pods have memory requests set? Like CPU requests, memory requests ensure the scheduler gives the pod a guaranteed amount of RAM. This helps avoid scenarios where too many memory-hungry pods are placed on one node, which could lead to OOM (Out-Of-Memory) kills or node instability if memory is overcommitted. Charts should specify memory requests for reliability.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Memory Limits&lt;/strong&gt; - Do the pods have memory limits? A memory limit puts an upper bound on memory usage for a container. This prevents a runaway process from consuming all available memory on the node.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Without a memory limit, a single container can trigger out-of-memory conditions that crash itself or even the node. Setting memory limits thus contains faults and improves resilience.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Liveness Probe&lt;/strong&gt; - Does the container include a liveness probe (heartbeat check)? Liveness probes allow Kubernetes to detect if an application has hung or crashed internally. If the liveness probe fails, Kubernetes will automatically restart the container[7][8].&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This self-healing mechanism is crucial for reliability, ensuring that issues like deadlocks or crashes don't go unnoticed.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Readiness Probe&lt;/strong&gt; (Usually N/A for DaemonSets; often no Service)- Does the container include a readiness probe? A readiness probe signals when a pod is ready to serve traffic. Kubernetes will not send traffic to a pod (for example, attach it to a Service load balancer) until its readiness probe succeeds.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This prevents sending requests to pods that are still initializing or are unhealthy[8]. In our context, having readiness probes means smoother rollouts and no premature traffic to unready pods, avoiding potential errors during startup or local disruptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Note:&lt;/strong&gt; &lt;em&gt;readiness can also fail after startup to indicate momentary unavailability; the pod will not be restarted as long as the liveness probe continues to succeed.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;PriorityClass&lt;/strong&gt; - Does the chart assign a PriorityClass to its pods? Priority classes determine the priority of pods for scheduling and eviction. Using a PriorityClass for critical workloads ensures that in resource crunch scenarios, &lt;strong&gt;lower-priority pods won't displace or interfere with more critical pods&lt;/strong&gt;[9].&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Essentially, it helps protect mission-critical applications from being preempted or starved by less important ones[9]. While not every application needs a custom priority, setting one for system-critical services can improve reliability during cluster stress.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Note&lt;/strong&gt;: &lt;em&gt;we present PriorityClass as informational and do not score it by default. But for Daemonset based charts they can be considered a reliability constraint.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  How did we score charts?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuk59shfeoh4yw50s9xfh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuk59shfeoh4yw50s9xfh.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each Helm chart was evaluated against the 9 scored criteria (all of the above except PriorityClass). For each scored criterion present, the chart earned 1 point. Thus, charts could score between 0 (none of the best practices present) and 9 (all scored practices present). We then categorized charts into reliability tiers based on their score: - &lt;strong&gt;"Reliable"&lt;/strong&gt; - Score of 7 or above (i.e., implementing at least ~75% of the scored practices). These charts have most of the important safeguards in place. &lt;strong&gt;"Moderate"&lt;/strong&gt; - Score of 4 to 6. These charts follow some best practices but lack others, indicating room for improvement. &lt;strong&gt;"High Risk"&lt;/strong&gt; - Score of 3 or below. Such charts miss the majority of reliability features, likely making them fragile in real-world conditions.&lt;/p&gt;

&lt;p&gt;It's important to note that a low score does not necessarily mean the software itself is bad; rather, it means the &lt;strong&gt;default Kubernetes manifests provided by the Helm chart might not ensure high availability or resilience&lt;/strong&gt;. Users could still deploy those applications reliably by tweaking configurations (e.g., enabling HPA or increasing replicas), but out-of-the-box, the chart might expose them to more risk.&lt;/p&gt;

&lt;p&gt;For this report, we opted not to add weights to the various safeguards.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx5hh30kcnpffyuk6ny7j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx5hh30kcnpffyuk6ny7j.png" alt=" " width="800" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Overall Reliability Scores&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Across the 105 Helm charts evaluated, the distribution of reliability scores was skewed toward the lower end. The &lt;strong&gt;mean score was ~3.98 out of 10&lt;/strong&gt;, and the &lt;strong&gt;median score was 4&lt;/strong&gt;, indicating that typically a chart only implements around four of the ten recommended reliability measures.&lt;/p&gt;

&lt;p&gt;This overall low average suggests that many popular Helm charts do not incorporate a comprehensive set of reliability features by default.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgmgtjreqf3m5mmc9nxx9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgmgtjreqf3m5mmc9nxx9.png" alt=" " width="800" height="823"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To put these results in perspective: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only &lt;strong&gt;18 charts (17.1%)&lt;/strong&gt; scored in the &lt;strong&gt;"Reliable" tier&lt;/strong&gt;, meeting 7 or more of the criteria. In fact, the highest score observed was 9/10 (no chart had a perfect 10). This means very few charts have almost all the best practices in place. The top scorers tend to be well-maintained projects that explicitly focus on robust deployments (examples are discussed later). &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;37 charts (35.2%)&lt;/strong&gt; fell into the &lt;strong&gt;"Moderate" tier&lt;/strong&gt; with scores 4-6. These charts include some reliability features but are missing many others. They might, for instance, have health probes configured but lack autoscaling and disruption budgets, or vice versa. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;50 charts (47.6%)&lt;/strong&gt; landed in the &lt;strong&gt;"High Risk" tier&lt;/strong&gt; with a score of 3 or below.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alarmingly, nearly half of the charts audited implement only a few (if any) of the reliability best practices. In fact, 10 charts scored &lt;strong&gt;0/10&lt;/strong&gt;, meaning they &lt;em&gt;did not&lt;/em&gt; include a single one of the checked reliability features in their default manifests.&lt;/p&gt;

&lt;p&gt;On the other hand, the relatively small fraction of charts in the "Reliable" tier demonstrates that &lt;strong&gt;it is feasible&lt;/strong&gt; for a Helm chart to be shipped with strong reliability guardrails so this is an attainable goal for chart maintainers. The findings suggest that there's significant room for improvement across the board, and users should not assume a chart is production-ready just because it's popular.&lt;/p&gt;

&lt;p&gt;In summary, the overall reliability state of Helm charts is &lt;strong&gt;middling to poor&lt;/strong&gt;, with a heavy tail of charts lacking critical features. Next, we delve into which specific reliability practices are most often absent, and which are more commonly implemented.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.prequel.dev/sign-up" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9u1wvkwir0oi5t00tkum.png" alt="CTA" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What's Missing Most Often&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fray097pf2f7nw1rztlsp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fray097pf2f7nw1rztlsp.png" alt=" " width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looking at the pass/fail rates for each of the 10 criteria gives insight into which reliability practices chart maintainers commonly omit. The following are the key criteria, ordered from &lt;strong&gt;most neglected&lt;/strong&gt; to most adopted, along with the percentage of charts that &lt;strong&gt;failed&lt;/strong&gt; each check in our audit (&lt;strong&gt;note&lt;/strong&gt;: for capability-style criteria like PDB/TopologySpread/HPA, we count them as present if found either in the default render or under a minimal HA-capability render):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Topology Spread Constraints - 93%&lt;/strong&gt; of charts &lt;em&gt;do not&lt;/em&gt; specify any topology spread constraints. This was the most glaring gap: only about 7% of charts had this configuration. Essentially, almost all charts do nothing to ensure pods are spread across multiple nodes or zones.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  As a result, if you deploy these charts, there's a high chance all replicas could land on a single node by default, making the application vulnerable to node-level failures.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Note:&lt;/strong&gt; &lt;em&gt;We didn't score podAntiAffinity. While it can reduce co-location, it often over‑constrains scheduling and can slow recovery during drains/outages. We focus on topologySpreadConstraints (more expressive and preferred) and may surface podAntiAffinity as informational in future iterations.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Horizontal Pod Autoscaler (HPA) - 75%&lt;/strong&gt; of charts lack an HPA. Three out of four charts do not provide an automated scaling policy. This means by default those applications will run a fixed number of replicas regardless of whether the charts had this configuration. Essentially, almost all charts do nothing to ensure pods are spread across multiple nodes or zones.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  As a result, if you deploy these charts, there's a high chance all replicas could land on a single node by default, making the application vulnerable to node-level failures. (We detect constraints both at the top level (spec.template) and in pod templates ( spec.topologySpreadConstraints.)load.&lt;/li&gt;
&lt;li&gt;  If there's a traffic surge or high workload, the application won't scale out to handle it, potentially leading to performance degradation or downtime. In our evaluation, an HPA with minReplicas ≥ 2 is considered to provide redundancy; the low inclusion rate suggests many charts expect users to enable scaling themselves.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;PodDisruptionBudget (PDB) - 74%&lt;/strong&gt; of charts do not define a PDB. This is another high-impact gap: roughly only one in four charts includes a PodDisruptionBudget. Without a PDB, there's no built-in protection against voluntary disruptions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The fact that most charts omit this means they are prone to downtime during routine operations like node rotation or cluster upgrades, unless the user manually adds a PDB.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;CPU Limits - 63%&lt;/strong&gt; of charts have no CPU limits on containers. Nearly two-thirds of charts do not cap CPU usage. While Kubernetes can still function without limits, the risk is that a container under heavy load could consume all CPU cycles on a node.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  This can cause &lt;em&gt;noisy neighbor&lt;/em&gt; issues and even lead to other critical pods getting starved. The audit shows many charts leave this unchecked.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Memory Limits - 60%&lt;/strong&gt; of charts lack memory limits. Similar to CPU limits, a significant portion don't set any max memory usage.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Without memory limits, a memory leak or spike in one container can trigger an OutOfMemory condition on the node, potentially killing not just that container but others on the node as well. Memory limits contain the impact of such issues to the offending pod. The lack of limits in 60% of charts suggests a prevalent oversight, possibly because setting a one-size-fits-all memory limit is tricky and maintainers opt not to set any - but at the cost of reliability.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;CPU Requests - 51%&lt;/strong&gt; of charts do not declare CPU requests. About half of the charts don't reserve CPU for their pods.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  This means the scheduler doesn't account for their CPU needs explicitly, which can lead to packing too many CPU-intensive pods on a node. Not having CPU requests can also degrade the effectiveness of autoscaling (HPA) because the HPA's decisions often rely on knowing the CPU utilization relative to requests. The fact that ~49% do set CPU requests is a mildly positive sign.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Memory Requests - 49%&lt;/strong&gt; of charts have no memory requests. This is in roughly the same range as CPU requests (just a hair better). About half the charts don't reserve memory.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Without memory requests, the scheduler might place too many memory-hungry pods together. However, the other ~51% do set memory requests, which indicates that at least for half the charts, basic resource reservations are considered.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Liveness Probes - 20%&lt;/strong&gt; of charts lack a liveness probe. Here we see a much better adoption: 80% include liveness probes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  This is encouraging, it suggests that the majority of chart maintainers recognize the importance of self-healing for their applications. The 20% missing probes might be either very simple apps that don't need it (though almost every app benefits from a liveness check) or just oversights.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Readiness Probes - 15%&lt;/strong&gt; of charts lack a readiness probe. This was the most well-adopted criterion: about 85% of charts have readiness probes configured.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Many chart authors seem to prioritize this, as it directly affects user experience during deployments/updates.&lt;/li&gt;
&lt;li&gt;  Readiness Probes - 15% of charts lack a readiness probe. This was the most well‑adopted criterion: about 85% of charts have&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Note:&lt;/strong&gt; &lt;em&gt;a portion of the remaining ~15% may not serve traffic directly (e.g., agents/Daemons without a Service, batch/cron jobs), so a readiness check may not be necessary for those workloads.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;PriorityClass - 15%&lt;/strong&gt; do not specify any PriorityClass (thus pods run at default priority). This criterion is a bit different from others because not every app truly needs a custom priority; it's more relevant for multi-tenant clusters or ensuring system-critical pods have higher priority.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The low adoption isn't as alarming as the others - it likely reflects that most charts use the default priority (which is fine for many cases). The 15% that do set a PriorityClass are usually charts for important infrastructure components (like ingress controllers, logging agents, etc.) where maintainers deemed it necessary to ensure those pods are less likely to be evicted or preempted.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;In summary, the &lt;strong&gt;most commonly missing features&lt;/strong&gt; were &lt;strong&gt;topology spread constraints, PodDisruptionBudgets, and autoscaling&lt;/strong&gt;, each absent in well over 70% of charts. On the flip side, &lt;strong&gt;readiness and liveness probes&lt;/strong&gt; were well-adopted by ~4 out of 5 charts, indicating that basic health monitoring is largely in place. Resource requests/limits showed a mixed picture - about half the charts enforce them, half don't.&lt;/p&gt;

&lt;p&gt;It's worth noting that some charts might intentionally omit certain measures/settings expecting the user to configure them (for example, an autoscaler might be left out if the application's scaling requirements vary widely between deployments). However, given Helm charts often aim to provide a reasonable default setup, it's generally better to include these reliability features disabled or set to sensible defaults (which users can override) than to leave them out entirely.&lt;/p&gt;

&lt;p&gt;These findings highlight areas where chart maintainers could improve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Implementing PodDisruptionBudgets&lt;/strong&gt; would greatly enhance resilience during cluster maintenance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adding Topology Spread Constraints&lt;/strong&gt; (even a simple zone spread) would add high availability for multi-node deployments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Including an HPA&lt;/strong&gt; (even off by default but available) would encourage autoscaling usage; setting minReplicas ≥ 2 under HPA provides redundancy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Setting resource requests/limits&lt;/strong&gt; (perhaps conservative defaults) would promote more consistent performance and avoid resource contention issues[6].&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exposing these controls as configurable values (with sensible defaults) raises the reliability baseline of the Helm ecosystem with minimal friction.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Reliability by Application Category&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8drto51b17r6wljvo0j9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8drto51b17r6wljvo0j9.png" alt=" " width="800" height="693"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We grouped the charts into broad categories (based on the primary domain or function of the application) to see if certain types of applications tend to be more reliably configured than others. The categories included &lt;strong&gt;Monitoring/Logging&lt;/strong&gt;, &lt;strong&gt;Security&lt;/strong&gt;, &lt;strong&gt;Networking&lt;/strong&gt;, &lt;strong&gt;Database&lt;/strong&gt;, &lt;strong&gt;Storage&lt;/strong&gt;, &lt;strong&gt;Streaming/Messaging&lt;/strong&gt;, &lt;strong&gt;Integration/Delivery (CI/CD)&lt;/strong&gt;, &lt;strong&gt;AI/Machine Learning&lt;/strong&gt;, and a few &lt;strong&gt;Uncategorized&lt;/strong&gt; (for charts that didn't clearly fit a single domain).&lt;/p&gt;

&lt;p&gt;There were some noticeable differences in average scores across these groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Streaming &amp;amp; Messaging&lt;/strong&gt; - Charts in this category (e.g. Apache Kafka, Pulsar, RabbitMQ) had the &lt;em&gt;highest average reliability score&lt;/em&gt;, around &lt;strong&gt;5.3/10&lt;/strong&gt;. This was the only category averaging above 5. A likely reason is that streaming systems are often stateful and critical, so their charts (especially Kafka's and Pulsar's) tend to incorporate features like PDBs and resource settings.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Databases&lt;/strong&gt; - Database charts (for systems like MySQL, PostgreSQL, MongoDB, etc.) also scored relatively well, averaging about &lt;strong&gt;4.4/10&lt;/strong&gt;. This was among the higher averages. Databases are stateful and often require careful handling of downtime, so we saw that many database charts include things like PDBs and requests/limits.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integration/CI-CD&lt;/strong&gt; - This category (which includes things like Argo CD, Jenkins, GitLab Runner, etc.) had a moderate-to-high average around &lt;strong&gt;4.2/10&lt;/strong&gt;. It's a small sample size, but notably charts like &lt;strong&gt;GitLab&lt;/strong&gt; and &lt;strong&gt;Harbor&lt;/strong&gt; (artifact registry, which we placed under integration/delivery) had decent scores (Harbor was 7, GitLab 7).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI / Machine Learning&lt;/strong&gt; - This is an interesting category. We grouped various machine learning tool charts (like Kubeflow, MLFlow, etc.) here. The average was roughly &lt;strong&gt;4.0/10&lt;/strong&gt;, about on par with the global average. We had a mix: &lt;strong&gt;Kubeflow's official chart&lt;/strong&gt; scored 8 (very good), but some others like smaller ML tools scored low.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Networking&lt;/strong&gt; - Charts providing networking infrastructure (e.g. ingress controllers like NGINX, CNI plugins like Calico, service meshes, etc.) averaged around &lt;strong&gt;3.9/10&lt;/strong&gt;. This is just below the overall average. Many networking-related charts turned out to be missing a number of best practices. It's somewhat surprising because one would expect networking components to be critical; the low scores might be because some networking daemons run as DaemonSets or have non-standard setups that our criteria didn't fully apply to (or were just not configured with those features).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt; - Charts for security tools (like Falco, cert-manager, external-secrets, etc.) averaged roughly &lt;strong&gt;3.7/10&lt;/strong&gt;. This was on the lower side. Notably, &lt;strong&gt;Falco's chart scored 0&lt;/strong&gt; (it lacked all the features), which is a big red flag since Falco itself is a tool for security monitoring. This suggests reliability configuration hasn't been a focus in some security tool charts, perhaps they assume a skilled operator will deploy and tune them, or just oversight.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Storage&lt;/strong&gt; - Storage system charts (e.g. Longhorn, OpenEBS, MinIO, etc.) were also below average, at around &lt;strong&gt;3.6/10&lt;/strong&gt;. It's somewhat concerning because storage systems are stateful and critical; one might hope their charts are highly robust.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Monitoring &amp;amp; Logging&lt;/strong&gt; - This was the &lt;strong&gt;lowest-scoring category&lt;/strong&gt;, averaging about &lt;strong&gt;3.36/10&lt;/strong&gt;. It also had the largest number of charts (since there are many monitoring/logging tools). A significant number of charts here had poor scores. &lt;strong&gt;Grafana Loki&lt;/strong&gt;, however, was an outlier with a 9 (which helped a bit). It's possible maintainers assume these tools run with a certain redundancy externally, or they simply haven't prioritized the reliability of the monitoring system itself. The irony is that tools used to monitor reliability of other apps were themselves often not configured reliably by default.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Uncategorized&lt;/strong&gt; - We had a small set of charts we labeled uncategorized (miscellaneous). Their average was around &lt;strong&gt;5.1/10&lt;/strong&gt;, interestingly high. This bucket included things like some operator frameworks or bundles that didn't fit elsewhere.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, these category-based observations indicate that &lt;strong&gt;stateful services (databases, streaming)&lt;/strong&gt; tend to have better reliability setups than many &lt;strong&gt;operational or add-on tools (monitoring, security)&lt;/strong&gt;. One reason could be that stateful applications &lt;em&gt;demand&lt;/em&gt; careful handling (you can't just casually restart a database without thinking of data consistency, etc.), so chart authors had to incorporate protections like PDBs. Meanwhile, things like metric collectors or log shippers, while also important, might be seen as easier to redeploy and thus chart authors were less strict about adding budgets or spreads.&lt;/p&gt;

&lt;p&gt;These differences highlight that if you are deploying certain types of applications, you should be especially vigilant. For example, if you deploy a &lt;strong&gt;monitoring stack&lt;/strong&gt;, double-check its chart for missing reliability configs (our data suggests it's likely missing a few).&lt;/p&gt;

&lt;p&gt;In short, while no category was perfect, &lt;strong&gt;some domains clearly lag in reliability configuration&lt;/strong&gt; (monitoring/logging and some infra tools), and users should plan to fortify those charts themselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Top Performing Charts (Examples of Good Practice)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuvx57t9nejtkgy69scd4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuvx57t9nejtkgy69scd4.png" alt=" " width="800" height="549"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Despite the generally low scores overall, we identified a set of charts that serve as &lt;strong&gt;positive examples&lt;/strong&gt; of how to package an application for reliability. These top performers managed to include most of the recommended best practices. Here are a few notable ones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Grafana Loki&lt;/strong&gt; - &lt;strong&gt;Score: 9/10.&lt;/strong&gt; This was the highest scoring chart in our audit. Loki (a log aggregation system) had all but one of the criteria present. It defined resource requests/limits, had both probes, included an HPA, set a PodDisruptionBudget, and even topology spread constraints.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Apache Kafka&lt;/strong&gt; - &lt;strong&gt;Score: 8/10.&lt;/strong&gt; Kafka is a critical streaming platform and its Helm chart scored very well. Included PDBs for brokers, resource requests/limits, and liveness/readiness probes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keycloak&lt;/strong&gt; - &lt;strong&gt;Score: 8/10.&lt;/strong&gt; Keycloak (an identity management service) also was configured with many best practices. It had health probes, resource management, PDB, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pulsar&lt;/strong&gt; - &lt;strong&gt;Score: 8/10.&lt;/strong&gt; Apache Pulsar, another streaming platform, did excellently as well. Similar to Kafka, its chart includes comprehensive settings. The Pulsar chart actually consists of multiple components (broker, zookeeper, bookkeeper), each handled carefully with appropriate configs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Kubeflow&lt;/strong&gt; - &lt;strong&gt;Score: 8/10.&lt;/strong&gt; Kubeflow (the machine learning toolkit) had an official chart that scored high. This is interesting because Kubeflow is a very complex system. Multiple services configured with PDBs, resource requests/limits, and liveness/readiness probes; HPA is supported on components that can scale.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sentry&lt;/strong&gt; - &lt;strong&gt;Score: 8/10.&lt;/strong&gt; Sentry (error tracking platform) also was among the top. Sentry being an operational tool that teams rely on, it's good that its helm chart tries to keep it highly available (for example, ensuring the web and worker pods have proper probes and budgets).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitLab&lt;/strong&gt; - &lt;strong&gt;Score: 7/10.&lt;/strong&gt; GitLab's chart (particularly the omnibus or the cloud-native GitLab chart) scored in the reliable tier as well. Given the number of sub‑components, this reflects broad coverage of probes, resource controls, and PDBs, with two criteria not satisfied in our scoring.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OpenEBS&lt;/strong&gt; - &lt;strong&gt;Score: 7/10.&lt;/strong&gt; OpenEBS (a storage orchestrator) was a bright spot in the storage category, scoring 7. It Included PDBs (important for data pods) and resource controls; a stronger showing within the storage category. It stands in contrast to Longhorn's chart (which scored 0), showing not all storage projects neglect reliability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Harbor&lt;/strong&gt; - &lt;strong&gt;Score: 7/10.&lt;/strong&gt; Harbor (container registry) is another complex application that scored well. PDBs and resource settings were present across core components (database, core, job service, etc.).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These top charts illustrate that &lt;strong&gt;high reliability scores are achievable&lt;/strong&gt;. They typically come from either: well-known companies/communities that enforce good devops practices in their charts (e.g., Grafana on Loki), or inherently critical software whose maintainers know the users will demand a resilient setup (databases, security/auth services, etc.).&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Poorest Scoring Charts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqmohqlwyjex379mljszq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqmohqlwyjex379mljszq.png" alt=" " width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the other end of the spectrum, we saw quite a few charts with minimal or no reliability features. It's important to highlight some of these &lt;strong&gt;not to single them out for blame, but to illustrate common patterns of omission&lt;/strong&gt; and to caution users of these charts to take extra care. Here are a few of the lowest-scoring examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Falco&lt;/strong&gt; - &lt;strong&gt;Score: 0.&lt;/strong&gt; Falco is a popular security monitoring tool (runtime security). Shockingly, its Helm chart did not include any of the checked reliability configurations. Users of Falco should be aware that they might need to add their own reliability settings. It's a classic case where perhaps the focus was on the security functionality of the app, and the chart packaging received less attention to reliability.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Note:&lt;/strong&gt; Deploys as a DaemonSet by default; PDB/TopologySpread/HPA/Replicas are N/A.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Longhorn&lt;/strong&gt; - &lt;strong&gt;Score: 0.&lt;/strong&gt; Longhorn is a cloud-native distributed storage solution. A zero score here is concerning because storage systems are complex and not having (for example) a PodDisruptionBudget for the storage pods could lead to data unavailability during maintenance.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Note:&lt;/strong&gt; Mixed workloads (Deployments/StatefulSets/DaemonSets). DS components won't use PDB/Spread/HPA;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Fluent Bit&lt;/strong&gt; - &lt;strong&gt;Score: 0.&lt;/strong&gt; Fluent Bit is a log forwarding agent. Its chart scoring 0 indicates it likely runs as a DaemonSet with no added frills. Logging pipelines are critical for SRE observability, so keeping them reliable is important.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Note&lt;/strong&gt;: Deploys as a DaemonSet by default; PDB/TopologySpread/HPA/Replicas are N/A.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Calico (Tigera Operator)&lt;/strong&gt; - &lt;strong&gt;Score: 0.&lt;/strong&gt; Calico is a networking CNI for Kubernetes, and it often runs via an operator.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Grafana Alloy&lt;/strong&gt; - &lt;strong&gt;Score: 0.&lt;/strong&gt; Grafana "Alloy" is a lesser-known component (possibly a plugin or sidecar). It scoring 0 again emphasizes that even within a known vendor's ecosystem, not every chart is equal - Loki's was excellent, but this one was not.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Note: Typically runs as a DaemonSet for node telemetry; apply DS caveats (PDB/TopologySpread/HPA/Replicas are N/A).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Prometheus Node Exporter&lt;/strong&gt; - &lt;strong&gt;Score: 0.&lt;/strong&gt; The node-exporter chart (listed as part of prometheus-community) also had none of the reliability features. Node-exporter runs as a DaemonSet on each node to collect metrics. Similar to Fluent Bit, running as DaemonSet might have led maintainers to not include budgets or autoscaling (since those don't apply the same way)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Note: Deploys as a DaemonSet by default; PDB/TopologySpread/HPA/Replicas are N/A.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Actions Runner Controller&lt;/strong&gt; - &lt;strong&gt;Score: 0.&lt;/strong&gt; This is a chart for a GitHub Actions self-hosted runner controller. It scoring 0 means it lacks any reliability config; as an operator-like component, it probably wasn't given PDBs or special priority.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;AMD GPU and Intel GPU plugins&lt;/strong&gt; - &lt;strong&gt;Score: 0.&lt;/strong&gt; We saw charts for GPU device plugins (for AMD and Intel GPUs) also with zero scores. These are deployed as DaemonSets to advertise GPUs to the cluster. They had no reliability features in charts, which might be because they're expected to be super lightweight.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Note: Deploys as a DaemonSet by default; PDB/TopologySpread/HPA/Replicas are N/A.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;In total, we had &lt;strong&gt;10 charts with 0 score&lt;/strong&gt; (some we described above). Many others were just slightly above 0 (score 1 or 2).&lt;/p&gt;

&lt;p&gt;Common patterns among low-scoring charts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Many are infrastructure add-ons (operators, agents, plugins)&lt;/strong&gt; rather than end-user applications. It seems chart maintainers for these system-level tools often keep the chart minimal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DaemonSet workloads --&lt;/strong&gt; Several 0‑score charts are DaemonSets (e.g., Fluent Bit, node‑exporter, GPU plugins). For DS, controls like PDB/TopologySpread/HPA/Replicas are generally not applicable; what matters is CPU/Memory requests and limits, Liveness probes, PriorityClass, and DS rollingUpdate settings.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Relatively newer or niche projects&lt;/strong&gt; - Some low performers are not as mature or widely used, perhaps, so their charts haven't undergone rigorous production-hardening by the community.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For users, the takeaway is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;if you are using one of these low-scoring charts (or any chart that hasn't clearly advertised its reliability features), do not deploy it blindly in production.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At a minimum, consider:&lt;/p&gt;

&lt;p&gt;- Checking carefully the values to define PodDisruptionBudget, Topology Spread Constraint and HPA wherever applicable.&lt;/p&gt;

&lt;p&gt;- Setting resource requests/limits via values overrides.&lt;/p&gt;

&lt;p&gt;- Adding an HPA (if the app would benefit from scaling).&lt;/p&gt;

&lt;p&gt;- Ensuring you attach liveness/readiness probes (maybe via chart values or a side patch if not supported natively).&lt;/p&gt;

&lt;p&gt;- If it's a critical infrastructure component, possibly assign it a PriorityClass to avoid eviction (for example, set it to the system-cluster-critical priority if appropriate, or create a custom one).&lt;/p&gt;

&lt;p&gt;Basically, use the findings here as a checklist against any Helm chart you deploy: check if it has these items, and if not, you might need to supply them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwxa19or0s8nbyh7qkl5p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwxa19or0s8nbyh7qkl5p.png" alt=" " width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion and Recommendations&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This reliability audit of Helm charts has revealed a sizable gap between the reliability best practices that we &lt;em&gt;know&lt;/em&gt; are important and what is actually implemented in many Helm charts today. While a few charts exemplify excellence in configuration, the majority have significant room for improvement. At the same time, we acknowledge that different use cases require different safeguards.&lt;/p&gt;

&lt;p&gt;In closing, we summarize recommendations for both &lt;strong&gt;chart users (operators)&lt;/strong&gt; and &lt;strong&gt;Helm chart maintainers&lt;/strong&gt; and to act on these insights, and how tools like Preq/Prequel can assist in catching unmitigated risks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Chart Maintainers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Embed Reliability Best Practices by Default:&lt;/strong&gt; If you maintain a Helm chart, consider this an encouragement to bake in more of these features. These should be part of the "standard equipment" of your chart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Provide Autoscaling Options:&lt;/strong&gt; Where applicable, provide an HPA in the chart (it can be off by default, but ready to enable). This signals to users that your application supports scaling and encourages them to use it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Don't Skimp on Probes:&lt;/strong&gt; Ensure every long-running pod has a liveness and readiness probe defined. This is one area many charts did well, and all should. It significantly increases resiliency&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set Resource Requests/Limits:&lt;/strong&gt; We recognize that picking default resource values can be tricky (since workloads differ), but providing reasonable defaults is better than none.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use PriorityClass for Critical Components:&lt;/strong&gt; If your chart is for a system-critical service (operators, controllers, ingress, etc.), consider assigning a high PriorityClass (or at least make it configurable).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test Disruption Scenarios:&lt;/strong&gt; As a maintainer, test how your chart behaves during common scenarios: node drains, upgrades (in case of stateful applications if someone does helm upgrade, do all pods restart at once?), high load (does CPU spike and if so, is HPA there to help?), etc. This experiential testing can highlight missing pieces.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Leverage Community Standards:&lt;/strong&gt; The Kubernetes community (and projects like the CNCF) often provide guidelines or even boilerplate for these configurations. Following these guides can serve as a checklist for your chart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Document appropriately:&lt;/strong&gt; Clear and comprehensive documentation is essential for helping end-users configure reliability settings that align with their specific needs and operational constraints. Good documentation not only enhances the experience for maintainers but also ensures a smooth experience for end-users.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For Helm Chart Users (Deployers):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Review Charts Before Production Use:&lt;/strong&gt; Do not assume a Helm chart is production-ready. As this audit shows, many are not, in terms of reliability. Before deploying, &lt;strong&gt;audit the chart's values and manifests&lt;/strong&gt; yourself.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Override and Augment Configurations:&lt;/strong&gt; The beauty of Helm is you can supply custom values. Use this to your advantage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Consider writing an &lt;strong&gt;overlay chart or a wrapper&lt;/strong&gt; that adds missing pieces.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Note:&lt;/strong&gt; &lt;em&gt;overlays/wrappers break the "least knowledge" principle. You can't rely solely on upstream SemVer/upgrade notes. Treat it like a maintained fork.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Contribute Back Improvements:&lt;/strong&gt; If you as a user had to add reliability configs to make a chart stable, consider contributing that back to the chart's repository (submit a pull request or issue). Prefer upstreaming first; use overlays only when upstream changes are not feasible in the short term.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use Detection Tools:&lt;/strong&gt; Consider using tools that can scan your cluster or manifests for missing best practices, essentially doing what this audit did, but for your environment. Tools like Prequel (start for free) can be integrated into CI pipelines or run against your Helm releases continuously to flag if, say, a new deployment is missing a liveness probe or PDB. In an enterprise setting, Prequel could be set up as a guardrail: whenever a new chart is deployed, it checks the CRE rules and alerts if something critical is absent. This kind of automation ensures that even if a maintainer hasn’t provided a feature, you catch it before it causes an incident.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2e4021e1cii5k2invfga.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2e4021e1cii5k2invfga.png" alt=" " width="800" height="1037"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Role of Continuous Reliability Scanning:&lt;/strong&gt; Finally, it's worth re-emphasizing the value of continuous monitoring using tools like Prequel. Just as security scanning of images and CVEs has become a standard part of DevOps, &lt;strong&gt;reliability scanning is emerging as a complementary practice&lt;/strong&gt;. By leveraging the &lt;a href="https://docs.prequel.dev/cres/commercial" rel="noopener noreferrer"&gt;[CRE rule set]&lt;/a&gt; (which encapsulates knowledge of failure patterns), teams can detect misconfigurations early.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.prequel.dev/sign-up" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9u1wvkwir0oi5t00tkum.png" alt="CTA" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The journey to reliable Kubernetes deployments is a shared responsibility between chart creators and users. Helm charts are a powerful vehicle for distributing applications, but they should carry not just the app itself, but also the wisdom of running it reliably. Our research is designed to bring awareness to the risk so that teams can fully embrace that philosophy. By implementing the recommendations above, we can collectively raise the reliability bar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.prequel.dev/" rel="noopener noreferrer"&gt;[1] Prequel Documentation‍&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/cloud-sky-ops/post-210-reliability-by-design-probes-poddisruptionbudgets-and-topology-spread-constraints-473d"&gt;[2] [3] [4] [7] Post 2/10 — Reliability by Design: Probes, PodDisruptionBudgets, and Topology Spread Constraints - DEV Community‍&lt;/a&gt;&lt;br&gt;
&lt;a href="https://kubernetes.io/docs/concepts/services-networking/" rel="noopener noreferrer"&gt;[5] Services, Load Balancing, and Networking‍&lt;/a&gt;&lt;br&gt;
&lt;a href="https://kubernetes.io/docs/concepts/services-networking/" rel="noopener noreferrer"&gt;[6] [8] Kubernetes Best Practices for Reliability‍&lt;/a&gt;&lt;br&gt;
&lt;a href="https://cloud.ibm.com/docs/openshift?topic=openshift-pod_priority" rel="noopener noreferrer"&gt;[9] IBM Cloud Docs‍&lt;/a&gt;&lt;br&gt;
&lt;a href="https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/" rel="noopener noreferrer"&gt;[10] Horizontal Pod Autoscaling | Kubernetes&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>reliability</category>
      <category>sre</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Community: The 100% Open-Source AI Stack That Automates My Business, and Tricks for Troubleshooting It</title>
      <dc:creator>Lyndon Brown</dc:creator>
      <pubDate>Wed, 08 Oct 2025 22:26:13 +0000</pubDate>
      <link>https://dev.to/lyndon_brown_/community-the-100-open-source-ai-stack-that-automates-my-business-and-tricks-for-troubleshooting-1dad</link>
      <guid>https://dev.to/lyndon_brown_/community-the-100-open-source-ai-stack-that-automates-my-business-and-tricks-for-troubleshooting-1dad</guid>
      <description>&lt;p&gt;Most teams don't need a full-fledged "AI platform" to automate everyday workflows. You need a reliable way to trigger automation jobs, call a model, keep a little context, and deliver results. That's it.&lt;/p&gt;

&lt;p&gt;In this guide I'll show my practical, open-source AI stack for automating my business workflows. For me, it was important for my stack to be 100% open source and self-hosted. There are certainly shortcuts you can take with commercial LLMs or other components.&lt;/p&gt;

&lt;p&gt;In short, I landed on n8n for orchestration, Ollama for LLM server, and Postgres + pgvector for memory/RAG.&lt;/p&gt;

&lt;p&gt;I also developed a simple deployment playbook with k8s extensibility and tips for keeping it reliable and healthy as you go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why an Open-Source stack
&lt;/h2&gt;

&lt;p&gt;If you're handling customer data, internal docs, or anything with compliance implications, running locally or on your own cloud removes a ton of uncertainty. With this stack, your prompts, retrieved snippets, and outputs live inside your network, not on somebody else's infrastructure. You can log exactly what you want, keep tokens from leaking, and reason about costs in traditional terms (CPU/RAM/disk) instead of foggy per-token math.&lt;/p&gt;

&lt;p&gt;There's also the control aspect. Open tools are swappable. Don't like the model? Pull a different one. Need to move from a laptop to on-prem? Bring your Kubernetes manifests and go. And because these projects are community-driven, you can read the code, file issues, or extend them when you bump into edge cases, no waiting for a vendor.&lt;/p&gt;

&lt;p&gt;Oh, yeah, and for me cost mattered here.&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple open-source AI stack that just works
&lt;/h2&gt;

&lt;p&gt;At a high level, the flow is straightforward: a trigger fires in n8n (a webhook, a cron, or an event); you fetch context from APIs or files; you optionally search prior knowledge in Postgres + pgvector; you call the model via Ollama; then you save results and push them to Slack, email, the CRM, or a dashboard. That single loop covers a surprising amount of basic business flows like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sending a daily team update&lt;/li&gt;
&lt;li&gt;Sorting and replying to customer support requests&lt;/li&gt;
&lt;li&gt;Enriching lead details before they go into the CRM&lt;/li&gt;
&lt;li&gt;Turning meeting transcripts into notes, or&lt;/li&gt;
&lt;li&gt;Answering questions about company policies&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why these three?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;n8n&lt;/strong&gt; gives you a visual, testable pipeline with retries, branching, and a good set of built-in nodes. You can keep 90% of the logic declarative and drop into a "Code" node only where it helps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; is one of the most popular low-friction platforms to serve local models: one command to pull, a tiny HTTP API to call. No GPU required for small/quantized models; if you do have one, it'll happily use it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Postgres + pgvector&lt;/strong&gt; turns your database into a memory store. You can keep workflow state, results, and embeddings in one place, with real indexing and backups, no extra vector service to run.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Do you really need LangChain / AutoGPT / vLLM?
&lt;/h3&gt;

&lt;p&gt;These are great AI tools, but you probably don't need them to add value to your workflow on day one.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LangChain&lt;/strong&gt; is great if you're building complex chains, tool routing, or evaluators as a codebase of their own. If your flows are mostly linear ("get data - retrieve context - prompt - send"), n8n's nodes plus a small Code step are usually simpler to reason about and maintain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AutoGPT&lt;/strong&gt; (or other agent frameworks) is useful when the task is genuinely open-ended and needs autonomous planning ("research X, compare Y, produce Z unless blocked"). For business automations, most tasks are bounded: summarize, classify, extract, transform. Agentic loops can add latency and instability you don't need yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;vLLM&lt;/strong&gt; is a fantastic serving stack when throughput, long context, or GPU batching are your constraints. If you're running a handful of concurrent automations, Ollama is much easier operationally.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rule of thumb: begin with n8n + Ollama + pgvector. If a real bottleneck appears, too many concurrent requests, prompts that need long contexts, or tasks that require autonomous planning then layer on the specialized tool that solves that bottleneck and nothing else.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Workflow Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frd15xqxs7tud8ae5seei.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frd15xqxs7tud8ae5seei.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In practice you'll add a few niceties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keep prompts tidy&lt;/strong&gt;: write down a handful of prompt templates you actually use (for summaries, classifications, replies, etc.) and save them in Postgres.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid duplicates&lt;/strong&gt;: if you run daily jobs, store a hash of the input. If you've already seen it, skip re-processing. This saves time and avoids sending the same Slack message or email twice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log what happens&lt;/strong&gt;: after each step, record start time, end time, and status in the database. When something feels slow or fails silently, you'll have a clear history instead of guessing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Run it locally (Docker Quick Start)
&lt;/h2&gt;

&lt;p&gt;You can run the stack locally in 10 minutes with Docker. We'll run everything in containers. Postgres + pgvector, n8n, and Ollama, so n8n can call the model at &lt;a href="http://ollama:11434" rel="noopener noreferrer"&gt;http://ollama:11434&lt;/a&gt; on the internal Docker network.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Docker Desktop (or Docker Engine) with Compose v2&lt;/li&gt;
&lt;li&gt;Optional: psql client for quick DB checks&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1) Project layout
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ai-stack/&lt;span class="o"&gt;{&lt;/span&gt;pg-data,n8n-data,init&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;ai-stack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create two files:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;docker-compose.yml&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;postgres&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pgvector/pgvector:pg16&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aiuser&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;supersecret&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ai&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5432:5432"&lt;/span&gt;            &lt;span class="c1"&gt;# change left side if 5432 is busy on host&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./pg-data:/var/lib/postgresql/data&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./init:/docker-entrypoint-initdb.d&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CMD-SHELL"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pg_isready&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-U&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;aiuser&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-d&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ai"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
      &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;

  &lt;span class="na"&gt;n8n&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;n8nio/n8n:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5678:5678"&lt;/span&gt;            &lt;span class="c1"&gt;# change left side if 5678 is busy on host&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DB_TYPE=postgresdb&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DB_POSTGRESDB_HOST=postgres&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DB_POSTGRESDB_PORT=5432&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DB_POSTGRESDB_DATABASE=n8n&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DB_POSTGRESDB_USER=aiuser&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DB_POSTGRESDB_PASSWORD=supersecret&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;N8N_BASIC_AUTH_ACTIVE=true&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;N8N_BASIC_AUTH_USER=admin@example.com&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;N8N_BASIC_AUTH_PASSWORD=changeme&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;N8N_DIAGNOSTICS_ENABLED=false&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;N8N_RUNNERS_ENABLED=true&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;postgres&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service_healthy&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./n8n-data:/home/node/.n8n&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;

  &lt;span class="na"&gt;ollama&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ollama/ollama:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;11434:11434"&lt;/span&gt;          &lt;span class="c1"&gt;# change left side if 11434 is busy on host&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./models:/root/.ollama&lt;/span&gt; &lt;span class="c1"&gt;# cache models on your disk&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CMD"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/bin/sh"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-c"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;curl&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-sf&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;http://localhost:11434/api/tags&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;||&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;exit&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
      &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;init/00-init.sql&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- DB for n8n to store workflows/executions&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;n8n&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="k"&gt;OWNER&lt;/span&gt; &lt;span class="n"&gt;aiuser&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Enable vector in 'ai' DB and a tiny log table&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="k"&gt;connect&lt;/span&gt; &lt;span class="n"&gt;ai&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;EXTENSION&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;llm_runs&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;BIGSERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;prompt&lt;/span&gt;     &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;model&lt;/span&gt;      &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;response&lt;/span&gt;   &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;latency_ms&lt;/span&gt; &lt;span class="nb"&gt;INTEGER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="n"&gt;TIMESTAMPTZ&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bring the stack up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2) Pull a small model (inside the Ollama container)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; ollama ollama pull llama3.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sanity checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;list models (in container)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; ollama curl &lt;span class="nt"&gt;-s&lt;/span&gt; http://localhost:11434/api/tags | jq &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;check pgvector is enabled
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;psql &lt;span class="nt"&gt;-h&lt;/span&gt; localhost &lt;span class="nt"&gt;-U&lt;/span&gt; aiuser &lt;span class="nt"&gt;-d&lt;/span&gt; ai &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"SELECT extname FROM pg_extension;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open n8n at &lt;a href="http://localhost:5678" rel="noopener noreferrer"&gt;http://localhost:5678&lt;/a&gt;. On first visit, you'll see a basic-auth prompt (&lt;a href="mailto:admin@example.com"&gt;admin@example.com&lt;/a&gt; / changeme), then n8n will ask you to create the Owner account (email/password).&lt;/p&gt;

&lt;h2&gt;
  
  
  Reliability Issues - what it breaks and how to stay ahead of it quickly
&lt;/h2&gt;

&lt;p&gt;Self-hosting open source projects definitely comes with its own challenges. You are on the hook to keep it up and running. There is no support team to call.&lt;/p&gt;

&lt;p&gt;Here are some of the gotchas I ran into and how I handle them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tool Reliability gotchas &amp;amp; fixes
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Issues &amp;amp; Fixes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;n8n&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- Long LLM calls can hit step timeouts which split into smaller steps; add retries with jitter.&lt;br&gt;- Webhooks may drop chunky payloads so raise body-size limits at ingress/reverse proxy.&lt;br&gt;- Retries without persistent storage can lose inputs, persist inbound payloads to Postgres first, then process.&lt;br&gt;- Monitor execution latency and failure rates; limit per-node timeouts sensibly.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Postgres + pgvector&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- Queries failing because pgvector not enabled; Run CREATE EXTENSION vector; once per database.&lt;br&gt;- Vector searches feel slow; Add a vector index (IVFFLAT or HNSW), keep your top-k small (say 5–20), and do routine VACUUM/ANALYZE.&lt;br&gt;- Too many connections causing random timeout; Add PgBouncer in front of Postgres and keep n8n's pool small.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ollama&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- First-run model pulls are slow/flaky; Pre-pull models on deploy and a tiny warm-up prompt after start&lt;br&gt;- Runs out of memory on laptops/containers; Use smaller/quantized models, keep prompts short, and give Docker enough RAM/swap.&lt;br&gt;- Port/DNS weirdness; Remap the host port in Compose file.&lt;br&gt;- "Model not found" errors; Check /api/tags to see what's loaded, and ollama pull  on container startup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Detect issues early with community CREs (and preq)
&lt;/h2&gt;

&lt;p&gt;The reliability community has started to maintain a community-driven catalog of failure patterns called CREs(Common Reliability Enumerations) so you don't have to rediscover them in production. Each CRE includes detection as code.&lt;/p&gt;

&lt;p&gt;You can run these with preq (pronounced preek), the open source reliability problem detector, to turn noisy logs into clear, actionable signals.&lt;/p&gt;

&lt;p&gt;The public catalog covers dozens of popular technologies, from Kubernetes and databases to application runtimes. Here are a few relevant ones my AI stack or similar ones:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CRE&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;What it detects&lt;/th&gt;
&lt;th&gt;Quick mitigation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CRE-2025-0179&lt;/td&gt;
&lt;td&gt;n8n&lt;/td&gt;
&lt;td&gt;Items disappear between nodes in long workflows, causing silent data loss and incomplete runs.&lt;/td&gt;
&lt;td&gt;Add item-count checks, enable detailed logging, split long workflows, and use error workflows to capture failures.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRE-2025-0200&lt;/td&gt;
&lt;td&gt;AutoGPT&lt;/td&gt;
&lt;td&gt;AutoGPT loops while debugging itself, consuming tokens and memory until it crashes.&lt;/td&gt;
&lt;td&gt;Detect loops, cap depth and tokens, add circuit breakers, and auto-stop runaway agents.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRE-2025-0137&lt;/td&gt;
&lt;td&gt;Kubernetes Runtime&lt;/td&gt;
&lt;td&gt;A pod exceeds its memory limit and is killed, often showing up as CrashLoopBackOff.&lt;/td&gt;
&lt;td&gt;Increase memory limits, profile for leaks, tune heap/GC, use VPA, and add memory alerts.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRE-2025-0071&lt;/td&gt;
&lt;td&gt;Kubernetes&lt;/td&gt;
&lt;td&gt;CoreDNS has no healthy pods, leading to cluster-wide DNS failures.&lt;/td&gt;
&lt;td&gt;Check pods and logs, scale replicas, restart rollout, and confirm kube-dns endpoints.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRE-2025-0077&lt;/td&gt;
&lt;td&gt;Postgres&lt;/td&gt;
&lt;td&gt;Postgres cannot extend files because the disk is full, blocking new writes.&lt;/td&gt;
&lt;td&gt;Free space, clean old data, run vacuum, expand disk size, and set up disk usage alerts.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You can wire detections to Slack, email, or even Jira with a short runbook ("what it means" and "what to do") to make fixes faster.&lt;/p&gt;

&lt;p&gt;If you are setting up this stack, or your own, set aside 10 minutes to &lt;a href="https://docs.prequel.dev/install" rel="noopener noreferrer"&gt;download preq and run it&lt;/a&gt;. It's open source, and it will save you from the dreaded "why did this silently fail?" mornings. Begin with the n8n data-loss rule, a basic Kubernetes exit code/DNS rule if you are running clusters, and a Postgres disk or connections check. You can always add more as your workflows grow.&lt;/p&gt;

&lt;p&gt;👉 Explore the full &lt;a href="https://github.com/prequel-dev/cre" rel="noopener noreferrer"&gt;CRE catalog&lt;/a&gt;; try out &lt;a href="https://github.com/prequel-dev/preq" rel="noopener noreferrer"&gt;preq&lt;/a&gt;, and if you find it useful, don't forget to ⭐ the repo to support the community. : )&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;n8n – docs: &lt;a href="https://n8n.io/docs" rel="noopener noreferrer"&gt;https://n8n.io/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Ollama – repo: &lt;a href="https://github.com/ollama/ollama" rel="noopener noreferrer"&gt;https://github.com/ollama/ollama&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Postgres + pgvector – &lt;a href="https://github.com/pgvector/pgvector" rel="noopener noreferrer"&gt;https://github.com/pgvector/pgvector&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Kubernetes – &lt;a href="https://kubernetes.io/docs/home/" rel="noopener noreferrer"&gt;https://kubernetes.io/docs/home/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CREs (Common Reliability Enumerations) – &lt;a href="https://github.com/prequel-dev/cre" rel="noopener noreferrer"&gt;https://github.com/prequel-dev/cre&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Preq (run CREs) – &lt;a href="https://github.com/prequel-dev/preq" rel="noopener noreferrer"&gt;https://github.com/prequel-dev/preq&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>automation</category>
    </item>
    <item>
      <title>How I find and fix Kubernetes Exit Codes and Misconfigurations for free</title>
      <dc:creator>Lyndon Brown</dc:creator>
      <pubDate>Fri, 12 Sep 2025 14:37:15 +0000</pubDate>
      <link>https://dev.to/lyndon_brown_/how-i-find-and-fix-kubernetes-exit-codes-and-misconfigurations-for-free-18i</link>
      <guid>https://dev.to/lyndon_brown_/how-i-find-and-fix-kubernetes-exit-codes-and-misconfigurations-for-free-18i</guid>
      <description>&lt;p&gt;Kubernetes is powerful, but troubleshooting issues in a live cluster can be painful. In a complex deployment, critical warning signs often hide in thousands of log lines and events. What if we could surface these reliability issues before they take applications down?&lt;/p&gt;

&lt;p&gt;Preq (pronounced "preek") is an open-source tool that brings a proactive approach to Kubernetes troubleshooting. It is a reliability problem detector that checks your cluster's logs, events, and configurations against a community-driven catalog of failure patterns [1]. Using Preq, you can monitor your cluster and catch misconfigurations, anti-patterns, or bugs early, instead of discovering them during a 2 AM incident [1].&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing preq via Krew
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.prequel.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;preq&lt;/strong&gt;&lt;/a&gt; is distributed as a kubectl plugin, making it easy to install through the Kubernetes Krew plugin manager. First, ensure you have Krew set up (if not, install it from the &lt;a href="https://krew.sigs.k8s.io/docs/user-guide/setup/install/" rel="noopener noreferrer"&gt;official docs&lt;/a&gt;). Then install Preq with a single command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl krew &lt;span class="nb"&gt;install &lt;/span&gt;preq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Within seconds, the plugin is ready to use[1]. There's no extra configuration needed. Preq ships with the latest common reliability enumeration (CRE) rule packages baked in. It auto-updates its rules so you're always scanning for the newest issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running Kubectl preq from the CLI
&lt;/h2&gt;

&lt;p&gt;Once installed, you can run Preq directly via kubectl to check various Kubernetes resources and their logs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pods:&lt;/strong&gt; Scan an individual pod's logs and related events. For example, &lt;code&gt;kubectl preq my-pod-abc123&lt;/code&gt; will fetch that pod's logs and events, then compare them against the CRE rule library. [1]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Services:&lt;/strong&gt; Running &lt;code&gt;kubectl preq service/my-service&lt;/code&gt; triggers Preq to assess the pods behind that Service. While Services themselves don't have logs, Preq will identify the endpoints/pods for the service and check their logs and events for known issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jobs and CronJobs:&lt;/strong&gt; Run Preq on a Job or on pods created by a CronJob to inspect execution logs and events[12].&lt;/p&gt;

&lt;p&gt;Under the hood, the Preq plugin uses Kubernetes APIs. This means you can run Preq on any resource type that has associated logs or events, giving you a flexible "detective" for your cluster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Preq with ConfigMaps and Events
&lt;/h2&gt;

&lt;p&gt;The current release of Preq primarily targets logs and manifests, but you can also leverage it for configuration files and cluster events with a little creativity.&lt;/p&gt;

&lt;h3&gt;
  
  
  ConfigMaps
&lt;/h3&gt;

&lt;p&gt;Directly scan a ConfigMap with the plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl preq &lt;span class="nt"&gt;-n&lt;/span&gt; &amp;lt;namespace&amp;gt; configmap/&amp;lt;name-of-config-map&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Kubernetes events
&lt;/h3&gt;

&lt;p&gt;Use this feeder to stream a timestamp and the raw event into Preq:&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 events &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.items[] | "\(.metadata.creationTimestamp) \(tojson)"'&lt;/span&gt; | kubectl preq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Other workload configurations beyond ConfigMaps
&lt;/h3&gt;

&lt;p&gt;Use this workaround to feed deployments and similar manifests as compact JSON, stamped with a single UTC timestamp per line:&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 &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"1s/^/&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; +&lt;span class="s2"&gt;"%Y-%m-%dT%H:%M:%SZ"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; /"&lt;/span&gt; | kubectl preq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Example CREs
&lt;/h2&gt;

&lt;p&gt;We'll highlight a few Common Reliability Enumerations created by community members[2][3][4][5]:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CRE&lt;/th&gt;
&lt;th&gt;What breaks&lt;/th&gt;
&lt;th&gt;Signals you will see&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://docs.prequel.dev/cres/public/cre-2025-0119" rel="noopener noreferrer"&gt;CRE-2025-0119&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Too many pods down during an update&lt;/td&gt;
&lt;td&gt;Rollout stalls, unavailable replicas, PDB budget exceeded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://docs.prequel.dev/cres/public/cre-2025-0071" rel="noopener noreferrer"&gt;CRE-2025-0071&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Cluster DNS resolution fails when CoreDNS has no ready pods or endpoints&lt;/td&gt;
&lt;td&gt;CoreDNS availableReplicas at zero, kube dns endpoints empty, pods in CrashLoopBackOff, CoreDNS logs show errors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://docs.prequel.dev/cres/public/cre-2025-0048" rel="noopener noreferrer"&gt;CRE-2025-0048&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Worker node enters NotReady because control plane cannot resolve the node's FQDN&lt;/td&gt;
&lt;td&gt;Node status shows NotReady without resource pressure, control plane logs may show hostname resolution errors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://docs.prequel.dev/cres/public/cre-2025-0125" rel="noopener noreferrer"&gt;CRE-2025-0125&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Kubelet crashes under rapid pod launches causing node NotReady and full node level outage with pod evictions&lt;/td&gt;
&lt;td&gt;Node NotReady, mass pod evictions and rescheduling, kubelet logs show panic in EventedPLEG evented.go&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Exit Code CREs: Crashes and Their Causes (137, 127, 134, 139)
&lt;/h2&gt;

&lt;p&gt;Now let's talk about a different kind of problem: when your containers keep exiting with mysterious status codes. Preq includes CRE rules(7) for common exit codes to help pinpoint why a container crashed. Let's break down the usual suspects:&lt;/p&gt;

&lt;h3&gt;
  
  
  Exit Code 137
&lt;/h3&gt;

&lt;p&gt;This typically means the process was killed with SIGKILL, which in Kubernetes often implies an out-of-memory kill. In other words, the container was using more memory than allowed, so the OS OOM killer terminated it[6][7]. It can also happen if someone manually kill -9 the process, but OOM is the usual cause. In Kubernetes you'll often see "Reason: OOMKilled" in the pod's status if this is the case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it happens:&lt;/strong&gt; Your app exceeded its memory limit or the node ran out of memory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Check the container's memory limits and usage. You can run &lt;code&gt;kubectl top pod&lt;/code&gt; to see if it was using a lot of memory. Increasing the memory limit (or request) for the container can prevent the OOMKill, or optimize the application to use less memory. Preq can help by flagging frequent OOM kills so you know to take action before it impacts users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exit Code 127
&lt;/h3&gt;

&lt;p&gt;This means "command not found". The process tries to execute a file or command that doesn't exist in the container's filesystem [8][9]. It's a common error when the container's start command or entrypoint is misconfigured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it happens:&lt;/strong&gt; Either the binary isn't installed, the path is wrong, or a dependency is missing. It can also be a shell quoting issue or a file permission problem, but usually it's a missing executable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Describe the pod (&lt;code&gt;kubectl describe pod&lt;/code&gt;), often Kubernetes will log a message about "command not found" in the events. Fix the command in your container spec or Dockerfile. Make sure the image has the expected program at the correct location. Preq can catch this by scanning events or termination messages for "exited with code 127" and common error text. The solution is usually straightforward: install the missing tool or correct the command path.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exit Code 134
&lt;/h3&gt;

&lt;p&gt;This indicates the process received SIGABRT (abort signal)[10]. In plainer terms, the application crashed itself – often due to an internal error like an assertion failure or a call to abort(), or it was terminated after a fatal error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it happens:&lt;/strong&gt; Common causes include bugs (like asserting false or invalid memory access that is caught leading to abort), or sometimes out-of-memory in a different way. Another cause can be hitting a resource limit that triggers an abort.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Check the container's logs for any error messages or stack traces right before it exited. Often you'll see a line about an assertion or fatal error. Preq will highlight the occurrence of a 134 exit and can point out if it's a known pattern. Ensure you're not hitting known bugs in the app version, and consider adding liveness probes, if a container aborts frequently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exit Code 139
&lt;/h3&gt;

&lt;p&gt;This is the infamous segmentation fault (SIGSEGV)[10]. The process tried to access memory it shouldn't (invalid pointer, buffer overflow, etc.), and the OS killed it. This is almost always a bug in the application code (or a library it's using).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it happens:&lt;/strong&gt; A segfault can be caused by many things: using a null pointer, reading/writing out of bounds, incompatible native libraries, etc. In some cases, even running out of stack can cause a segfault.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; As with 134, the primary action is to check application logs or enable core dumps for debugging. If the segfault happens on startup, it could be an incompatibility (for example, wrong CPU architecture or missing dependencies causing a segfault). Ensure the image is built for the correct architecture. Preq's rule for 139 will basically alert you that a container hit SIGSEGV. It can't fix the code, but it ensures you notice the crash.&lt;/p&gt;

&lt;h3&gt;
  
  
  Detecting exit codes with a unified command
&lt;/h3&gt;

&lt;p&gt;You can quickly scan your cluster for any pods that terminated with these exit codes using this exact raw text feeder to scan for exit codes and pipe into Preq:&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;--all-namespaces&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'
.items[] as $p
| [ ($p.status.containerStatuses // []),
($p.status.initContainerStatuses // []),
($p.status.ephemeralContainerStatuses // []) ]
| add
| .[]
| (.lastState.terminated // .state.terminated) as $t
| select($t != null and $t.exitCode != null and $t.finishedAt != null)
| [ $t.finishedAt,
($p.metadata.namespace + "/" + $p.metadata.name),
.name,
($t.reason // ""),
($t.exitCode|tostring) ]
| @TSV'&lt;/span&gt; | preq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion: Using Preq in Your Daily Workflow
&lt;/h2&gt;

&lt;p&gt;In an ideal world, you can catch problems before they cause downtime and that's where Preq shines. Adopting preq in your day-to-day Kubernetes workflows can significantly reduce mean-time-to-detection for issues:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CI/CD Integration:&lt;/strong&gt; Consider running Preq as a post-deploy check in your continuous deployment pipeline. For example, after deploying a new version of an application, have a step that runs &lt;code&gt;kubectl preq&lt;/code&gt; on that namespace or on the specific new pods.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proactive scheduled runs:&lt;/strong&gt; Use &lt;code&gt;kubectl preq -j&lt;/code&gt; to generate a Kubernetes CronJob template. It writes cronjob.yaml. Open the file, set the schedule, add the Preq command you want to run including any -a action and -o output, set the namespace, then apply it with &lt;code&gt;kubectl apply -f cronjob.yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Note that kubectl preq does not support an all namespaces flag. To scan many targets, pass a data source template to Preq or wrap multiple invocations in a small script that the CronJob runs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Post-mortem and Continuous Improvement:&lt;/strong&gt; After any incident or outage, consider writing a new CRE rule (and contributing it!) if it was a novel issue. Preq's framework lets you codify that knowledge so that neither you nor anyone else gets bitten by the same problem twice.&lt;/p&gt;

&lt;p&gt;In summary, Preq is a powerful ally for Kubernetes users. It turns the wealth of community experience with failure modes into actionable insights you can run on-demand. By incorporating Preq into CI/CD pipelines, scheduled scans, and troubleshooting sessions, you can proactively detect and resolve issues – often before they turn into user-facing incidents. Happy monitoring, and may your clusters run clean and healthy!&lt;/p&gt;

&lt;p&gt;If you're looking for enterprise features such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a distributed detection engine that runs across many nodes and clusters&lt;/li&gt;
&lt;li&gt;a web UI with guided workflows for investigation and collaboration&lt;/li&gt;
&lt;li&gt;deeper integrations (for incident tracking, etc.)&lt;/li&gt;
&lt;li&gt;a control plane for managing the distributed engine&lt;/li&gt;
&lt;li&gt;a larger, proprietary set of CRE rules maintained by the Prequel Reliability Research team (PRRT).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out &lt;a href="https://www.prequel.dev/sign-up" rel="noopener noreferrer"&gt;Prequel&lt;/a&gt;, our commercial offering and let us know what you think!&lt;/p&gt;

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

&lt;p&gt;[1] &lt;a href="https://www.prequel.dev/blog-post/dev-to-10-kubectl-plugins-that-help-make-you-the-most-valuable-kubernetes-engineer-in-the-room" rel="noopener noreferrer"&gt;Dev.to: 10 kubectl Plugins That Help Make You the Most Valuable Kubernetes Engineer in the Room&lt;/a&gt;&lt;br&gt;&lt;br&gt;
[2] &lt;a href="https://docs.prequel.dev/cres/public/cre-2025-0119" rel="noopener noreferrer"&gt;CRE-2025-0119 | Prequel&lt;/a&gt;&lt;br&gt;&lt;br&gt;
[3] &lt;a href="https://docs.prequel.dev/cres/public/cre-2025-0071" rel="noopener noreferrer"&gt;CRE-2025-0071 | Prequel&lt;/a&gt;&lt;br&gt;&lt;br&gt;
[4] &lt;a href="https://docs.prequel.dev/cres/public/cre-2025-0048" rel="noopener noreferrer"&gt;CRE-2025-0048 | Prequel&lt;/a&gt;&lt;br&gt;&lt;br&gt;
[5] &lt;a href="https://docs.prequel.dev/cres/public/cre-2025-0125" rel="noopener noreferrer"&gt;CRE-2025-0125 | Prequel&lt;/a&gt;&lt;br&gt;&lt;br&gt;
[6] &lt;a href="https://stackoverflow.com/questions/59729917/kubernetes-pods-terminated-exit-code-137?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Stack Overflow: Kubernetes Pods Terminated Exit Code 137&lt;/a&gt;&lt;br&gt;&lt;br&gt;
[7] &lt;a href="https://github.com/prequel-dev/cre/pull/137" rel="noopener noreferrer"&gt;Exit Code CREs | Prequel&lt;/a&gt;&lt;br&gt;&lt;br&gt;
[8] &lt;a href="https://krew.sigs.k8s.io/docs/user-guide/setup/install/" rel="noopener noreferrer"&gt;Installing Krew&lt;/a&gt;&lt;br&gt;&lt;br&gt;
[9] &lt;a href="https://docs.prequel.dev/running#scheduled-jobs" rel="noopener noreferrer"&gt;Schedule preq to run in a Cronjob&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Bitnami’s Free Catalog Says Goodbye: Avoid Brownouts and a $72k Surprise</title>
      <dc:creator>Lyndon Brown</dc:creator>
      <pubDate>Wed, 10 Sep 2025 18:01:10 +0000</pubDate>
      <link>https://dev.to/lyndon_brown_/bitnamis-free-catalog-says-goodbye-avoid-brownouts-and-a-72k-surprise-4kp3</link>
      <guid>https://dev.to/lyndon_brown_/bitnamis-free-catalog-says-goodbye-avoid-brownouts-and-a-72k-surprise-4kp3</guid>
      <description>&lt;h2&gt;
  
  
  tldr
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Bitnami is narrowing public access to images and pausing updates to many chart artifacts. Expect brownouts as the cut-over window starts on Aug 28th with final public catalog deletion on Sept 29th&lt;/li&gt;
&lt;li&gt;The biggest risks:

&lt;ul&gt;
&lt;li&gt;Kubernetes ImagePullBackOff on restarts or during autoscaling,&lt;/li&gt;
&lt;li&gt;Stale/unpatched images (CVE drift),&lt;/li&gt;
&lt;li&gt;Chart drift and subchart dependencies that break upgrades.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;We're publishing &lt;strong&gt;CREs&lt;/strong&gt; (Common Reliability Enumerations) that help you quickly identify Bitnami-related risks and resolve them.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcoaratzppr63ecgrq2pi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcoaratzppr63ecgrq2pi.png" alt="reddit thread" width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Credit: stonesabe4 on &lt;a href="https://www.reddit.com/r/kubernetes/comments/1n2gc8d/basically_just_found_out_i_need_to_72k_for/" rel="noopener noreferrer"&gt;reddit&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Bitnami mattered
&lt;/h2&gt;

&lt;p&gt;For years, Bitnami's images and Helm charts were the de-facto path to running popular apps on Kubernetes. Well-maintained images, sensible defaults, and easy Helm installs. Many teams pinned Bitnami images in deployments, CI pipelines, and internal charts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's changing
&lt;/h2&gt;

&lt;p&gt;Bitnami is making a number of changes following their acquisition by Broadcom and &lt;a href="https://github.com/bitnami/containers/issues/83267" rel="noopener noreferrer"&gt;renewed focus on a subscription model&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Catalog changes
&lt;/h4&gt;

&lt;p&gt;The container repos are undergoing a major shift:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The existing &lt;code&gt;docker.io/bitnami&lt;/code&gt; public repo will be deleted&lt;/li&gt;
&lt;li&gt;A new repo &lt;code&gt;docker.io/bitnamisecure&lt;/code&gt; will contain hardened community images, but there is a catch. It will only contain the latest tags and these images are intended for development only&lt;/li&gt;
&lt;li&gt;Existing container images will be moved to a new repo &lt;code&gt;docker.io/bitnamilegacy&lt;/code&gt;, but will receive no further updates&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Charts stop updating
&lt;/h4&gt;

&lt;p&gt;Bitnami's Pre-built Helm chart artifacts won't be updated anymore, so their defaults keep pointing to old images; you'll need to override image repos/tags or adopt alternatives.&lt;/p&gt;

&lt;h4&gt;
  
  
  Brownouts &amp;amp; cutoff windows
&lt;/h4&gt;

&lt;p&gt;Bitnami has planned 24-hour outages for selected images. For each scheduled brownout, ten container images from &lt;code&gt;docker.io/bitnami&lt;/code&gt; will be taken offline for a 24-hour period. The specific applications impacted will be shared on the day the brownout begins. Final cutoff will occur on Sept 29.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb6bm16ctp1yt9og63u2c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb6bm16ctp1yt9og63u2c.png" alt="bitnami timeline" width="800" height="138"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bitnami Repo Deprecation Timeline&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Who's affected
&lt;/h2&gt;

&lt;p&gt;If you use any of these, read on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pinned or Unpinned Bitnami image tags&lt;/strong&gt; (e.g., &lt;code&gt;docker.io/bitnami/postgresql:13.x&lt;/code&gt;, &lt;code&gt;:latest&lt;/code&gt;) in Deployments/StatefulSets/Jobs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bitnami-based charts&lt;/strong&gt; in helmfile/Argo CD/Flux pipelines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI pipelines that pull Bitnami tools&lt;/strong&gt; (kubectl, kubectl-helm, db images, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What will the impact be?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes ErrImagePull / ImagePullBackOff&lt;/strong&gt; on pod restarts, scale-outs, node drains, or fresh deploys&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time-bomb restarts&lt;/strong&gt; - Running pods look fine until the next pull (then fail)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security drift&lt;/strong&gt; - Stale/archived images stop receiving fixes and lead to accumulated CVEs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chart drift&lt;/strong&gt; - Defaults reference repos/tags that no longer update leading to failed upgrades or silent divergence&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Doing a manual impact assessment
&lt;/h2&gt;

&lt;p&gt;Here are a few steps you can take to understand your exposure and mitigate associated risk:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inventory images:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'..|.image? // empty'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; bitnami
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Search configs &amp;amp; charts:&lt;/strong&gt; grep your helmfiles/values/overlays for bitnami and pinned tags&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Automated Assessment: New CREs to help
&lt;/h2&gt;

&lt;p&gt;We're publishing a focused set of Common Reliability Enumerations (CREs) to help you surface issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PREQUEL-2025-0102&lt;/strong&gt; &lt;strong&gt;(Pulling Deprecated Bitnami Images)&lt;/strong&gt; - Detects workloads pulling Bitnami images scheduled to be deleted or moved&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PREQUEL-2025-0103&lt;/strong&gt; &lt;strong&gt;(Pulling Unmaintained Bitnami Images)&lt;/strong&gt; - Detects workloads pulling from unmaintained legacy repo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PREQUEL-2025-0104&lt;/strong&gt; &lt;strong&gt;(Pulling Latest-Only-Non-Prod Images)&lt;/strong&gt; - Detects workloads pulling images from the latest-only non-prod repo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PREQUEL-2025-0105&lt;/strong&gt; &lt;strong&gt;(Deployment Tied to Deprecated Bitnami Images)&lt;/strong&gt; Finds deployments that reference deprecated image locations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These CREs are cluster- and pipeline-friendly: run them pre-deployment (CI), in staging, and periodically in prod to address issues and ensure regressions don't occur.&lt;/p&gt;

&lt;h4&gt;
  
  
  Using Prequel to catch Bitnami risks before they break prod
&lt;/h4&gt;

&lt;p&gt;Prequel is the enterprise reliability problem detection platform (from the team behind the open source Preq and CRE projects). It runs CREs continuously, examining and correlating cluster events/logs/configs, and providing guided fixes.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why Prequel (vs. doing this by hand)
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Larger exclusive CRE library covering 100s of popular technologies&lt;/strong&gt; maintained by the &lt;strong&gt;Prequel Reliability Research Team (PRRT)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distributed detection engine&lt;/strong&gt; that connects the dots across nodes and clusters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web UI&lt;/strong&gt; with guided workflows for investigation &amp;amp; collaboration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep integrations&lt;/strong&gt; (incident tracking, chat, CI/CD).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control plane&lt;/strong&gt; to manage rules, sensors, and rollouts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can use Prequel to continuously scan for these and other risks. &lt;a href="https://www.prequel.dev/sign-up" rel="noopener noreferrer"&gt;Sign up for a 30-day free trial. No credit card required&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faiew9nl6yw9c0xz20g40.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faiew9nl6yw9c0xz20g40.png" alt="Commercial CREs" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sneak Peek of &lt;a href="https://docs.prequel.dev/cres/commercial" rel="noopener noreferrer"&gt;Prequel Rules&lt;/a&gt; Catalog&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Pragmatic Bitnami risk migration options
&lt;/h2&gt;

&lt;p&gt;Once you understand your exposure using an automated or manual method, there are a number of steps you can take:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Identify new registries&lt;/strong&gt; - Evaluate alternatives such as Docker Official or Hardened Images, Chainguard, to see what meets your needs and budget.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mirror first, then refactor&lt;/strong&gt; - Point bitnami images to a private registry mirror for faster pulls and no cut off, then replace images/charts on your schedule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pin by digest&lt;/strong&gt; - Use immutable digests to lock the exact image you want, unlike tags which may move/disappear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automate gates&lt;/strong&gt; - Fail builds when CREs detect deprecated Bitnami pulls in manifests or pipelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prove in staging&lt;/strong&gt; - Force a rolling restart before a cutoff window; verify image pulls and readiness gates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document the new defaults&lt;/strong&gt; - Put the new repo/tag/digest and patch cadence where your team can't miss it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;Ecosystem shifts like this can break prod today, or break on your next upgrade. It is increasingly impossible to keep up with all the risks that affect your stack. If you need help, let Prequel keep watch for these and 100s of other daily risks. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.prequel.dev/sign-up" rel="noopener noreferrer"&gt;Try Prequel&lt;/a&gt;&lt;/strong&gt; and stay ahead of breaking ecosystem changes. &lt;/p&gt;

</description>
      <category>bitnami</category>
      <category>kubernetes</category>
      <category>docker</category>
      <category>devops</category>
    </item>
    <item>
      <title>10 kubectl Plugins That Help Make You the Most Valuable Kubernetes Engineer in the Room</title>
      <dc:creator>Lyndon Brown</dc:creator>
      <pubDate>Thu, 29 May 2025 14:05:00 +0000</pubDate>
      <link>https://dev.to/lyndon_brown_/10-kubectl-plugins-that-help-make-you-the-most-valuable-kubernetes-engineer-in-the-room-263p</link>
      <guid>https://dev.to/lyndon_brown_/10-kubectl-plugins-that-help-make-you-the-most-valuable-kubernetes-engineer-in-the-room-263p</guid>
      <description>&lt;p&gt;Kubernetes is insanely powerful and becomes much easier to manage when you extend kubectl with plugins. Thanks to the open-source community (and the Krew plugin manager), you can add tons of new subcommands to kubectl that streamline tasks and make cluster management easier.  &lt;/p&gt;

&lt;p&gt;But with hundreds of available plugins, how do you decide which to try? &lt;/p&gt;

&lt;p&gt;We're sharing our favorites.  All the plugins that made our list are actively maintained and compatible with recent Kubernetes versions (think 1.30+).&lt;/p&gt;

&lt;p&gt;Let’s dive in!&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Preq – Detect Reliability Issues Early
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;code&gt;preq&lt;/code&gt; (pronounced “preek”) is a &lt;strong&gt;reliability problem detector&lt;/strong&gt; that looks for common problems in your application &lt;strong&gt;before&lt;/strong&gt; they cause outages. It is powered by a community-driven catalog of failure patterns (sort of like a vulnerability database, but for reliability). &lt;/p&gt;

&lt;p&gt;With the &lt;code&gt;preq&lt;/code&gt;, you can run checks against your running application cluster and get alerted to bugs, misconfigurations, or anti-patterns that others have already identified.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it’s useful:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;If you’ve ever been blindsided by a production incident, &lt;code&gt;preq&lt;/code&gt; can be a lifesaver. It hunts through events and configurations looking for sequences that match known failure patterns.&lt;/p&gt;

&lt;p&gt;When it finds something, it provides a detailed report (with a recommended fix) so you can act fast. In short, it brings SRE expertise to your fingertips, helping teams &lt;strong&gt;pinpoint and mitigate problems&lt;/strong&gt; before they escalate. It’s like having someone checking your cluster 24/7 (for free and open source!).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is an exciting new project, you can find and ⭐ star the repo here: &lt;a href="https://github.com/prequel-dev/preq" rel="noopener noreferrer"&gt;https://github.com/prequel-dev/preq&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Installation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl krew install preq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Pro-tip: &lt;a href="https://krew.sigs.k8s.io/docs/user-guide/setup/install/" rel="noopener noreferrer"&gt;Install&lt;/a&gt; the Krew plugin manager first &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example usage:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Once installed, you can run &lt;code&gt;preq&lt;/code&gt; on a specific workload or pod. For instance, to run reliability checks on a PostgreSQL pod:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl preq pg17-postgresql-0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will scan the pod’s logs and events against the library of Common Reliability Enumeration (CRE) rules. If any known issues are detected, you’ll get an output detailing the problem and how to fix it (with references to documentation).&lt;/p&gt;

&lt;p&gt;You can even schedule &lt;code&gt;preq&lt;/code&gt; as a CronJob in your cluster to &lt;strong&gt;continuously monitor and push alerts (e.g. to Slack) when something’s amiss&lt;/strong&gt;. In short, &lt;code&gt;preq&lt;/code&gt; gives you proactive reliability insights that help &lt;strong&gt;stop outages&lt;/strong&gt; before they happen.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Neat – Clean Up Verbose YAML Output
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;kubectl-neat does exactly what it sounds like – it &lt;strong&gt;neatens up&lt;/strong&gt; Kubernetes YAML output by removing all the clutter. When you do kubectl get ... -o yaml, the output is often filled with extra fields (status, managedFields, selfLink, etc.) that make it hard to focus on the spec. neat strips out those noisy fields and default values, leaving you with a clean manifest that’s much easier to read.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it’s useful:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;If you find your eyes glazing over from endless autogenerated metadata, this plugin is for you. It omits fields like managedFields, status, creationTimestamp, resourceVersion, and other boilerplate that Kubernetes injects. The result is a tidy view of the resource’s actual configuration.&lt;/p&gt;

&lt;p&gt;This is super helpful for troubleshooting or comparing manifests – you can see &lt;em&gt;just&lt;/em&gt; the fields you or your tools defined, without the Kubernetes-added noise. In short, neat makes YAML outputs &lt;strong&gt;concise&lt;br&gt;
and readable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl krew install neat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example usage:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Simply pipe any verbose output into kubectl neat. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get podnginx-abc123 -o yaml | kubectl neat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will output the YAML for pod nginx-abc123 but without all the junk (owner references, timestamps, default values, etc.). &lt;/p&gt;

&lt;p&gt;You can then easily diff or inspect this trimmed manifest. It’s a huge timesaver when you want to quickly understand a resource’s config without wading through Kubernetes added fields.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. View-Secret – Decode Secrets on the Fly
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;No more manual Base64 decoding! The kubectl-view-secret plugin makes it effortless to &lt;strong&gt;view Kubernetes Secrets in plain text&lt;/strong&gt;. Normally, if you do &lt;code&gt;kubectl get secret my-secret -o yaml&lt;/code&gt;, you'll see Base64 encoded content for each key. With view-secret, those values are decoded to human-readable strings automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Ever needed to quickly check what value was stored in a Secret? This plugin saves you &lt;em&gt;tons&lt;/em&gt; of time. Instead of copying the encoded string and running &lt;code&gt;echo ... | base64 -d&lt;/code&gt; for each key, you just run one command and see actual secret values. This is especially handy for Secrets with multiple keys, like TLS certs or app configs. It's also great for verifying that your Secret data is correct (in dev/test environments) without the hassle of decoding. Essentially, view-secret &lt;strong&gt;eliminates the manual steps&lt;/strong&gt; when managing Secrets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation:&lt;/strong&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 krew &lt;span class="nb"&gt;install &lt;/span&gt;view-secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example usage:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;To view a secret named my-secret in default namespace, just run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl view-secret my-secret &lt;span class="nt"&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adding the --all flag shows all key-value pairs. For example, you might get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;key1=supersecret
key2=topsecret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;as the output. No more copy-pasting and decoding – you immediately see that key1 is "supersecret" and key2 is "topsecret". In one quick command, you have your secret values at hand &lt;strong&gt;(be careful where you run this though, as it will expose sensitive info in your terminal)&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Tree – Visualize Resource Ownership
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;The kubectl-tree plugin displays &lt;strong&gt;ownership hierarchy&lt;/strong&gt; in your cluster in a nice tree format. Kubernetes objects often own or control other objects (e.g., a Deployment owns ReplicaSets which own Pods). tree lets you pick a top-level resource and see all its descendants laid out as an ASCII tree.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;This is fantastic for understanding &lt;strong&gt;which resources are linked together&lt;/strong&gt;. For example, if you have a complex app, you can run kubectl tree on a Deployment or on a CustomResource and instantly see the chain of owned objects beneath it. It's especially useful with CRDs, where the relationships might not be obvious. Instead of manually cross-referencing owners, you get a clear picture: e.g., a StatefulSet -&amp;gt; Pods -&amp;gt; PVCs, etc. This helps in cleanup (to ensure you delete dependents) and in troubleshooting cascading issues. In short, tree gives you a birds-eye view of how Kubernetes controllers have orchestrated your resources &lt;strong&gt;in a hierarchy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation:&lt;/strong&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 krew &lt;span class="nb"&gt;install &lt;/span&gt;tree
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example usage:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;To see what a particular resource owns, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl tree deploy my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This might output a tree of all objects created by the Deployment my-app, such as ReplicaSets and Pods. For instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Deployment/my-app
└─ ReplicaSet/my-app-5fd76f7d5c
   ├─ Pod/my-app-5fd76f7d5c-abcde
   └─ Pod/my-app-5fd76f7d5c-fghij
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells you the Deployment owns a ReplicaSet, which in turn has two Pods. You can use kubectl tree on other high-level resources too (like an Ingress or a CRD instance) to reveal what's underneath. It's a superb way to &lt;strong&gt;navigate complex deployments&lt;/strong&gt; and ensure you understand resource dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Tail – Stream Logs from Multiple Pods
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;kubectl-tail (the Krew plugin name is just &lt;strong&gt;tail&lt;/strong&gt;) is a handy plugin for &lt;strong&gt;tailing logs from multiple pods&lt;/strong&gt; in real time. It's like a supercharged version of &lt;code&gt;kubectl logs -f&lt;/code&gt;, allowing you to aggregate logs across several pods or even an entire label/selector. Under the hood, this plugin is based on Kail, providing Stern-like functionality directly as a kubectl plugin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;When debugging an app that's distributed across many pods (say a deployment with replicas or a microservice with multiple components), it's inconvenient to open separate log streams for each pod. kubectl tail solves this by letting you &lt;strong&gt;target multiple pods at once&lt;/strong&gt; – for example, by deployment name, service name, or label selector. The logs from all matching pods are merged and streamed to your terminal. You can even filter by timeframe (--since) or specific pods. As Alex Moss noted, one great feature is targeting a higher-level resource: e.g. &lt;code&gt;kubectl tail --svc=my-service&lt;/code&gt; to see logs from all pods behind that Service. This plugin simplifies multi-pod debugging and gives you a consolidated, live view of what's happening across your application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation:&lt;/strong&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 krew &lt;span class="nb"&gt;install tail&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example usage:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Here are a few common ways to use kubectl tail:&lt;/p&gt;

&lt;p&gt;By namespace: View logs from all pods in a namespace (e.g. default):&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;tail&lt;/span&gt; &lt;span class="nt"&gt;--ns&lt;/span&gt; default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By label selector: Stream logs from pods matching a label, e.g. all pods with app=web:&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;tail&lt;/span&gt; &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;web &lt;span class="nt"&gt;--since&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(This would show the last 10 minutes of logs from every pod labeled app=web, and then continue streaming.)&lt;/p&gt;

&lt;p&gt;Multiple specific pods: If you want to tail two particular pods:&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;tail&lt;/span&gt; &lt;span class="nt"&gt;--pod&lt;/span&gt; web-abcde &lt;span class="nt"&gt;--pod&lt;/span&gt; web-fghij &lt;span class="nt"&gt;--since&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1h
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In each case, logs from all targeted pods will stream live to your terminal. The plugin even color-codes logs by pod, making it easier to distinguish sources. It's a simple but powerful way to &lt;strong&gt;debug issues that span many pods&lt;/strong&gt; without juggling multiple kubectl logs commands.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Who-Can – Investigate RBAC Permissions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;kubectl-who-can helps you answer the question: &lt;em&gt;"Who can do X in my cluster?"&lt;/em&gt; It's an RBAC &lt;strong&gt;permissions investigator&lt;/strong&gt;. You give it an action (verb) and resource, and it tells you which users, service accounts, or roles are allowed to perform that action. Essentially, it wraps &lt;code&gt;kubectl auth can-i --list&lt;/code&gt; logic into an easy query tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Kubernetes RBAC can get complicated. If you're debugging a "permission denied" error or just auditing access, this plugin is gold. Instead of manually inspecting ClusterRoleBindings, you can simply ask "who can delete pods in this namespace?" and get an immediate answer. It's particularly useful for &lt;strong&gt;debugging RBAC issues&lt;/strong&gt; and ensuring your policies are set correctly. For example, if a deployment failed because it couldn't list Secrets, who-can will show you which account needs a role update. In short, it provides quick visibility into &lt;strong&gt;who has access to what&lt;/strong&gt;, saving you from hunting through YAML and docs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation:&lt;/strong&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 krew &lt;span class="nb"&gt;install &lt;/span&gt;who-can
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example usage:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Say you want to find out who can delete pods in namespace foo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl who-can delete pods &lt;span class="nt"&gt;--namespace&lt;/span&gt; foo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The plugin will return a list of subjects (users, serviceaccounts, roles) that have that capability. For instance, you might see that a certain RoleBinding gives the "deploy-bot" service account the delete permission on pods, and maybe cluster admins can too. You can also run broader queries, like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl who-can get secret/db-password
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to see who can read the db-password secret. This is incredibly useful for security audits—quickly verify that only the intended identities have access. In summary, who-can turns RBAC from a mystery into an answerable question, helping you &lt;strong&gt;secure and troubleshoot your cluster's access control&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. kubectx – Swiftly Switch Contexts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;kubectx is a popular command-line tool (and kubectl plugin) for &lt;strong&gt;fast context switching&lt;/strong&gt;. In Kubernetes, a "context" is essentially which cluster + user you're currently using. If you work with multiple clusters (dev, staging, prod, or multiple cloud providers), kubectx lets you flip between them with a single short command, instead of typing &lt;code&gt;kubectl config use-context ...&lt;/code&gt; each time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Working in the wrong cluster can be disastrous ("oops, I just ran that in prod!"). kubectx makes it trivial to see your available contexts and switch in a heartbeat. It increases productivity for those managing multiple clusters by removing friction from context changes. It also supports tab-completion, so you can quickly auto-complete context names. Both beginners and pros love this because it simplifies multi-cluster workflows—keeping you from accidentally operating in the wrong environment and &lt;strong&gt;saving you time&lt;/strong&gt; every day.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;You can install via Krew (there are plugins named &lt;strong&gt;ctx&lt;/strong&gt; and &lt;strong&gt;ns&lt;/strong&gt; for kubectx/kubens). To use Krew, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl krew &lt;span class="nb"&gt;install &lt;/span&gt;ctx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example usage:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;After installation, switching contexts is as easy as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectx prod-cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will switch your current kubectl context to "prod-cluster" (whatever name you have in your kubeconfig). To list all contexts, just run kubectx with no arguments and it will show an interactive list. You can also &lt;strong&gt;shorten context names&lt;/strong&gt; or set up aliases for convenience. With this, managing multiple clusters (like bouncing between dev → staging → prod) becomes a breeze. Pair it with kubens (below) for full power.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. kubens – Speedy Namespace Switching
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;A perfect companion to kubectx, kubens lets you &lt;strong&gt;quickly switch between Kubernetes namespaces&lt;/strong&gt;. Rather than typing &lt;code&gt;-n &amp;lt;namespace&amp;gt;&lt;/code&gt; every time or editing your context, you just run &lt;code&gt;kubens &amp;lt;name&amp;gt;&lt;/code&gt; and it changes your current namespace in the kubeconfig context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Kubernetes namespaces help divide resources, but it's tedious to constantly specify -n or modify context YAML by hand. kubens streamlines this by making namespace changes a single short command. This is great for both beginners (who might forget to target the right namespace) and advanced users managing multi-tenant clusters. It prevents mistakes like deploying to the default namespace unintentionally. Combined with kubectx, you can navigate &lt;strong&gt;clusters and namespaces&lt;/strong&gt; with ease. It's all about efficiency: less typing, less context switching in your head, and more focus on what you're deploying or debugging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation:&lt;/strong&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 krew &lt;span class="nb"&gt;install &lt;/span&gt;ns
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example usage:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;To switch to the kube-system namespace (in your current context):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubens kube-system
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your default namespace for kubectl commands is now kube-system until you switch again. Running kubens with no arguments lists all namespaces in the current context, so you can pick one interactively. For instance, if you're juggling multiple projects in a cluster, kubens lets you jump between dev, test, and prod namespaces instantly. No more forgetting to add -n and wondering "why can't it find my pods?"—this tool keeps your namespace context correct at all times.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Kube-Score – Lint Your Kubernetes Manifests
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it:&lt;/strong&gt; kube-score (available via the Krew plugin &lt;strong&gt;score&lt;/strong&gt;) is a &lt;strong&gt;static code analysis tool&lt;/strong&gt; for Kubernetes YAML resources. In simpler terms, it's like a linter or "config validator" for your deployment files. You run it on your manifests (deployments, services, etc.), and it scores them and gives recommendations for improvements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Kubernetes will happily accept configs that are syntactically valid but follow bad practices. kube-score flags those issues &lt;em&gt;before&lt;/em&gt; you apply them. It checks for things like missing resource limits, improper health checks, deprecated API versions, and many other best-practice violations. The output is a list of suggestions on what to improve for better reliability and security. This is extremely useful for validating configuration files – you catch mistakes or omissions early, in CI/CD or during development. Essentially, kube-score &lt;strong&gt;acts as a quality gate&lt;/strong&gt; for your Kubernetes manifests, ensuring they adhere to recommended standards (so you don't get surprises at runtime).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation:&lt;/strong&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 krew &lt;span class="nb"&gt;install &lt;/span&gt;score
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(This installs the kubectl score plugin, which internally uses the kube-score tool.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example usage:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;To analyze a file (or directory of YAMLs) for issues, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl score my-app.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The plugin will output a report, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[WARNING] Deployment my-app: Container without resource limits
↳ It's recommended to set resource limits for containers to avoid resource hogging.

[CRITICAL] Service my-app-service: Uses targetPort name that doesn't match any container port
↳ The targetPort "http" is not found in any container of the associated pods.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each finding comes with a severity and an explanation. You'd then go back and fix those in your YAML. You can also run &lt;code&gt;kubectl score -f &amp;lt;folder&amp;gt;&lt;/code&gt; to scan multiple manifests at once. This plugin is perfect for &lt;strong&gt;validating Kubernetes config files&lt;/strong&gt; as part of code reviews or CI pipelines. It helps both newbies and experts by pointing out potential misconfigurations (before they hit your cluster).&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Sniff – Capture Pod Traffic Like a Pro
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is it:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Ever wished you could tcpdump inside a Kubernetes pod? kubectl sniff (a.k.a. &lt;strong&gt;ksniff&lt;/strong&gt;) is a plugin that makes that possible. It uses tcpdump and Wireshark under the hood to &lt;strong&gt;capture network traffic from any pod&lt;/strong&gt; in your cluster. With one command, it starts a remote packet capture on the target pod and streams the data for you to open in Wireshark or analyze with other tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Debugging network issues in Kubernetes can be tricky – you often need to see the raw traffic. sniff automates the heavy lifting of deploying a capture container alongside your pod and piping the output to your workstation. You get the full power of Wireshark for inspecting packets, with minimal impact on the running pod. This is incredibly useful for advanced troubleshooting: e.g., investigating why a service isn't responding, checking if a pod is actually making calls to an external API, or diagnosing weird networking behavior. Instead of crafting tcpdump commands on a node or modifying the pod, you run one plugin and get a pcap of what's happening. It's a game-changer for &lt;strong&gt;network debugging&lt;/strong&gt; in Kubernetes clusters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation:&lt;/strong&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 krew &lt;span class="nb"&gt;install &lt;/span&gt;sniff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Note: You'll need Wireshark installed locally for live capture, or you can output to a pcap file and open it later. Also, the target pod's node needs to allow running the capture – the plugin can handle many scenarios including non-privileged containers by using a helper Pod.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example usage:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;To start capturing traffic from a pod my-pod in namespace default:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl sniff my-pod &lt;span class="nt"&gt;-n&lt;/span&gt; default &lt;span class="nt"&gt;-c&lt;/span&gt; main-container
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here -c specifies the container (if omitted, it defaults to the first container in the pod). By default, sniff will launch Wireshark on your machine showing the live traffic from my-pod. You can apply capture filters with -f, for example -f "port 80" to only capture web traffic. If you prefer to save to file instead of live view, use the -o flag to write a pcap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl sniff my-pod &lt;span class="nt"&gt;-n&lt;/span&gt; default &lt;span class="nt"&gt;-o&lt;/span&gt; output.pcap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After running this, you'll have output.pcap with all packets captured from my-pod's network interface. Open that in Wireshark and you can dissect the traffic at your leisure. kubectl sniff brings deep network insight to Kubernetes – previously, you might have had to exec into the node or use complex setups, but now it's one simple command. It's an &lt;strong&gt;advanced tool&lt;/strong&gt; that becomes surprisingly approachable thanks to this plugin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;These kubectl plugins can dramatically enhance your productivity and capabilities with Kubernetes. From validating your configs to debugging live clusters, they fill in gaps that the default kubectl doesn't cover. Best of all, they integrate seamlessly – you invoke them as if they were native kubectl commands. Go ahead and try installing a few that pique your interest (via Krew), and you'll wonder how you managed Kubernetes without them!&lt;/p&gt;

&lt;p&gt;Enjoy! (And let us know in the comments which kubectl plugin is your favorite, or if we missed one that you think should have be in our top 10.)&lt;/p&gt;

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