kakudooo docs

helm-diffを使ってみた

Helmをk8sのPackage Managerとして使用しているプロジェクトで、helm templateのリファクタリングを進めていた。リファクタリングによってデグレていないかを確認するために、現行のmanifestファイルと新しいmanifestの差分をとってみたくなった。

helm-diffというHelm pluginが使えそうだったので、試しに使ってみたメモ。

helm-diff

helm-diffは、Helmで作成した新旧のマニフェストを比較して、差分を確認するためのHelm plugin

使い方

インストール

helmがインストールされている前提とする。

プラグインの追加。

helm plugin install https://github.com/databus23/helm-diff

helpコマンドを実行して確認。

helm diff -h

差分をとってみる

準備

適当なChartを作成する。

helm create sample
cd sample
rm -rf templates/*

a-first-templateを参考に、sample/templates/configmap.yamlを作成する。

apiVersion: v1
kind: ConfigMap
metadata:
  name: sample-configmap
data:
  myvalue: "Hello World"

k8sクラスタにmanifestを適用する。

helm install sample .

差分を確認する

まずは、sample/templates/configmap.yamlに変更を加える。

apiVersion: v1
kind: ConfigMap
metadata:
  name: sample-configmap
data:
  myvalue: "Hello" # ← Helloに変更する

helm diff upgrade コマンドを使う。

Show a diff explaining what a helm upgrade would change.

とあるように、helm upgradeによって変更される予定の差分を表示することができる。(もちろんupgradeはされない)

helm diff upgradeコマンドの使い方を確認する。

helm diff upgrade -h

Usage:
  diff upgrade [flags] [RELEASE] [CHART]
helm diff upgrade リリース名 対象のChart オプション...

の形式でコマンドを実行する必要がある。

まず、helm listで先程適用したリリースを一覧で確認する。

helm list

NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
sample default 1 2025-10-25 22:09:15.632425 +0900 JST deployed sample-0.1.0 1.16.0

比較対象のリリース名はsampleで、Chartはカレントディレクトリ.(sample/.)である。 helm diff upgradeコマンドで対象のリリースを指定して、ローカルのmanifestとの差分を表示する。

helm diff upgrade sample . -f values.yaml

以下のように、現在k8sクラスタに適用されているmanifestファイルとローカルChartの差分が表示される。

default, sample-configmap, ConfigMap (v1) has changed:
  # Source: templates/configmap.yaml
  apiVersion: v1
  kind: ConfigMap
  metadata:
    name: sample-configmap
  data:
-   myvalue: "Hello World"
+   myvalue: "Hello"

知っておくと便利なオプション

–normalize-manifests

normalize manifests before running diff to exclude style differences from the output

デフォルトでは、yamlファイルのディレクティブの並びが一致していないと、差分が出てしまう。このオプションをつけることで比較対象ファイル中のディレクティブの順番の違いを無視してくれる。

helm diff upgrade sample . -f values.yaml --normalize-manifests