正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

バンドルされている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 STAGEbash -s -- -r RELEASE STAGEに置き換えます。
  • kubectlコンテキストのデフォルト以外のネームスペースにチャートをインストールした場合は、データベースアップグレードスクリプトにネームスペースを渡す必要があります。後で提供されるコマンド例で、bash -s STAGEbash -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-0

GitLabをアップグレードする

次の追加を含めて、標準的な手順に従ってGitLabをアップグレードします:

アップグレードコマンドで次のフラグを使用して、移行を無効にします:

  1. --set gitlab.migrations.enabled=false

バンドルされているPostgreSQLのデータベースの移行は、後の手順で実行します。

データベースを復元する

次の点に注意してください:

  • bash連想配列の使用が必要なため、スクリプトを正常に実行するには、Bash 4.0以上を使用する必要があります。
  1. Toolboxポッドのアップグレードが完了するまで待ちます。RELEASE_NAMEは、helm listからのGitLabリリースの名前である必要があります

    kubectl rollout status -w deployment/RELEASE_NAME-toolbox
  2. Toolboxポッドが正常にデプロイされたら、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

    この手順では、次のことを行います:

    1. webservicesidekiq、およびgitlab-exporterデプロイのレプリカを0に設定します。これにより、バックアップの復元中に他のアプリケーションがデータベースを変更できなくなります。
    2. preステージで作成されたバックアップからデータベースを復元する。
    3. 新しいバージョンのデータベース移行を実行します。
    4. 最初の手順からデプロイを再開します。

データベースのアップグレードプロセスのトラブルシューティング

  • アップグレード中にエラーが発生した場合は、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.usePasswordFilestrueに設定する必要があります。デフォルトはfalseです。

次のスクリプトは、シークレットのパッチに役立ちます:

  1. まず、既存のシークレットのバックアップを作成します。次のコマンドは、-backupという名前のサフィックスを持つ新しいシークレットにコピーします:

    kubectl get secrets ${RELEASE}-postgresql-password -o yaml | sed 's/name: \(.*\)$/name: \1-backup/' | kubectl apply -f -
  2. パッチが正しく表示されることを確認します:

    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}}'
  3. 次に、それを適用します:

    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}}')"