<?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: Ilya Lesikov</title>
    <description>The latest articles on DEV Community by Ilya Lesikov (@ilya-lesikov).</description>
    <link>https://dev.to/ilya-lesikov</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%2F3615763%2F9f96c122-ad73-498a-b83b-f9c14fd6dfe4.png</url>
      <title>DEV Community: Ilya Lesikov</title>
      <link>https://dev.to/ilya-lesikov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ilya-lesikov"/>
    <language>en</language>
    <item>
      <title>Helm v4: key changes from v3</title>
      <dc:creator>Ilya Lesikov</dc:creator>
      <pubDate>Mon, 17 Nov 2025 16:04:31 +0000</pubDate>
      <link>https://dev.to/ilya-lesikov/helm-v4-key-changes-from-v3-2i26</link>
      <guid>https://dev.to/ilya-lesikov/helm-v4-key-changes-from-v3-2i26</guid>
      <description>&lt;p&gt;Helm's first major release in six years, v4, is &lt;a href="https://github.com/helm/helm/releases/tag/v4.0.0" rel="noopener noreferrer"&gt;now available&lt;/a&gt;. In this article, I'll explore the key changes: switching from 3-Way Merge to Server-Side Apply, support for WASM plugins, improved resource readiness tracking, content-based chart caching, and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Server-Side Apply instead of 3-Way Merge
&lt;/h2&gt;

&lt;p&gt;Server-Side Apply (SSA) is the resource update mechanism introduced in Kubernetes 1.14. Using SSA instead of 3-Way Merge (3WM) can help to avoid incorrect resource updates that sometimes occur with Helm.&lt;/p&gt;

&lt;p&gt;Helm cannot determine which resources were updated in a previous release and which were not. Because of this, 3WM might miss removing a field that is no longer present in a chart, for example.&lt;/p&gt;

&lt;p&gt;SSA addresses such issues by eliminating the need for Helm to compute patches for resource updates. Instead, Helm can now send the entire manifest to the Kubernetes API, where Kubernetes itself computes and applies patches. To enable SSA, use the &lt;code&gt;--server-side=true&lt;/code&gt; flag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm upgrade &lt;span class="nt"&gt;--server-side&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--force-conflicts&lt;/code&gt; flag enables automatic conflict resolution for SSA. With it, the rendered version of the manifest is always preferred. This mode is disabled by default, so we recommend enabling it.&lt;/p&gt;

&lt;h2&gt;
  
  
  WASM plugins
&lt;/h2&gt;

&lt;p&gt;In addition to the existing Helm 3 plugins, Helm 4 now supports WASM plugins. While this change has minimal impact on end users, it provides plugin developers with a more powerful API.&lt;/p&gt;

&lt;p&gt;There are three types of plugins: cli, postrenderer, and getter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;em&gt;cli plugins&lt;/em&gt; work just like Helm 3 plugins. The command that implements the plugin is executed, while command-line arguments from Helm are passed to this command.&lt;/li&gt;
&lt;li&gt;  &lt;em&gt;postrenderer plugins&lt;/em&gt; are executed right after templating of manifests. They take templated manifests as input and are expected to return them as output. For example, they can be used for patching resources before the deployment.&lt;/li&gt;
&lt;li&gt;  &lt;em&gt;getter plugins&lt;/em&gt; run when charts or subcharts are being pulled. They take a URI and connection settings as input and return binary data. They can be used to handle chart pulls from sources such as Git or S3.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no proper documentation for WASM plugins yet, but you can find more details in the &lt;a href="https://github.com/helm/community/blob/main/hips/hip-0026.md" rel="noopener noreferrer"&gt;HIP&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using kstatus for resource tracking
&lt;/h2&gt;

&lt;p&gt;Helm 3 featured several basic readiness checks for Deployments, StatefulSets, Services, and some other Kubernetes resources. These checks were activated with the &lt;code&gt;--wait&lt;/code&gt; flag, so that the release would wait until the resources were ready.&lt;/p&gt;

&lt;p&gt;Since resource tracking has never been a primary focus for Helm, the replacement of its tracking engine with kstatus is not surprising. For users, the only noticeable change is that resource readiness checks will be slightly more accurate.&lt;/p&gt;

