2021年5月27日木曜日

Gitlab helm chart でバージョン3 からバージョン4 にアップグレードする方法

Gitlab helm chart でバージョン3 からバージョン4 にアップグレードする方法

概要

Gitlab の helm chart を使ってバージョン3 の chart からバージョン4 の chart へアップグレードする方法を紹介します

ポイントは

  • PostgreSQL のバージョンアップが必要
  • アップグレードするには順番がある

という点です

環境

  • helm 3.5.2
  • k8s 1.20.1
  • Gitlab 3.3.14 -> 4.0.12 -> 4.12.0

事前準備

default の storageClass を作成するか local を使って pvc を作成しましょう

また基本的にはドメインでアクセスすることを想定しているので helm chart にデプロイした Gitlab のレコードと minio のレコードを登録しましょう

バージョン3 のインストール

まずはバージョン3 をインストールします 今回は事前にワイルドカード SSL 証明書を登録しています

helm install gitlab gitlab/gitlab \
--namespace gitlab \
--timeout 600s \
--version 3.3.13 \
--set global.hosts.domain=gitlab.example.com \
--set certmanager.install=false \
--set global.ingress.configureCertmanager=false \
--set global.ingress.tls.secretName=gitlab-tls \
--set nginx-ingress.controller.hostNetwork=true \
--set nginx-ingress.controller.service.type="" \
--set nginx-ingress.controller.kind=DaemonSet \
--set nginx-ingress.controller.service.externalTrafficPolicy="" \
--set gitlab-runner.install=false

ここでインストールされる Gitlab のバージョンは 12.10.4 になります

ログインするには以下のコマンドで root ユーザのパスワードを取得します

kubectl get secret gitlab-gitlab-initial-root-password -n gitlab -ojsonpath='{.data.password}' | base64 --decode ; echo

ログインできたらアップグレード後にもデータがあることを確認するために適当にプロジェクトを作成しておきましょう

データベースのバックアップ

次にデータベースのバックアップを作成します 専用のスクリプトが良いされているのでそれを実行するだけです

今回は gitlab namespace 上に helm を展開しているのでバックアップスクリプト実行時にも namespace を指定する必要があります またバックアップファイルは minio へアップロードします ドメインで minio にアクセスできる必要があるので事前に A レコードを設定しておきましょう

  • curl -s "https://gitlab.com/gitlab-org/charts/gitlab/raw/v4.0.12/scripts/database-upgrade" | bash -s -- -n gitlab pre

v4.0.12 は次のアップグレードする Gitlab の helm chart のバージョンになります 現在のバージョンではなく次期バージョンを指定する必要があります

Unable to use a TTY - input is not a terminal or the right kind of file
2021-05-24 06:24:05 +0000 -- Dumping database ...
Dumping PostgreSQL database gitlabhq_production ... [DONE]
2021-05-24 06:24:07 +0000 -- done
Packing up backup tar
WARNING: Module python-magic is not available. Guessing MIME types based on file extensions.
[DONE] Backup can be found at s3://gitlab-backups/database_upgrade_4_gitlab_backup.tar

バックアップファイルが minio にアップロードできれば完了です

データベースの削除

これで古いデータベースの Pod を削除することができます StatefulSet と PersistentVolumeClaim を削除しましょう

  • kubectl delete statefulset gitlab-postgresql -n gitlab
  • kubectl delete pvc data-gitlab-postgresql-0 -n gitlab

バージョン4 へアップグレード

ではバージョン4 の chart へアップグレードします --version オプションを使ってアップグレードする helm chart のバージョンを指定します 今回は 4 系の最新版にする前に必ず 4.0.12 を踏む必要があるのでそれを指定します

他のパラメータは install 時と全く同じ値を指定しましょう

helm upgrade gitlab gitlab/gitlab \
--namespace gitlab \
--timeout 600s \
--version 4.0.12 \
--set global.hosts.domain=gitlab.example.com \
--set certmanager.install=false \
--set global.ingress.configureCertmanager=false \
--set global.ingress.tls.secretName=gitlab-tls \
--set nginx-ingress.controller.hostNetwork=true \
--set nginx-ingress.controller.service.type="" \
--set nginx-ingress.controller.kind=DaemonSet \
--set nginx-ingress.controller.service.externalTrafficPolicy="" \
--set gitlab-runner.install=false

