迁移Helm v3后Chart升级问题解决

前言

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/

K8S中文社区微信公众号

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址