バンドルされているPostgreSQLバージョンをアップグレードします
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab Self-Managed
これらの手順は、バンドルされているPostgreSQLチャート(postgresql.installがfalseでない)を使用している場合に該当し、外部PostgreSQLセットアップには該当しません。
バンドルされているbitnami PostgreSQLチャートは、本番環境に対応していません。本番環境に対応したGitLabチャートデプロイでは、外部データベースを使用してください。
バンドルされているPostgreSQLチャートを使用してPostgreSQLの新しいメジャーバージョンに変更するには、既存のデータベースのバックアップを作成し、新しいデータベースに復元することで行います。
このチャートの9.0.0リリースの一部として、デフォルトのPostgreSQLバージョンを14.8.0から16.6.0にアップグレードしました。これは、PostgreSQLチャートのバージョンを12.5.2から13.4.4にアップグレードすることで行われます。
これは、ドロップイン代替ではありません。データベースをアップグレードするには、手動による手順を実行する必要があります。手順は、アップグレードの手順に記載されています。
バンドルされているPostgreSQLをアップグレードする手順
これは、アップストリームPostgreSQLチャートのイシューが原因です。PostgreSQLパスワードに環境変数を使用せず、ファイルの使用を希望する場合は、以下の手順を実行する前に、手動による既存のPostgreSQLパスワードシークレットの編集、およびPostgreSQLチャートのパスワードファイルを有効化する手順に従う必要があります。
既存のデータベースを準備
次の点に注意してください:
- バンドルされているPostgreSQLチャート(
postgresql.installがfalseの場合)を使用していない場合は、これらの手順に従う必要はありません。 - 同じネームスペースに複数のチャートがインストールされている場合。データベースアップグレードスクリプトにHelmリリース名を渡す必要がある場合があります。後で提供されるコマンド例で、
bash -s STAGEをbash -s -- -r RELEASE STAGEに置き換えます。 kubectlコンテキストのデフォルト以外のネームスペースにチャートをインストールした場合は、データベースアップグレードスクリプトにネームスペースを渡す必要があります。後で提供されるコマンド例で、bash -s STAGEをbash -s -- -n NAMESPACE STAGEに置き換えます。このオプションは、-r RELEASEとともに使用できます。kubectl config set-context --current --namespace=NAMESPACEを実行するか、kubectxのkubensを使用して、コンテキストのデフォルトネームスペースを設定できます。
preステージでは、Toolboxのバックアップユーティリティスクリプトを使用してデータベースのバックアップを作成し、構成済みのS3バケット(デフォルトではMinIO)に保存します:
# GITLAB_RELEASE should be the version of the chart you are installing, starting with 'v': v6.0.0
curl -s "https://gitlab.com/gitlab-org/charts/gitlab/-/raw/${GITLAB_RELEASE}/scripts/database-upgrade" | bash -s pre既存のPostgreSQLデータを削除
PostgreSQLデータ形式が変更されたため、アップグレードするには、リリースをアップグレードする前に、既存のPostgreSQL StatefulSetを削除する必要があります。StatefulSetは、次の手順で再作成されます。
前の手順でデータベースのバックアップを作成したことを確認してください。バックアップがないと、GitLabデータが失われます。
kubectl delete statefulset RELEASE-NAME-postgresql
kubectl delete pvc data-RELEASE_NAME-postgresql-0GitLabをアップグレードする
次の追加を含めて、標準的な手順に従ってGitLabをアップグレードします:
アップグレードコマンドで次のフラグを使用して、移行を無効にします:
--set gitlab.migrations.enabled=false
バンドルされているPostgreSQLのデータベースの移行は、後の手順で実行します。
データベースを復元する
次の点に注意してください:
- bash連想配列の使用が必要なため、スクリプトを正常に実行するには、Bash 4.0以上を使用する必要があります。
Toolboxポッドのアップグレードが完了するまで待ちます。RELEASE_NAMEは、
helm listからのGitLabリリースの名前である必要がありますkubectl rollout status -w deployment/RELEASE_NAME-toolboxToolboxポッドが正常にデプロイされたら、
post手順を実行します:# GITLAB_RELEASE should be the version of the chart you are installing, starting with 'v': v6.0.0 curl -s "https://gitlab.com/gitlab-org/charts/gitlab/-/raw/${GITLAB_RELEASE}/scripts/database-upgrade" | bash -s postこの手順では、次のことを行います:
webservice、sidekiq、およびgitlab-exporterデプロイのレプリカを0に設定します。これにより、バックアップの復元中に他のアプリケーションがデータベースを変更できなくなります。- preステージで作成されたバックアップからデータベースを復元する。
- 新しいバージョンのデータベース移行を実行します。
- 最初の手順からデプロイを再開します。
データベースのアップグレードプロセスのトラブルシューティング
アップグレード中にエラーが発生した場合は、
gitlab-upgrade-checkポッドの説明を確認すると詳細がわかる場合があります:kubectl get pods -lrelease=RELEASE,app=gitlab kubectl describe pod <gitlab-upgrade-check-pod-full-name>
既存のPostgreSQLパスワードシークレットを編集
これは7.0.0のアップグレードのみを対象としており、PostgreSQLサービスコンテナ内でパスワードファイルの使用を強制する場合にのみ該当します。
新しいバージョンのPostgreSQLチャートは、異なるキーを使用してシークレット内のパスワードを参照します。postgresql-passwordおよびpostgresql-postgres-passwordの代わりに、passwordおよびpostgres-passwordを使用します。これらのキーは、値を変更せずに、RELEASE-postgresql-passwordシークレットで変更する_必要があります_。
このシークレットは、GitLabチャートによって初めて生成され、アップグレード中またはアップグレード後には変更されません。したがって、シークレットを編集し、キーを変更する必要があります。
シークレットを編集したら、必ずHelmアップグレード値でpostgresql.auth.usePasswordFilesをtrueに設定する必要があります。デフォルトはfalseです。
次のスクリプトは、シークレットのパッチに役立ちます:
まず、既存のシークレットのバックアップを作成します。次のコマンドは、
-backupという名前のサフィックスを持つ新しいシークレットにコピーします:kubectl get secrets ${RELEASE}-postgresql-password -o yaml | sed 's/name: \(.*\)$/name: \1-backup/' | kubectl apply -f -パッチが正しく表示されることを確認します:
kubectl get secret ${RELEASE}-postgresql-password \ -o go-template='{"data":{"password":"{{index .data "postgresql-password"}}","postgres-password":"{{index .data "postgresql-postgres-password"}}","postgresql-password":null,"postgresql-postgres-password":null}}'次に、それを適用します:
kubectl patch secret ${RELEASE}-postgresql-password --patch "$( kubectl get secret ${RELEASE}-postgresql-password \ -o go-template='{"data":{"password":"{{index .data "postgresql-password"}}","postgres-password":"{{index .data "postgresql-postgres-password"}}","postgresql-password":null,"postgresql-postgres-password":null}}')"