安装 SonarQube后sonarqube-sonarqube无法启动的问题解决
1. 前言
我的环境:k8s集群(version 1.23.6),安装了Kubesphere(version v3.4)作为可视化界面,最近想要推动团队走CICD,于是在Kubesphere中启用了devops组件,参考:https://kubesphere.io/zh/docs/v3.4/pluggable-components/devops/ 。
组件安装完成后,需要将Sonarqube集成到流水线中,于是又安装了Sonarqube,参考:https://kubesphere.io/zh/docs/v3.4/devops-user-guide/how-to-integrate/sonarqube/ 。
按照步骤走完之后,不出意外的话意外又发生了,有两个工作负载没起来,分别是:
- sonarqube-sonarqube
- sonarqube-postgresql
通过查看Kubesphere观察,发现sonarqube-sonarqube一直在重启,于是我把存活探针与就绪探针暂时都去掉了。最后在日志发现报错如:
2020.11.27 09:55:47 INFO web[][o.sonar.db.Database] Create JDBC data source for jdbc:postgresql://sonarqube-postgresql:5432/sonarDB 2020.11.27 09:55:47 ERROR web[][o.s.s.p.PlatformImpl] Web server startup failed java.lang.IllegalStateException: Fail to connect to database
可以定位到时Postgresql有问题导致的,于是查看Postgresql服务的日志,发现:
Kubesphere sonarqube postgresql DETAIL: Role "sonarUser" does not exist
如果分析sonarqube-sonarqube和sonarqube-postgresql这两个工作负载配置文件可以发现,这个用户是sonarqube-postgresql在启动的时候创建的用户名,sonarqube-sonarqube也使用这个用户名去连接sonarqube-postgresql,密码存放在保密字典sonarqube-postgresql中。
通过上面的现象,可以分析出根本原因是sonarqube-postgresql在启动的时候根本没有创建sonarUser这个用户(可以通过sonarqube-postgresql的终端去验证)。
但是为什么sonarqube-postgresql没有成功创建出这个用户呢?
2. 原因分析
首先我把sonarqube-postgresql的两个探针都去掉了,重启,还是报同样的错误。
然后我把env中的POSTGRES_USER,POSTGRES_PASSWORD,POSTGRES_DB这三个值都改成新的值,重启,进入终端,发现还是无法创建用户。
这就很难办,最后通过查询,获得一个关键的信息(参考[1]):
Warning: the Docker specific variables will only have an effect if you start the container with a data directory that is empty; any pre-existing database will be left untouched on container startup.
也就是说,之前第一次启动的时候,sonarqube-postgresql还没有初始化完,就给就绪探针给干掉了,导致只做了部分初始化而没有创建用户,重启的时候由于绑定的pv已经存在数据库了,于是又无法创建用户,整个过程如下:
3. 解决
要解决上面创建用户失败的问题,首先需要延长探针的时间initialDelaySeconds或者直接把探针先去掉,等创建完用户之后,再重新加进去,同时需要先删除已有的数据库,也就是说删除pv,于是必须先删除绑定的pvc,然后要删除pvc也必须先删除绑定的pod,由于statefulset的重启策略无法设定为Never,因此无法通过停止pod来删除pvc。套娃套到这里,就只能先保存sonarqube-postgresql的配置(如Postgresql.yaml),然后把这个statefulset先删除了,然后删除pvc和pv(pv对应的nfs路径下的数据也可以删除)。
# 删除Postgresql statefulset kubectl delete statefulsets sonarqube-postgresql -n kubesphere-devops-system # 删除pvc kubectl delete pvc data-sonarqube-postgresql-0 -n kubesphere-devops-system # 获取pv PV=$(kubectl get pv -n kubesphere-devops-system | awk '$6 ~ /data-sonarqube-postgresql/ {print $1}') # 查看pv对于的nfs路径 kubectl describe pv $PV | grep Path # 删除pv kubectl delete pv $PV # (可选)登录nfs server所在主机,删除刚才获取的nfs路径
也可以通过Kubesphere进行操作。
然后删除Postgresql.yaml中的两个探针,重新创建statefulset,可以看到初始化过程还是很久的,在我的测试集群上差不多用了6分钟,日志如下:
postgresql 06:38:52.24 postgresql 06:38:52.24 Welcome to the Bitnami postgresql container postgresql 06:38:52.25 Subscribe to project updates by watching https://github.com/bitnami/bitnami-docker-postgresql postgresql 06:38:52.25 Submit issues and feature requests at https://github.com/bitnami/bitnami-docker-postgresql/issues postgresql 06:38:52.25 Send us your feedback at containers@bitnami.com postgresql 06:38:52.25 postgresql 06:38:52.26 INFO ==> ** Starting PostgreSQL setup ** postgresql 06:38:52.34 INFO ==> Validating settings in POSTGRESQL_* env vars.. postgresql 06:38:52.35 INFO ==> Loading custom pre-init scripts... postgresql 06:38:52.36 INFO ==> Initializing PostgreSQL database... postgresql 06:38:52.50 INFO ==> postgresql.conf file not detected. Generating it... postgresql 06:38:52.51 INFO ==> pg_hba.conf file not detected. Generating it... postgresql 06:38:52.51 INFO ==> Generating local authentication configuration postgresql 06:43:21.36 INFO ==> Starting PostgreSQL in background... postgresql 06:44:38.05 INFO ==> Creating user sonarUser postgresql 06:44:38.14 INFO ==> Grating access to "sonarUser" to the database "sonarDB" postgresql 06:44:38.23 INFO ==> Configuring replication parameters postgresql 06:44:38.28 INFO ==> Configuring fsync postgresql 06:44:38.41 INFO ==> Loading custom scripts... postgresql 06:44:38.42 INFO ==> Enabling remote connections postgresql 06:44:38.44 INFO ==> Stopping PostgreSQL... postgresql 06:44:41.46 INFO ==> ** PostgreSQL setup finished! ** postgresql 06:44:41.54 INFO ==> ** Starting PostgreSQL **
回到sonarqube-sonarqube服务,发现已经可以连接上了,并开始了初始化进程,观察日志:
2023.09.27 07:16:21 INFO web[][o.sonar.db.Database] Create JDBC data source for jdbc:postgresql://sonarqube-postgresql:5432/sonarDB 2023.09.27 07:16:21 INFO web[][o.s.s.p.ServerFileSystemImpl] SonarQube home: /opt/sonarqube 2023.09.27 07:16:21 INFO web[][o.s.s.u.SystemPasscodeImpl] System authentication by passcode is disabled 2023.09.27 07:16:21 WARN web[][o.s.s.p.DatabaseServerCompatibility] The database must be manually upgraded. Please backup the database and browse /setup. For more information: https://docs.sonarqube.org/latest/setup/upgrading 2023.09.27 07:16:21 WARN app[][startup] ################################################################################ 2023.09.27 07:16:21 WARN app[][startup] The database must be manually upgraded. Please backup the database and browse /setup. For more information: https://docs.sonarqube.org/latest/setup/upgrading 2023.09.27 07:16:21 WARN app[][startup] ################################################################################
连是连上了,但是要升级数据库,沃得法克……
查了一下Sonarqube支持的Postgresql版本,发现并不需要升级,参考:https://docs.sonarsource.com/sonarqube/latest/setup-and-upgrade/release-upgrade-notes/ 。
看前面的日志,Sonarqube运行一半又给探针干掉了……
于是我先删除Postgresql statefulset,删除pvc和pv,并清理了pv对应的nfs下面的路径。
然后重新创建Postgresql statefulset,等待初始化完成。
最后删除Sonarqube的两个探针并应用配置,最终终于输出:
2023.09.27 09:35:18 INFO ce[][o.s.ce.app.CeServer] Compute Engine is operational 2023.09.27 09:35:18 INFO app[][o.s.a.SchedulerImpl] Process[ce] is up 2023.09.27 09:35:18 INFO app[][o.s.a.SchedulerImpl] SonarQube is up
抬头一看,一天又过去了。
4. 参考
[1] SonarQube Community Edition on k8s Role “sonarUser” does not exist