升级SonarQube至官方Helm Chart时如何保留原有数据库数据?
关于SonarQube Helm Chart迁移的数据安全问题
直接执行给定命令会导致数据丢失吗?
会。你之前使用的是oteemo第三方Chart,现在要替换为SonarSource官方Chart,两者的资源定义(比如存储卷、数据库配置)结构差异极大。直接执行helm upgrade --install会让Helm尝试用新Chart的资源替换旧资源,大概率会导致旧的PersistentVolumeClaim(PVC)被删除,或者新实例无法访问原有数据,最终丢失SonarQube的历史分析数据、配置等核心内容。
保留数据的迁移步骤
1. 先备份现有数据
根据你使用的数据库类型选择对应操作:
- 内置H2数据库:
- 查找旧SonarQube的Pod名称:
kubectl get pods -n sonarqube - 将Pod内的数据库目录复制到本地备份:
kubectl cp sonarqube/<旧Pod名称>:/opt/sonarqube/data ./sonar-backup
- 查找旧SonarQube的Pod名称:
- 外部数据库(如PostgreSQL):
使用对应数据库的备份工具导出全量数据,比如PostgreSQL用pg_dump命令完成备份。
2. 卸载旧Helm Release,但保留关键存储资源
不要直接用helm uninstall删除所有资源,按以下步骤操作:
- 查看旧Release创建的PVC:
kubectl get pvc -n sonarqube,记录下PVC的名称(通常类似sonarqube-sonarqube) - 卸载旧Release,同时保留PVC等存储资源:
helm uninstall -n sonarqube sonarqube --keep-resources
若该参数不生效,可先卸载Release,再手动标记PVC为保留:kubectl annotate pvc <PVC名称> helm.sh/resource-policy=keep -n sonarqube
3. 部署官方Chart并恢复数据
根据数据库类型操作:
外部数据库:
部署时指定连接原有外部数据库的参数,覆盖官方Chart的默认配置:helm upgrade --install -n sonarqube sonarqube sonarqube/sonarqube \ --set jdbc.url="jdbc:postgresql://<外部数据库地址>:5432/sonarqube" \ --set jdbc.username="<数据库用户名>" \ --set jdbc.password="<数据库密码>"实例启动后会自动读取原有外部数据库的数据。
内置H2数据库:
方式一:复用旧PVC
直接指定新Chart使用之前保留的旧PVC:helm upgrade --install -n sonarqube sonarqube sonarqube/sonarqube \ --set persistence.existingClaim="<旧PVC名称>"方式二:恢复本地备份数据
- 临时部署Chart并禁用实例启动(避免初始化新数据):
helm upgrade --install -n sonarqube sonarqube sonarqube/sonarqube \ --set sonar.web.javaOpts="-Dsonar.web.dryRun=true" - 找到新Pod名称:
kubectl get pods -n sonarqube - 将本地备份的目录复制到新Pod对应路径:
kubectl cp ./sonar-backup sonarqube/<新Pod名称>:/opt/sonarqube/ - 重新升级Chart,移除dryRun参数让实例正常启动:
helm upgrade -n sonarqube sonarqube sonarqube/sonarqube \ --reuse-values
- 临时部署Chart并禁用实例启动(避免初始化新数据):
4. 验证数据完整性
新实例启动后,登录SonarQube控制台,检查项目历史、质量规则配置、用户信息等数据是否完整,确认迁移成功。
内容的提问来源于stack exchange,提问作者Sabo Boz
相关产品推荐
相关产品推荐

