前言
Helm v3发布后,带来了许多体系结构更改和新功能,最值得注意的是,删除了Tiller,并改进了升级过程。为了使用户更轻松地将其Helm v2版本转移到Helm v3,Helm维护人员还发布了一个插件,可以自动将其Helm v2版本转移到Helm v3。
在迁移到Helm v3之后,你可能会遇到后续升级失败的某些情况,例如,当升级尝试修改StatefulSet中的不可变字段时。在这些情况下,你可以尝试使用以下方法之一解决问题:
- 使用应用程序的内置备份/还原工具,备份Helm v2版本中的数据,并可以将其还原到Helm v3版本中。
- 在Helm v2版本中备份持久卷,然后使用Kubernetes备份/还原工具Velero,在Helm v3版本中重新部署它们。
本教程将引导你尝试这两种方法。
前提条件
- 你已经安装了Kubnetl和Helm v3 的Kubernetes集群。本教程使用Google Kubernetes Engine(GKE)集群,你也可以使用任何其他Kubernetes。
- 你之前已经使用Helm v2部署了Bitnami Helm Chart,向其中添加了数据,然后使用Helm迁移插件将其迁移到Helm v3。下面显示了执行这些任务的命令,其中PASSWORD和REPL-PASSWORD分别引用数据库和复制用户密码。
helm2 repo add bitnami https://charts.bitnami.com/bitnami helm2 install --name postgres bitnami/postgresql --set postgresqlPassword=PASSWORD --set replication.password=REPL-PASSWORD --set replication.slaveReplicas=1 --set replication.enabled=true --namespace default helm3 plugin install https://github.com/helm/helm-2to3 helm3 2to3 move config helm3 2to3 convert postgres
提示
本教程演示了如何使用Bitnami PostgreSQL Helm chart解决迁移后升级问题 。但是,对于其他Bitnami Helm Chart,也可以遵循相同的方法,但要注意以下的某些警告。
在本教程中,helm2指的是Helm v2 CLI,helm3指的是Helm v3 CLI。
方法1:使用内置应用程序工具备份和还原数据
使用应用程序的内置备份/还原功能来备份Helm v2版中的数据,然后在新的Helm v3发行版中还原此数据。此方法仅适用于具有内置备份/还原功能的应用程序。
步骤1:使用内置的PostgreSQL工具备份数据
第一步,备份正在运行的PostgreSQL版本中的数据。步骤如下:
- 获取PostgreSQL密码:
export POSTGRES_PASSWORD=$(kubectl get secret --namespace default postgres-postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode)
- 转发PostgreSQL服务端口:
kubectl port-forward --namespace default svc/postgres-postgresql 5432:5432 &
- 使用PostgreSQL pg_dumpall工具将所有数据库的内容备份到一个文件中。如果你的系统上未安装此工具,请使用Bitnami的PostgreSQL Docker容器映像(包含此工具和其他PostgreSQL客户端工具)执行备份,如下所示:
docker run --rm --name postgresql -e "PGPASSWORD=$POSTGRES_PASSWORD" --net="host" bitnami/postgresql:latest pg_dumpall -h 127.0.0.1 -U postgres > all.sql
在这里,– net参数使Docker容器可以使用主机的网络堆栈,从而获得对转发端口的访问权限。该pg_dumpall命令连接到PostgreSQL服务,并创建包含PostgreSQL所有数据库结构和记录的SQL文件。最后,– rm参数在pg_dumpall命令执行完成后,删除该容器。
- 停止服务端口转发。
在此步骤的最后,你会得到一个备份文件,其中包含正在运行的PostgreSQL中的数据。
步骤2:将数据还原到新的PostgreSQL版本中
下一步是创建一个空的PostgreSQL集群并将数据恢复到其中:
- 使用Helm v3在单独的命名空间中创建新的PostgreSQL版本。分别用数据库密码替换和用户密码替换PASSWORD和REPL-PASSWORD。
kubectl create namespace postgres-new helm3 repo add bitnami https://charts.bitnami.com/bitnami helm3 install postgres bitnami/postgresql --namespace postgres-new --set postgresqlPassword=PASSWORD --set replication.password=REPL-PASSWORD --set replication.slaveReplicas=1 --set replication.enabled=true
提示
两个版本的密码保持一致很重要,以避免身份验证问题。
- 创建一个包含新版本密码的环境变量:
export POSTGRES_PASSWORD=$(kubectl get secret --namespace postgres-new postgres-postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode)
- 转发新版本的PostgreSQL服务端口:
kubectl port-forward --namespace postgres-new svc/postgres-postgresql 5432:5432 &
- 使用psql工具将备份文件的内容还原到新版本中。如果你的系统上没有此工具,请在Bitnami的PostgreSQL Docker容器中将包含备份文件的目录作为卷挂载,并在容器映像中使用psql客户端工具将备份文件的内容导入新集群,如下所示:
docker run --rm --name postgresql -v $(pwd):/app -e "PGPASSWORD=$POSTGRES_PASSWORD" --net="host" bitnami/postgresql:latest psql -h 127.0.0.1 -U postgres -d postgres -f /app/all.sql
在这里,-v参数将当前目录(包含备份文件)安装到容器的/ app路径。然后,使用psql客户端工具连接到PostgreSQL服务并执行备份文件中的SQL命令,从而从之前版本中还原数据。和以前一样,– rm参数在命令执行完成后销毁容器。
- 停止服务端口转发。
- 连接到新部署,并确认你的数据已成功还原:
kubectl run postgres-postgresql-client --rm --tty -i --restart='Never' --namespace postgres-new --image docker.io/bitnami/postgresql:11.7.0-debian-10-r9 --env="PGPASSWORD=$POSTGRES_PASSWORD" --command -- psql --host postgres-postgresql -U postgres -d postgres -p 5432
步骤3:测试升级过程(可选)
你现在应该可以升级到新版本。你可以使用以下命令对此进行测试,其中VERSION替换为要升级的Chart版本:
helm3 upgrade --version VERSION postgres bitnami/postgresql --namespace postgres-new --set postgresqlPassword=PASSWORD --set replication.password=REPL-PASSWORD --set replication.slaveReplicas=1 --set replication.enabled=true
提示
版本升级时,请使用与安装时相同的参数。
确认一切正常后,你可以选择删除之前的版本。
方法2:备份和还原持久卷
复制应用程序的持久卷,并在新版本中重新使用它们。此方法仅适用于,在安装时允许使用持久性存储卷声明,且被Velero支持的Chart。许多Bitnami HelmChart都支持此功能。
步骤1:安装Velero
Velero是一个开源工具,可轻松备份和还原Kubernetes资源。它可以用于备份整个集群,或者如下图所示,可以对其进行微调以仅备份特定资源,例如持久卷。
- 请遵循Velero插件设置说明。如果你正在使用Google Cloud Platform(如本教程所述),请按照GCP插件设置说明创建服务帐户和存储分区并获取凭据文件。
- 然后,通过执行以下命令安装Velero,切记用存储桶的名称替换BUCKET-NAME,并用凭证文件的路径替换SECRET-FILENAME:
velero install --provider gcp --plugins velero/velero-plugin-for-gcp:v1.0.0 --bucket BUCKET-NAME --secret-file SECRET-FILENAME
安装Velero后,你应该会看到类似于以下屏幕截图的输出:
- 使用以下命令检查正在运行的Pod,以确认Velero部署是否成功:
kubectl get pods -n velero
步骤2:备份持久卷
接下来,使用Velero备份持久卷。
- 在正在运行的PostgreSQL中创建持久卷的备份。该备份将包含主卷和从卷。
velero backup create pgb --include-resources pvc,pv --selector release=postgres
- 执行以下命令,查看备份的内容并确认它包含所有必需的资源:
velero backup describe pgb --details
- 为避免备份数据被覆盖,请将存储桶修改为只读访问权限:
kubectl patch backupstoragelocation default -n velero --type merge --patch '{"spec":{"accessMode":"ReadOnly"}}'
步骤3:将持久卷还原到新的PostgreSQL版本
现在,你可以还原永久卷并将其与新的Helm v3版本集成。
- 使用Velero,在单独的namespace中还原持久卷。使用–namespace-mappings参数可以将资源从原始namespace映射到新namespace。
kubectl create namespace postgres-new velero restore create --from-backup pgb --namespace-mappings default:postgres-new
- 确认持久卷已在新的namespace中还原,并记下主数据库节点的卷名称:
kubectl get pvc --namespace postgres-new
- 删除与从节点对应的永久卷,仅保留与主节点对应的卷。如果有多个从属卷(取决于你最初部署Chart的方式),请删除所有从属卷。
kubectl delete pvc --namespace postgres-new SLAVE-PVC-NAME
- 使用Helm v3,在新的namespace中创建新的PostgreSQL版本。使用Chart的persistence.existingClaim参数。用之前版本的数据库密码和用户密码替换PASSWORD和REPL-PASSWORD,并用恢复的主节点卷的名称替换MASTER-PVC-NAME。
helm3 repo add bitnami https://charts.bitnami.com/bitnami helm3 install postgres bitnami/postgresql --set postgresqlPassword=PASSWORD --set replication.password=REPL-PASSWORD --set replication.slaveReplicas=1 --set replication.enabled=true --namespace postgres-new --set persistence.existingClaim=MASTER-PVC-NAME
提示
两个版本的密码保持一致很重要,以避免身份验证问题。
这将使用之前版本的主卷(并因此使用之前版本数据)创建一个的新版本。请注意,如上例所示,如果启用了复制,则安装Chart将自动为每个从属节点创建一个新的从属卷。
- 连接到新版本中,并确认你的数据是完整的:
kubectl run postgres-postgresql-client --rm --tty -i --restart='Never' --namespace postgres-new --image docker.io/bitnami/postgresql:11.7.0-debian-10-r9 --env="PGPASSWORD=$POSTGRES_PASSWORD" --command -- psql --host postgres-postgresql -U postgres -d postgres -p 5432
步骤4:测试升级过程(可选)
你现在应该可以升级到新版本。你可以使用以下命令对此进行测试,其中VERSION替换为要升级的Chart版本:
helm3 upgrade --version VERSION postgres bitnami/postgresql --set postgresqlPassword=hell0 --set replication.password=repl --set replication.slaveReplicas=1 --set replication.enabled=true --namespace postgres-new --set persistence.existingClaim=data-postgres-postgresql-master-0
提示
版本升级时,请使用与安装时相同的参数。
确认一切正常后,你可以选择删除之前的版本。
译文链接: https://docs.bitnami.com/tutorials/resolve-helm2-helm3-post-migration-issues/