Foreverly

メモ帳

helm2to3

これはなに

helm v2からv3にマイグレするやつです。 v2のサポート期間は2020年11月13日までなので即対応必須奴。

Helmの新しいメジャーリリースへのアップグレードで最も重要な部分の1つは、データの移行で、やるにはhelm-2to3プラグインをつかうのがよい。

このプラグインは、以下をしてくれる奴

  • Helm v2の設定の移行
  • Helm v2リリースの移行
  • Helm v2の設定、リリースデータ、Tillerのデプロイメントのクリーンアップ。

やることリスト

  • [ ] helm3のインストール
  • [ ] helm2to3 pluginのインストール
  • [ ] v2のデータをバックアップ
  • [ ] Helm v2の設定を移行
  • [ ] Helm v2のReleaseを移行
  • [ ] Helm v2データをクリーンアップ(Helm v3が期待通りにHelm v2データを管理していることを確認してから)
  • [ ] cicd周りの修正
  • [ ] terraformとかでk8sクラスターでtillerとか入れてたら削除
  • [ ] helm-diff使ってたら最新にあげたほうがいいです。

事前準備

Helm v2と v3 のclientのセットアップ

以下の例みたいにv2とv3のCLIを用意

  • brewで入れたhelm3.3.0(2020/11/12現在は3.4.0が最新)
    • helm (pathが通っている)
  • バイナリでいれたhelm2.14.2
$ helm version
version.BuildInfo{Version:"v3.3.0",GoVersion:"go1.14.6"}


$ helm version
Client: &version.Version{SemVer:"v2.14.2"}
Server: &version.Version{SemVer:"v2.14.2"}

helm-2to3 プラグイン

現在プラグインでは以下のことができる。

  • Helm v2設定の移行
  • Helm v2リリースの移行
  • Helm v2の設定、リリースデータ、Tillerの配置のクリーンアップ
$ helm 2to3 version
Migrate and Cleanup Helm v2 configuration and releases in-place to Helm v3

v2のデータをバックアップと差し戻し手順

Tiller はリリース情報などをすべて Kubernetes ConfigMap オブジェクトに保存しているので、これをバックアップしておけばv2に差し戻しが可能。 あとhelm v2のコマンドとフォルダを保存しておく。

  1. 一覧を出す これらの最新のconfigをバックアップしていく。
$ kubectl get configmap -n kube-system -l "OWNER=TILLER" |cut -d. -f1 |uniq -c|awk '{print $2}'
NAME
hoge-namespace
  1. 最新のconfigmapを保存しておく
kubectl get configmap -n kube-system -o yaml hogehoge-app.v17 > hogehoge-app.v17.yaml

差し戻しのapplyは以下コマンドのを適宜変更して使う。

 kubectl apply -f hogehoge-app.v17.yaml -n kube-system

手順

Helm v2の設定を移行する(localなので不要なら実行しなくてもOK)

まずはHelm v2の設定フォルダとデータフォルダを移行します。 以下を移行する。

  • Chart starters
  • Repositories
  • Plugins

まずは --dry-run をする。

$ helm 2to3 move config --dry-run

実際に移行

$ helm 2to3 move config

WARNING: Helm v3 configuration maybe overwritten during this operation.

[Move Config/confirm] Are you sure you want to move the v2 configration? [y/N]: y

2019/11/14 14:55:00 Helm v2 configuration will be moved to Helm v3 configration.
...
2019/11/14 14:55:00 Helm v2 configuration was moved successfully to Helm v3 configration.

helm v3 のrepo listを実行して確認

$ helm repo list

NAME        URL
stable      <https://kubernetes-charts.storage.googleapis.com>
jfrog       <https://charts.jfrog.io>
rimusz      <https://charts.rimusz.net>
buildkite   <https://buildkite.github.io/charts>
jetstack    <https://charts.jetstack.io>
odavid      <https://odavid.github.io/k8s-helm-charts>
elastic     <https://helm.elastic.co>
appscode    <https://charts.appscode.com/stable>

$ helm plugin list

NAME    VERSION DESCRIPTION
2to3    0.1.0   migrate Helm v2 configuration and releases in-place to Helm v3
edit    0.3.0   Edit a release.
gcs     0.2.0   Provides Google Cloud Storage protocol support.
                <https://github.com/vigles>...
