Helm V2 遷移到 V3 版本

語言: CN / TW / HK

theme: smartblue highlight: a11y-dark


持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第30天,點選檢視活動詳情

Helm V3 版本已經發布了第三個 Beta 版本了,由於 V2 和 V3 版本之間的架構變化較大,所以如果我們現在正在使用 V2 版本的話,要遷移到 V3 版本了就有點小麻煩,其中最重要的當然就是資料遷移的問題,為了解決這個版本遷移問題,官方提供了一個名為 helm-2to3 的外掛可以來簡化我們的遷移工作。

為了能夠讓 Helm V2 CLI 包還可以繼續使用,所以我們這裡就不直接覆蓋了,讓兩個版本的 CLI 包可以共存,比較遷移還是有風險的,等到我們準備好移除 V2 版本的時候再刪除也不遲。

在 Helm GitHub 倉庫上下載最新的 V3 Beta 版本,地址:https://github.com/helm/helm/releases,要注意選擇和你係統一致的二進位制包,比如我們這裡是 Mac 系統,就下載MacOS amd64這個包,下載完成後解壓將對應的 Helm CLI 包重新命名為helm3,並移動到 PATH 路徑(比如/usr/local/bin)下面去,然後我們就可以準備使用 helm3 命令了:

$ helm3 version version.BuildInfo{Version:"v3.0.0-beta.3", GitCommit:"5cb923eecbe80d1ad76399aee234717c11931d9a", GitTreeState:"clean", GoVersion:"go1.12.9"} $ helm repo list NAME URL stable http://mirror.azure.cn/kubernetes/charts/ local http://127.0.0.1:8879/charts $ helm3 repo list Error: no repositories to show

我們可以看到使用 helm3 命令檢視不到我們之前配置的 chart 倉庫資訊。

HELM-2TO3 外掛

helm-2to3 外掛就可以讓我們將 Helm V2 版本的配置和 release 遷移到 Helm V3 版本去。

安裝的 Kubernetes 物件不會被修改或者刪除,所以不用擔心。接下來我們就來安裝這個外掛。

安裝

直接使用下面的命令安裝即可:

``` $ helm3 plugin install https://github.com/helm/helm-2to3 Downloading and installing helm-2to3 v0.1.1 ... https://github.com/helm/helm-2to3/releases/download/v0.1.1/helm-2to3_0.1.1_darwin_amd64.tar.gz

Installed plugin: 2to3 ```

然後可以使用 helm3 命令檢視外掛是否安裝成功:

``` $ helm3 plugin list NAMEVERSIONDESCRIPTION 2to30.1.1 migrate Helm v2 configuration and releases in-place to Helm v3 $ helm3 2to3 Migrate Helm v2 configuration and releases in-place to Helm v3

Usage: 2to3 [command]

Available Commands: convert migrate Helm v2 release in-place to Helm v3 help Help about any command move migrate Helm v2 configuration in-place to Helm v3

Flags: -h, --help help for 2to3

Use "2to3 [command] --help" for more information about a command. ```

到這裡就證明我們的 helm-2to3 外掛已經安裝成功了。

外掛特性

現在外掛支援的功能主要有兩個部分:

  • 遷移 Helm V2 配置
  • 遷移 Helm V2 release

接下來我們就來分別操作下。

遷移 Helm V2 配置

首先我們需要遷移 Helm V2 版本的相關配置和資料目錄:

$ helm3 2to3 move config [Helm 2] Home directory: /Users/ych/.helm [Helm 3] Config directory: /Users/ych/Library/Preferences/helm [Helm 3] Data directory: /Users/ych/Library/helm [Helm 3] Create config folder "/Users/ych/Library/Preferences/helm" . [Helm 3] Config folder "/Users/ych/Library/Preferences/helm" created. [Helm 2] repositories file "/Users/ych/.helm/repository/repositories.yaml" will copy to [Helm 3] config folder "/Users/ych/Library/Preferences/helm/repositories.yaml" . [Helm 2] repositories file "/Users/ych/.helm/repository/repositories.yaml" copied successfully to [Helm 3] config folder "/Users/ych/Library/Preferences/helm/repositories.yaml" . [Helm 3] Create data folder "/Users/ych/Library/helm" . [Helm 3] data folder "/Users/ych/Library/helm" created. [Helm 2] plugins "/Users/ych/.helm/plugins" will copy to [Helm 3] data folder "/Users/ych/Library/helm/plugins" . [Helm 2] plugins "/Users/ych/.helm/plugins" copied successfully to [Helm 3] data folder "/Users/ych/Library/helm/plugins" . [Helm 2] starters "/Users/ych/.helm/starters" will copy to [Helm 3] data folder "/Users/ych/Library/helm/starters" . [Helm 2] starters "/Users/ych/.helm/starters" copied successfully to [Helm 3] data folder "/Users/ych/Library/helm/starters" .

上面的操作會遷移:

  • Chart starters
  • Chart 倉庫
  • 外掛

不過需要注意的是,請檢查下所有的 Helm V2 下面的外掛是否能夠在 Helm V3 下面正常工作,把不起作用的外掛刪除即可。

