升级绑定的 PostgreSQL 版本
postgresql.install
不是 false),而不适用于外部 PostgreSQL 设置。使用捆绑 PostgreSQL chart 更改到 PostgreSQL 的新主要版本,是通过备份现有数据库,然后恢复到新数据库完成的。
7.0.0
版本 chart 的一部分,我们将默认的 PostgreSQL 版本从 12.7.0
升级到 14.8.0
。这是通过将 PostgreSQL chart 版本从 8.9.4
升级到 12.5.2
来完成的。此变更无法自动替换,您需要执行手动步骤来升级数据库。 这些步骤已记录在升级步骤中。
5.0.0
版本 chart 的一部分,我们将捆绑的 PostgreSQL 版本从 11.9.0
升级到 12.7.0
。这不是直接升级,需要执行手动步骤来升级数据库。这些步骤已记录在升级步骤 中。升级捆绑 PostgreSQL 的步骤
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 数据
kubectl delete statefulset RELEASE-NAME-postgresql
kubectl delete pvc data-RELEASE_NAME-postgresql-0
升级极狐GitLab
按照我们的标准程序 升级极狐GitLab,并添加以下内容:
在升级命令中使用以下标志禁用迁移:
--set gitlab.migrations.enabled=false
我们将在稍后的步骤中为捆绑的 PostgreSQL 执行数据库的迁移。
恢复数据库
请注意以下事项:
- 您需要使用 Bash 4.0 或更高版本才能成功运行脚本,因为它需要使用 bash 关联数组。
-
等待 Toolbox pod 的升级完成。 RELEASE_NAME 应该是
helm list
中 GitLab 版本的名称kubectl rollout status -w deployment/RELEASE_NAME-toolbox
-
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
此步骤将执行以下操作:
- 将
webservice
、sidekiq
和gitlab-exporter
deployment 的副本设置为 0。这将防止任何其它应用程序在恢复备份时更改数据库。 - 从前阶段创建的备份恢复数据库。
- 为新版本运行数据库迁移。
- 恢复第一步中的所有 deployment。
- 将
数据库升级过程故障排除
-
如果您在升级过程中看到任何失败,查看
gitlab-upgrade-check
pod 的描述以获取详细信息可能会很有用:kubectl get pods -lrelease=RELEASE,app=gitlab kubectl describe pod <gitlab-upgrade-check-pod-full-name>
编辑现有的 PostgreSQL 密码 Secret
7.0.0
升级,并且仅当您想要强制使用 PostgreSQL 服务容器内的密码文件时适用。PostgreSQL chart 的新版本使用不同的密钥来引用 Secrets 中的密码,现在使用 password
和 postgres-password
而不是 postgresql-password
和 postgresql-postgres-password
。这些键必须在 RELEASE-postgresql-password
Secret 中更改,且不更改它们的值。
此 Secret 由极狐GitLab chart 首次生成,在升级期间或升级后不会更改。因此,您需要编辑 Secret 并更改密钥。
编辑 Secret 后,您必须 在 Helm 升级 values 文件中,将 postgresql.auth.usePasswordFiles
设置为 true
。默认值为 false
。
以下脚本可以帮助您修补 secret:
-
首先创建现有 Secret 的备份。使用以下命令将其复制到名称后缀为
-backup
的新 Secret 中: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}}')"