Helmをk8sのPackage Managerとして使用しているプロジェクトで、helm templateのリファクタリングを進めていた。リファクタリングによってデグレていないかを確認するために、現行のmanifestファイルと新しいmanifestの差分をとってみたくなった。
helm-diffというHelm pluginが使えそうだったので、試しに使ってみたメモ。
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 before running diff to exclude style differences from the output
デフォルトでは、yamlファイルのディレクティブの並びが一致していないと、差分が出てしまう。このオプションをつけることで比較対象ファイル中のディレクティブの順番の違いを無視してくれる。
helm diff upgrade sample . -f values.yaml --normalize-manifests