Helm v2からHelm v3へのマイグレーション

Helm v2は2020年11月に正式に非推奨となりました。GitLab Helmチャートバージョン5.0(GitLabアプリバージョン14.0)から、Helm v2.xを使ったインストールやアップグレードはサポートされなくなりました。今後GitLabのアップデートを受けるには、Helm v3にマイグレーションする必要があります。

Helm v2 と Helm v3 の変更点

Helm v3では、Helm v2との後方互換性がない多くの変更が導入されています。 主な変更点としては、Tillerの要件の削除やクラスター上のリリース情報の保存方法などがあります。詳しくはHelm v3の変更点概要と Helm v2からの変更点FAQをご覧ください。

アプリケーションのデプロイに使用しているHelm Chartは、新しい/古いバージョンのHelmと互換性がない可能性があります。Helm v2 でデプロイして管理しているアプリケーションが複数ある場合、それらのアプリケーションも Helm v3 に変換したい場合に備えて、互換性があるかどうかを確認する必要があります。GitLab Helm chartは、GitLab Helm chartのバージョンv3.0.0からHelm v3.0.2以上をサポートしています。Helm v2のサポートは終了しました。

Helm v2からv3へのマイグレーションを実行しても、現在動作しているアプリケーションの観点からは何も変わりません。 Helm v2からv3へのマイグレーションを実行するのは一般的にかなり安全ですが、念のためHelm v2のバックアップを取るようにしてください。

Helm v2からHelm v3へのマイグレーション方法

Helm 2to3 プラグインを使うと、GitLab リリースを Helm v2 から Helm v3 にマイグレーションできます。このマイグレーションプラグインについての例を交えた詳しい説明は、Helmブログの投稿を参照してください:Helm v2からHelm v3へのマイグレーション方法

GitLab Helmのインストールを複数の人で管理している場合は、それぞれのローカルマシンでhelm3 2to3 move confighelm3 2to3 convert を実行するのは一度だけです。

既知のイシュー

マイグレーション後に “UPGRADE FAILED: cannot patch” エラーが表示される問題

マイグレーション後、次のようなエラーでアップグレードに失敗することがあります:

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

あるいは

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へのマイグレーションの既知の問題によるものです。簡単に説明すると、一部のデプロイとステートフルセットのheritage ラベルは不変で、Tiller (Helm 2 で設定) からHelm (Helm 3 で設定) に変更できません。そのため、_強制的に_置き換える必要があります。

これを回避するには、次の手順を使用します:

note
これらの命令は、リソース(特にRedis StatefulSet)を_強制的に置き換えます_。このStatefulSetにアタッチされたデータボリュームが安全で、無傷であることを確認する必要があります。
  1. cert-managerデプロイメントを置き換えます(有効な場合)。
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のpersistentVolumeReclaimPolicyRetain に設定します。これは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サービスアカウントを使用していました。Helm3ではTillerを使用しなくなりました。helm upgrade をクラスター管理者として実行している場合でも、ユーザーアカウントにはコマンドを実行するための適切なRBAC権限が必要です。自分自身に完全なRBAC権限を与えるには、以下を実行してください:

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

その後、helm upgrade は問題なく動作するはずです。