Helm V3 版本已经发布了第三个 Beta 版本了,由于 V2 和 V3 版本之间的架构变化较大,所以如果我们现在正在使用 V2 版本的话,要迁移到 V3 版本了就有点小麻烦,其中最重要的当然就是数据迁移的问题,为了解决这个版本迁移问题,官方提供了一个名为 helm-2to3 的插件可以来简化我们的迁移工作。
安装 Helm V3
为了能够让 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 NAME VERSION DESCRIPTION 2to3 0.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 NAME VERSION DESCRIPTION 2to3 0.1.1 migrate Helm v2 configuration and releases in-place to Helm v3 push 0.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 REVISION UPDATED STATUS CHART APP VERSION NAMESPACE minio 1 Wed Sep 11 11:47:51 2019 DEPLOYED minio-2.5.13 RELEASE.2019-08-07T01-59-21Z argo redis 1 Wed Sep 11 14:52:57 2019 DEPLOYED redis-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 REVISION UPDATED STATUS CHART APP VERSION NAMESPACE minio 1 Wed Sep 11 11:47:51 2019 DEPLOYED minio-2.5.13 RELEASE.2019-08-07T01-59-21Z argo redis 1 Wed Sep 11 14:52:57 2019 DEPLOYED redis-9.1.7 5.0.5 redis $ helm3 list NAME NAMESPACE REVISION UPDATED STATUS CHART
我们可以看到执行helm3 list命令并没有任何 release 信息,这是因为我们迁移的 minio 这个 release 是被安装在argo这个命名空间下面的,所以需要指定命名空间才可以看到:
$ helm3 list -n argo NAME NAMESPACE REVISION UPDATED STATUS CHART minio argo 1 2019-09-11 03:47:51.239461137 +0000 UTC deployed minio-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~
原文链接:https://helm.sh/blog/migrate-from-helm-v2-to-helm-v3/