&lt;p&gt;You can enable kstatus for all resources (and not just hooks) with the &lt;code&gt;--wait=watcher&lt;/code&gt; flag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm upgrade &lt;span class="nt"&gt;--wait&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;watcher ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Content-based chart caching
&lt;/h2&gt;

&lt;p&gt;In Helm 3, downloaded charts were cached based on their name and version. However, this was not enough to uniquely identify them, meaning Helm would end up re-downloading charts all the time because it didn't trust its own cache.&lt;/p&gt;

&lt;p&gt;In Helm 4, charts are uniquely identified by the hash sum of their content, so they can be reliably retrieved from the cache. Unfortunately, the new cache currently doesn’t work for OCI charts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other changes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  New templating functions: &lt;code&gt;mustToYaml&lt;/code&gt; and &lt;code&gt;mustToJson&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  OCI charts can be installed by their digest.&lt;/li&gt;
&lt;li&gt;  Post-renderers now work for hooks, not only non-hook resources.&lt;/li&gt;
&lt;li&gt;  The Helm SDK is improved a bit.&lt;/li&gt;
&lt;li&gt;  values.yaml files can now include multiple YAML sections separated by &lt;code&gt;---&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  There's new &lt;code&gt;apiVersion: v3&lt;/code&gt; available for Chart.yaml. For now, v3 simply drops support for requirements.yaml and requirements.lock, and does nothing else.&lt;/li&gt;
&lt;li&gt;  Validation has been improved. A few insignificant flags were added, and a few were renamed or removed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The majority of changes in Helm 4 focus on reducing technical debt: replacing 3-Way Merge with Server-Side Apply, ditching their custom resource tracking in favour of kstatus, and refactoring postrenderers and legacy plugins.&lt;/p&gt;

&lt;p&gt;The biggest change for the end user is fixing 3-Way-Merge-related issues by introducing SSA. However, Helm still lacks proper CRD management, users have to deploy half of their resources as hooks to control their deployment order or to update immutable resources, and numerous years-old &lt;a href="https://github.com/helm/helm/issues/7219" rel="noopener noreferrer"&gt;bugs&lt;/a&gt; (with whole &lt;a href="https://github.com/helm/helm-mapkubeapis" rel="noopener noreferrer"&gt;plugins&lt;/a&gt; developed to work around them) migrate from one major release to another.&lt;/p&gt;

&lt;p&gt;On a related note, &lt;a href="https://github.com/werf/nelm" rel="noopener noreferrer"&gt;Nelm&lt;/a&gt; has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  3-Way Merge replaced with SSA years ago, and even built-in &lt;code&gt;nelm release plan&lt;/code&gt; works through SSA, unlike &lt;code&gt;helm-diff&lt;/code&gt; plugin;&lt;/li&gt;
&lt;li&gt;  resource tracking &lt;a href="https://github.com/werf/nelm?tab=readme-ov-file#resource-state-tracking" rel="noopener noreferrer"&gt;miles ahead&lt;/a&gt; of kstatus, with heuristic detection of readiness for Custom Resources, displaying current resource statuses, errors, logs, and events during the deployment, and more;&lt;/li&gt;
&lt;li&gt;  fixed all mentioned issues, such as flawed CRD management, and inflexible deployment ordering.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
  For those, who are curious, that's how the resource tracking in Nelm looks like.
  &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%2Foprj1cfu7ya0fsl1nutk.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%2Foprj1cfu7ya0fsl1nutk.png" alt="nelm"&gt;&lt;/a&gt; 

&lt;/p&gt;

&lt;p&gt;P.S. For more details on what's new in Helm 4, check out the &lt;a href="https://github.com/scottrigby/helm/blob/v4-changelog/helm-v4-changelog-summary.md" rel="noopener noreferrer"&gt;major changes summary&lt;/a&gt;. Even more details are available in the &lt;a href="https://github.com/scottrigby/helm/blob/v4-changelog/helm-v4-changelog-full.md" rel="noopener noreferrer"&gt;full changelog&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>cloudnative</category>
      <category>werf</category>
      <category>helm</category>
    </item>
  </channel>
</rss>
