概要
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 件のコメント:
コメントを投稿