从 Helm v2 迁移到 Helm v3

从 Helm Chart 5.0 版(GitLab 14.0 版)开始,安装升级使用不再支持 Helm v2.x。 要获得未来的更新,您将需要迁移到 Helm v3。

Helm v2 和 Helm v3 之间的变化

Helm v3 引入了许多与 Helm v2 不向后兼容的更改。一些主要更改包括删除 Tiller 要求以及它们如何在集群上存储发布信息。在 Helm v3 更改概述更改自 Helm v2 常见问题解答

您用于部署应用程序的 Helm Chart 可能与新/旧版本的 Helm 不兼容。 如果您有多个使用 Helm v2 部署和管理的应用程序,您需要了解它们是否与 Helm v3 兼容,以防您也想转换它们。

从当前运行的应用程序的角度来看,执行从 Helm v2 到 v3 的迁移时没有任何变化。 执行 Helm v2 到 v3 迁移通常非常安全,但是,请务必备份 Helm v2 作为预防措施。

如何从 Helm v2 迁移到 Helm v3

您可以使用 Helm 2to3 插件 从 Helm v2 迁移到 Helm v3。有关此迁移插件的一些示例的更详细说明,请参阅 Helm 博客文章:如何从 Helm v2 迁移到 Helm v3

如果有多个人管理您的 GitLab Helm 安装,您可能需要在每台本地机器上执行 helm3 2to3 move config。 您只需要执行一次 helm3 2to3 convert

已知问题

“UPGRADE FAILED: cannot patch” error is shown after the migration

迁移后,后续升级可能会失败,并显示类似于以下内容的错误:

Error: UPGRADE FAILED: cannot patch "..." with kind Deployment: Deployment.apps "..." is invalid: spec.selector:
Invalid value: v1.LabelSelector{...}: field is immutable

or

Error: UPGRADE FAILED: cannot patch "..." with kind StatefulSet: StatefulSet.apps "..." is invalid:
spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden

这是由于 Cert ManagerRedis 中依赖项的 Helm 2 到 3 迁移的已知问题。简而言之,一些 Deployment 和 StatefulSet 上的 heritage 标签是不可变的,不能从 Tiller(由 Helm 2 设置)更改为 Helm(由 Helm 3 设置)。所以必须 强行 更换。

要解决此问题,请使用以下说明:

note这些指令_强制替换资源_,特别是Redis StatefulSet。 您需要确保附加到这个 StatefulSet 的数据卷是安全的并且保持完整。
  1. 替换 cert-manager Deployment(启用时)。
kubectl get deployments -l app=cert-manager -o yaml | sed "s/Tiller/Helm/g" | kubectl replace --force=true -f -
kubectl get deployments -l app=cainjector -o yaml | sed "s/Tiller/Helm/g" | kubectl replace --force=true -f -
  1. (可选)在 Redis StatefulSet 声明的 PV 上将 persistentVolumeReclaimPolicy 设置为 Retain。 这是为了确保 PV 不会被无意中删除。
kubectl patch pv <PV-NAME> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
  1. 将现有 Redis PVC 的 heritage 标签设置为 Helm
kubectl label pvc -l app=redis --overwrite heritage=Helm
  1. 无需级联替换 Redis StatefulSet。
kubectl get statefulsets.apps -l app=redis -o yaml | sed "s/Tiller/Helm/g" | kubectl replace --force=true --cascade=false -f -

运行 Helm 升级时迁移后的 RBAC 问题

在转换完成后运行 Helm upgrade 时,您可能会遇到以下错误:

Error: UPGRADE FAILED: pre-upgrade hooks failed: warning: Hook pre-upgrade gitlab/templates/shared-secrets/rbac-config.yaml failed: roles.rbac.authorization.k8s.io "gitlab-shared-secrets" is forbidden: user "your-user-name@domain.tld" (groups=["system:authenticated"]) is attempting to grant RBAC permissions not currently held:
{APIGroups:[""], Resources:["secrets"], Verbs:["get" "list" "create" "patch"]}

Helm2 使用 Tiller service account 来执行此类操作。 Helm3 不再使用 Tiller,即使您以集群管理员身份运行 helm upgrade,您的用户账号也应该具有适当的 RBAC 权限来运行该命令。要向自己授予完整的 RBAC 权限,请运行:

kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=your-user-name@domain.tld

之后,helm upgrade 应该可以正常工作。