Skip to content
Latchkey

Helm vs Jsonnet: Kubernetes マニフェストのテンプレート化

Helm はテンプレート化された chart と release を持つ Kubernetes 向けのパッケージマネージャーで、Jsonnet はマニフェストをプログラム的に生成する汎用のデータテンプレート言語です。Helm はパッケージ化して配布し、Jsonnet は本物の抽象化で構成します。

どちらも Kubernetes YAML を生成しますが、解決する問題の半分がそれぞれ異なります。Helm は Go テキストをテンプレート化して release を管理し (install、upgrade、rollback)、Jsonnet は関数と継承で構成を生成するための言語です。以下が率直な比較です。

HelmJsonnet
種類パッケージマネージャー + テンプレート化データテンプレート言語
テンプレート化YAML 文字列上の Go templatesやや型付けされた構成可能な言語
パッケージング/配布chart、repo、release組み込みなし (jsonnet-bundler 経由の lib)
release 管理install/upgrade/rollback の状態なし (生成した YAML を apply)
再利用chart の values + subchart関数、import、mixin
エコシステム巨大な chart エコシステムTanka、ksonnet lib、kube-libsonnet

パッケージング vs プログラマビリティ

Helm はパッケージングで際立ちます。ほぼすべてに対応する chart があり、helm install/upgrade/rollback がクラスター内で release の状態を追跡します。弱点は文字列テンプレート化で、YAML 上の Go templates での複雑なロジックは扱いづらくなります。Jsonnet はこれを逆転させます。関数と構成を備えた本物の言語なので大規模な構成も DRY に保たれますが、組み込みのパッケージングや release ライフサイクルがないため、YAML を生成して自分で apply します (多くは Tanka や GitOps ツール経由)。

再利用と安全性

Jsonnet は構造的なエラーを捕捉し、ライブラリをきれいに構成できるため、多数の類似サービスに対してよくスケールします。Helm の再利用は values ファイルと subchart を通じて行われ、とっつきやすい反面、深くネストしがちです。抽象化が欲しいなら Jsonnet、すぐ使える chart のマーケットプレイスが欲しいなら Helm です。

CI での利用

どちらも pipeline に収まります。マニフェストをレンダリングし (helm template または jsonnet)、検証してから apply します。どちらのツールを選んでも、デプロイ前に CI でレンダリングと diff を行うことで、ミスを早期に捕捉できます。

結論

膨大な chart エコシステムを備えたパッケージング、配布、release 管理には Helm を、多数のサービスにわたる本物のプログラマビリティと DRY な構成が必要なときは Jsonnet を選んでください。両者は共存でき、一部のチームは両方をレンダリングして GitOps フローに流し込みます。

関連ガイド