linter  0.1.1   Helm plugin to find hardcoded passwords in values.yaml files
monitor 0.3.0   Query at a given interval a Prometheus, ElasticSearch or Sentry instance...

Helm v2 と同じ Helm リポジトリプラグインが使えるようになっていればOK.

※ Helm v2のプラグインがすべてHelm v3で正常に動作することを確認し、動作しないプラグインは削除すること。 move configは、Helm v3のconfigとdataフォルダが存在しない場合は作成し、存在する場合はrepositories.yamlファイルを上書きする。

このプラグインは、デフォルトではないHelm v2 homeとHelm v3の設定とデータフォルダもサポートする。

$ export HELM_V2_HOME=$HOME/.helm2
$ export HELM_V3_CONFIG=$HOME/.helm3
$ export HELM_V3_DATA=$PWD/.helm3
$ helm3 2to3 move config

Helm v2 リリースの移行

リリースの移行を開始する準備ができたので移行テスト。

listで対象を確認

$ helm list

まずは --dry-run

$ helm 2to3 convert --dry-run hoge-realease

では、実際に移行を実行してみましょう。

$ helm 2to3 convert hoge-realease

一撃ワンライナー

~/bin/helm2/helm ls --output json | jq -r '.Releases[] | select(.Namespace != "default" and .Namespace != "hoge-namespace") | .Name' | xargs -t -I {} helm 2to3 convert {}

移行が成功したかどうかをチェックしてみましょう。 v2とv3でlistで確認

(v2) helm list


$ helm list -n hoge_namespaces

※ --delete-v2-releasesフラグを指定していないので、Helm v2 のリリース情報がそのまま残るが、 後からhelmの2to3クリーンアップで削除することができる。

すべてのリリースを移動する準備ができたら、hellmリストをループで実行し、hellm v2の各リリースに対してhellm 2to3の変換RELEASEを適用することで、 自動化することができる。

Helm v2データのクリーンアップ

最後のステップは、古いデータのクリーンアップ。 以下がクリーンアップされる

  • Configuration (Helm home directory)
  • v2 release data
  • Tiller deployment

まずは --dry-run

どのリリースが削除されるか、kube-system名前空間からTillerサービスが削除されるか、Helm v2のホームフォルダが削除されるかが表示される。

$ helm 2to3 cleanup --dry-run

2019/11/14 15:06:59 NOTE: This is in dry-run mode, the following actions will not be executed.
2019/11/14 15:06:59 Run without --dry-run to take the actions described below:
2019/11/14 15:06:59
WARNING: "Helm v2 Configuration" "Release Data" "Release Data" will be removed.
This will clean up all releases managed by Helm v2. It will not be possible to restore them if you haven't made a backup of the releases.
Helm v2 may not be usable afterwards.

[Cleanup/confirm] Are you sure you want to cleanup Helm v2 data? [y/N]: y
2019/11/14 15:07:01
Helm v2 data will be cleaned up.
2019/11/14 15:07:01 [Helm 2] Releases will be deleted.
2019/11/14 15:07:01 [Helm 2] ReleaseVersion "postgres.v1" will be deleted.
2019/11/14 15:07:01 [Helm 2] ReleaseVersion "redis.v1" will be deleted.
2019/11/14 15:07:01 [Helm 2] Home folder "/Users/rimasm/.helm" will be deleted.

Hem v2 のデータをクリーンアップする準備ができたら、--dry-run フラグを指定せずにコマンドを実行。

$ helm 2to3 cleanup --dry-run

ci/cd周りの修正

helmとかもろもろversion upする

terraformの修正

helmのupgradeとtillerの削除 ここらへん↓を修正

https://ghe.ca-tools.org/odessa/infrastructure/blob/394cc738b716d2d6b332d8b2ff6065f9a762f2bc/gcp/env/common/gke/locals.tf#L2-L96

helm-diffプラグインのupgrade

installシェルでhelm homeというコマンドが使われているけど、helm v3ではhelm homeが消えてインストールできなかったが、helm-diffのバージョンを最新にしたところインストールできました。

参考

How to migrate from Helm v2 to Helm v3helm-2to3プラグインhelm v3.3.0helm2からhelm3に(削除履歴も含めて)マイグレーションできるのか試してみたHelm_v2->v3_移行How Helm Uses ConfigMaps to Store Datahelm2からhelm3に(削除履歴も含めて)マイグレーションできるのか試してみた