从 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 Manager 和 Redis 中依赖项的 Helm 2 到 3 迁移的已知问题。简而言之,一些 Deployment 和 StatefulSet 上的 heritage
标签是不可变的,不能从 Tiller
(由 Helm 2 设置)更改为 Helm
(由 Helm 3 设置)。所以必须 强行 更换。
要解决此问题,请使用以下说明:
- 替换 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 -
- (可选)在 Redis StatefulSet 声明的 PV 上将
persistentVolumeReclaimPolicy
设置为Retain
。 这是为了确保 PV 不会被无意中删除。
kubectl patch pv <PV-NAME> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
- 将现有 Redis PVC 的
heritage
标签设置为Helm
。
kubectl label pvc -l app=redis --overwrite heritage=Helm
- 无需级联替换 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
应该可以正常工作。