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 config
。helm3 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 で設定) に変更できません。そのため、_強制的に_置き換える必要があります。
これを回避するには、次の手順を使用します:
- 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 -
- (オプション) 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サービスアカウントを使用していました。Helm3ではTillerを使用しなくなりました。helm upgrade
をクラスター管理者として実行している場合でも、ユーザーアカウントにはコマンドを実行するための適切なRBAC権限が必要です。自分自身に完全なRBAC権限を与えるには、以下を実行してください:
kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=your-user-name@domain.tld
その後、helm upgrade
は問題なく動作するはずです。