現在我們再檢視下 Chart 倉庫資訊:

$ helm3 repo list NAME URL stable http://mirror.azure.cn/kubernetes/charts/ local http://127.0.0.1:8879/charts $ helm3 plugin list NAMEVERSIONDESCRIPTION 2to30.1.1 migrate Helm v2 configuration and releases in-place to Helm v3 push0.7.1 Push chart package to ChartMuseum

我們可以看到已經可以看到 Chart 倉庫資訊了,在 Helm V3 下面也可以使用之前 V2 版本提供的 Chart 倉庫和外掛了。

上面的 move config 命令會建立 Helm V3 配置和資料目錄(如果它們不存在),並將覆蓋repositories.yaml檔案(如果存在)。

此外,該外掛還支援將非預設的 Helm V2 主目錄以及 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 Release

現在我們可以開始遷移 releases 了。可以使用如下命令檢視下命令的可用選項:

``` $ helm3 2to3 convert -h migrate Helm v2 release in-place to Helm v3

Usage: 2to3 convert [flags] RELEASE

Flags: --delete-v2-releases v2 releases are deleted after migration. By default, the v2 releases are retained --dry-run simulate a convert -h, --help help for convert -l, --label string label to select tiller resources by (default "OWNER=TILLER") -s, --release-storage string v2 release storage type/object. It can be 'secrets' or 'configmaps'. This is only used with the 'tiller-out-cluster' flag (default "secrets") -t, --tiller-ns string namespace of Tiller (default "kube-system") --tiller-out-cluster when Tiller is not running in the cluster e.g. Tillerless ```

可以看到最後的 --tiller-out-cluster 引數,甚至支援 Tillerless Helm v2

現在我們來檢視下 Helm V2 下面的 release,然後選擇一個來測試下遷移:

``` $ helm list

NAME REVISIONUPDATED STATUS CHART APP VERSIONNAMESPACE minio 1 Wed Sep 11 11:47:51 2019DEPLOYEDminio-2.5.13RELEASE.2019-08-07T01-59-21Zargo redis 1 Wed Sep 11 14:52:57 2019DEPLOYEDredis-9.1.7 5.0.5 redis ```

上面我們也看到該遷移命令支援--dry-run選項,當然最安全的方式是先使用下該引數測試下效果:

``` $ helm3 2to3 convert --dry-run minio NOTE: This is in dry-run mode, the following actions will not be executed. Run without --dry-run to take the actions described below:

Release "minio" will be converted from Helm 2 to Helm 3. [Helm 3] Release "minio" will be created. [Helm 3] ReleaseVersion "minio.v1" will be created. ```

我們可以檢視上面的dry-run模式下面的一些描述資訊,沒有什麼問題的話就可以真正的來執行遷移操作了:

$ helm3 2to3 convert minio Release "minio" will be converted from Helm 2 to Helm 3. [Helm 3] Release "minio" will be created. [Helm 3] ReleaseVersion "minio.v1" will be created. [Helm 3] ReleaseVersion "minio.v1" created. [Helm 3] Release "minio" created. Release "minio" was converted successfully from Helm 2 to Helm 3. Note: the v2 releases still remain and should be removed to avoid conflicts with the migrated v3 releases.

遷移完成後,然後檢查下是否成功了:

``` $ helm list

NAME REVISIONUPDATED STATUS CHART APP VERSIONNAMESPACE minio 1 Wed Sep 11 11:47:51 2019DEPLOYEDminio-2.5.13RELEASE.2019-08-07T01-59-21Zargo redis 1 Wed Sep 11 14:52:57 2019DEPLOYEDredis-9.1.7 5.0.5 redis $ helm3 list NAME NAMESPACEREVISIONUPDATED STATUS CHART ```

我們可以看到執行helm3 list命令並沒有任何 release 資訊,這是因為我們遷移的 minio 這個 release 是被安裝在argo這個名稱空間下面的,所以需要指定名稱空間才可以看到:

$ helm3 list -n argo NAME NAMESPACEREVISIONUPDATED STATUS CHART minioargo 1 2019-09-11 03:47:51.239461137 +0000 UTCdeployedminio-2.5.13

注意:由於我們沒有指定--delete-v2-releases選項,所以 Helm V2 minio 這個 release 資訊還是存在的,我們可以在以後使用 kubectl 進行刪除。

當你準備好遷移你所有的 releases 的時候,你可以迴圈helm list裡面的所有 release 來自動的將每個 Helm V2 release 遷移到 Helm V3 版本去。

如果你正在使用 Tillerless Helm V2,只需要指定--tiller-out-cluster選項來遷移 release 即可:

$ helm3 2to3 convert minio --tiller-out-cluster

清理 Helm V2 資料

最後當然就是清理之前版本的舊資料了,雖然這並不是必須的,但是還是建議你清理下,可以避免一些衝突。清理 Helm V2 的資料比較簡單:

  • 刪除主資料夾~/.helm
  • 如果你沒有使用--delete-v2-releases選項,那麼舊使用 kubectl 工具來刪除 Tiller releases 資料
  • 解除安裝掉煩人😱的 Tiller

Happy Helm v3 sailing~