Helm 3.0 - 8 / vs Helm 2

Page content

Helm3の Introductionは終わったので Helm2と Helm3の違いについて。

blog等に点在していた情報をまとめてみる。

元ネタ

ただ元ネタにかかれている事について検証はしてない。そのうちする。

Tiller

一番言われる事ですが Tiller が無くなったという点。

そもそもなんで Tillerがいたのか? あるリリースを複数の管理者が共有して同時に操作したりする事を可能にするためで、このためには Clusterに展開されたリリース情報と状態の保持等が必要。

また、RBACが Kubernetes 1.6以後でデフォルト有効になり、Tillerには高い権限が必要になったが、それを与えてしまう事は それを使うユーザに意図されない権限を与える事になりかねない事から、Tillerの持つ権限を管理する事がより困難になってしまった事もある。

リリース情報については Helm3ではどうなっているかと言えば、 Kubernetesの Secretに 格納されるようになっている。現時点では typeが ‘helm.sh/release.v1’ で、sh.helm.release.v1.RELEASE_NAME.vREVISION という名前の Secretに リリース情報が入っている。

なお、このリリース情報だが、リリースがインストールされた namespaceの Secretとして記録される。Tillerが管理していたときは Cluster内でユニークなリリース名を付けなければならなかったのに対して、Helm3では namespace内でユニークであれば良いという自然なルールに変更になっている。

3way merge

リリースを変更するときに、従来は Helmが知っている状態間でしか行われなかった mergeが、現在のステートも見る様になった。

リリースに対して、kubectl等でマニュアルで変更を加えてしまった場合、状態の再適用時にチャート通りの状態にならない事が過去はあった事が改善されている。

例えば以下のようなオペレーション。

Helmで正しい状態を適用→helm以外でミスオペレーションして破壊→Helmで正しい状態を再適用

という形で再適用しようとしても、Helm 2が知っている状態に ミスオペレーションによる変更が含まれないため、何も変更が無いとして patchが生成されず修正されない。リリースの変更は Helmでのみ行われなければいけなかった。

これがHelm3では 以前の状態と現在の状態を考慮するようになったため、最後のオペレーションでHelmの意図した状態にpatchしてくれる。

また、これとは逆に Helm管理外で組み込まれた、Live stateにしかいない Container(例では IstioによってInjectされた Sidecar Container)が Helmの操作によって削除されない様になっている。

Subchart/Library Chart

依存関係にある chartについて requirements.yaml ではなく、Chart.yamlファイルに記述するようになったこと。Library Chartとして 単体ではなんらリソースを作り出さない 再利用専用のチャートがサポートされるようになった。

ただし、Chart.yamlの apiVersionが v1の場合には requirements.yamlを読み込むので過去のChartについても引き続き動くはず。Helm 3で helm createすると apiVersionは v2になっている。

Release Nameが必要になった

Helm公式の Introductionは まだ Helm2の時代を引きずっているのか、インストール時、Release Nameが指定されなかった場合に 自動的にランダムな名前を生成してリリースが作成されているように見えるが、Helm3ではエラーになるため、必ず名前を指定するか–generate-nameで 名前を自動生成するように指定する必要がある。

Helm Go Client Library パスの変更

k8s.io/helm から helm.sh/helm/v3 に変更

組み込みオブジェクトの Capabilitiesの変更

Kubernetes Clusterがサポートしている機能を参照出来る Capabilitiesオブジェクトがシンプルになった。

設定ファイル、キャッシュファイルのパス変更

XDG Base Directoryに従うようになったので、従来 .helmに格納されていた設定ファイル等が .config/helm/等に格納されるようになった。

CLI コマンドの変更

  • serve 廃止
  • delete –purge -> uninstall
  • delete -> uninstall –keep-history
  • inspect -> show
  • fetch -> pull

namespaceを自動作成しなくなった

リリースを置く対象namespaceが無い場合、helm2は勝手に作っていた(typoで苦労する…)。helm3では namespaceは管理者が先に作っておく必要がある。