升级绑定的 PostgreSQL 版本

note 这些步骤适用于使用捆绑的 PostgreSQL chart(postgresql.install 不是 false),而不适用于外部 PostgreSQL 设置。

使用捆绑 PostgreSQL chart 更改到 PostgreSQL 的新主要版本,是通过备份现有数据库,然后恢复到新数据库完成的。

note 作为 7.0.0 版本 chart 的一部分,我们将默认的 PostgreSQL 版本从 12.7.0 升级到 14.8.0。这是通过将 PostgreSQL chart 版本从 8.9.4 升级到 12.5.2 来完成的。

此变更无法自动替换,您需要执行手动步骤来升级数据库。 这些步骤已记录在升级步骤中。

note 作为 5.0.0 版本 chart 的一部分,我们将捆绑的 PostgreSQL 版本从 11.9.0 升级到 12.7.0。这不是直接升级,需要执行手动步骤来升级数据库。这些步骤已记录在升级步骤 中。

升级捆绑 PostgreSQL 的步骤

note 7.0.0 版本开始,极狐GitLab chart 不再将 PostgreSQL 凭据作为文件安装在 PostgreSQL 实例中,这是通过将 postgresql.auth.usePasswordFiles 设置为 false 来完成的,且意味着数据库凭据作为环境变量而不是密码文件传递,仅适用于此组件。

这是由于上游 PostgreSQL chart 中的问题所致。如果您不想为 PostgreSQL 密码使用环境变量,而更喜欢使用文件,则需要在执行以下步骤之前,按照手动编辑现有 PostgreSQL 密码 Secret 和启用密码的说明进行操作,为 PostgreSQL chart 创建文件。

准备已有的数据库

请注意以下事项:

  • 如果您没有使用捆绑的 PostgreSQL chart(postgresql.install 为 false),则不需要执行这些步骤。
  • 如果您在同一个命名空间中安装了多个 chart。可能还需要将 Helm 版本名称传递给数据库升级脚本。在后面提供的示例命令中将 bash -s STAGE 替换为bash -s -- -r RELEASE STAGE
  • 如果您将 chart 安装到除 kubectl 上下文默认值之外的命名空间,则必须将该命名空间传递给数据库升级脚本。在后面提供的示例命令中将 bash -s STAGE 替换为 bash -s -- -n NAMESPACE STAGE。此选项可以与-r RELEASE 一起使用。您可以通过运行 kubectl config set-context --current --namespace=NAMESPACE 或使用 kubens from kubectx 来设置上下文的默认命名空间。

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://jihulab.com/gitlab-cn/charts/gitlab/-/raw/${GITLAB_RELEASE}/scripts/database-upgrade" | bash -s pre

删除已有的 PostgreSQL 数据

note 由于 PostgreSQL 数据格式已更改,因此升级需要在升级版本之前删除现有的 PostgreSQL StatefulSet。 StatefulSet 将在下一步中重新创建。
caution 确保您已在上一步中创建了数据库备份。 如果没有备份,极狐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 4.0 或更高版本才能成功运行脚本,因为它需要使用 bash 关联数组。
  1. 等待 Toolbox pod 的升级完成。 RELEASE_NAME 应该是 helm list 中 GitLab 版本的名称

    kubectl rollout status -w deployment/RELEASE_NAME-toolbox
    
  2. Toolbox pod 部署成功后,运行 post 步骤:

    # GITLAB_RELEASE should be the version of the chart you are installing, starting with 'v': v6.0.0
    curl -s "https://jihulab.com/gitlab-cn/charts/gitlab/-/raw/${GITLAB_RELEASE}/scripts/database-upgrade" | bash -s post
    

    此步骤将执行以下操作:

    1. webservicesidekiqgitlab-exporter deployment 的副本设置为 0。这将防止任何其它应用程序在恢复备份时更改数据库。
    2. 从前阶段创建的备份恢复数据库。
    3. 为新版本运行数据库迁移。
    4. 恢复第一步中的所有 deployment。

数据库升级过程故障排除

  • 如果您在升级过程中看到任何失败,查看 gitlab-upgrade-check pod 的描述以获取详细信息可能会很有用:

    kubectl get pods -lrelease=RELEASE,app=gitlab
    kubectl describe pod <gitlab-upgrade-check-pod-full-name>
    

编辑现有的 PostgreSQL 密码 Secret

note 仅适用于 7.0.0 升级,并且仅当您想要强制使用 PostgreSQL 服务容器内的密码文件时适用。

PostgreSQL chart 的新版本使用不同的密钥来引用 Secrets 中的密码,现在使用 passwordpostgres-password 而不是 postgresql-passwordpostgresql-postgres-password。这些键必须在 RELEASE-postgresql-password Secret 中更改,且不更改它们的值。

此 Secret 由极狐GitLab chart 首次生成,在升级期间或升级后不会更改。因此,您需要编辑 Secret 并更改密钥。

编辑 Secret 后,您必须 在 Helm 升级值中,将 postgresql.auth.usePasswordFiles 设置为 true。默认值为 false

以下脚本可以帮助您修补 secret:

  1. 首先创建现有 Secret 的备份。使用以下命令将其复制到名称后缀为 -backup 的新 Secret 中:

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