Gitlab が起動できたらバージョンを GUI で確認してみましょう 13.0.4 になっていることが確認できると思います

あとは前のバージョンで minio に作成しておいたデータベースのバックアップをリストアすれば OK です

データベースの作り直し

バックアップ時と同じ用にリストア用のスクリプトが提供されています namespace の指定が必要になります minio へのアクセスがドメインで必要になります

  • curl -s "https://gitlab.com/gitlab-org/charts/gitlab/raw/v4.0.12/scripts/database-upgrade" | bash -s -- -n gitlab post

ALTER TABLE などが走ります 成功すると以下のようなログが最後に流れます

...
(以下最後の部分だけ抜粋)
...
Starting: gitlab-sidekiq-all-in-1-v1
deployment.apps/gitlab-sidekiq-all-in-1-v1 patched
Starting: gitlab-gitlab-exporter
deployment.apps/gitlab-gitlab-exporter patched
Starting: gitlab-webservice
deployment.apps/gitlab-webservice patched
configmap "database-upgrade" deleted

これで Gitlab を確認するとバージョン3 のときに作成しておいたプロジェクトが存在することが確認できると思います

おまけ: バージョン4 の最新版へアップデート

執筆時の最新版の chart --version 4.12.0 を指定して upgrade しましょう

helm upgrade gitlab gitlab/gitlab \
--namespace gitlab \
--timeout 600s \
--version 4.12.0 \
--set global.hosts.domain=gitlab.example.com \
--set certmanager.install=false \
--set global.ingress.configureCertmanager=false \
--set global.ingress.tls.secretName=gitlab-tls \
--set nginx-ingress.controller.hostNetwork=true \
--set nginx-ingress.controller.service.type="" \
--set nginx-ingress.controller.kind=DaemonSet \
--set nginx-ingress.controller.service.externalTrafficPolicy="" \
--set gitlab-runner.install=false

完了すれば Gitlab 13.12 になっているはずです

トラブルシューティング

データベースが古いときに出るエラー

Gitlab12 から Gitlab13 にアップグレードする場合は PostgreSQL のバージョンが 10 -> 11 になります PostgreSQL の chart が古いバージョンのまま upgrade しようとすると以下のようなエラーが発生します

# kubectl logs -n gitlab gitlab-postgresql-0 -c gitlab-postgresql
2021-05-24 06:09:53.785 GMT [1] DETAIL:  The data directory was initialized by PostgreSQL version 10, which is not compatible with this version 11.7.

データベースのバックアップの取得に失敗する場合

バックアップ時に tar ファイルを作成するのですがそれを s3 (minio) にアップロードします minio へのアクセスはドメイン経由で行うので minio にアクセスすることができる A レコードが DNS に登録されていないとバックアップに失敗します

upgrade チェックをする方法

データベースのバージョンや upgrade パスを確認すことができます どこまで信頼できるかわかりませんが事前に実行して必要な条件を確認しておいても良いと思います

helm upgrade コマンドを実行すると upgrade チェック用の pod が起動するのでそれのログを確認すれば OK です

# kubectl logs -n gitlab gitlab-gitlab-upgrade-check-6b5gv
It seems you are upgrading the GitLab Helm Chart from 3.3.13 (GitLab 12.10.14) to 4.12.0 (GitLab 13.12.0).
It is required to upgrade to the latest 4.0.x version first before proceeding.
Please follow the upgrade documentation at https://docs.gitlab.com/charts/releases/4_0.html
and upgrade to GitLab Helm Chart version 4.0.x before upgrading to 4.12.0.

最後に

今回は 1 プロジェクトしかデータ移行していませんが環境によってはもっと多くのデータがあると思います その場合はバックアップとリストアにもっと多くの時間がかかるのと状況によってはバックアップするために別途ストレージの拡張が必要になるケースもあるかなと思います

また helm chart もデータベースが外部にあったりするとまた手順も変わってくるようです

手順的には簡単なのですがやはりトライアンドエラーが必要になるような気がします

参考サイト

0 件のコメント:

コメントを投稿