如何通过Kubernetes Proxy访问SonarQube并配置服务器基础地址
这个问题的核心是SonarQube不知道自己是通过Kubernetes Proxy的特定路径被访问的,导致生成的API请求URL缺少了Proxy的前缀路径,从而无法正确路由。
问题分析
你已经设置了sonar.web.context=/sonar,这让SonarQube内部的资源路径都带上了/sonar前缀,但Kubernetes Proxy的访问路径是http://localhost:8001/api/v1/namespaces/sonar/services/sonar:80/proxy/sonar/,SonarQube生成API请求时只使用了/sonar上下文,没有包含Proxy的完整前缀/api/v1/namespaces/sonar/services/sonar:80/proxy,所以请求变成了http://localhost:8001/sonar/api/...,自然无法访问。
解决方案:设置SonarQube的基础URL
你需要在Deployment的启动参数中添加sonar.web.baseUrl,指定SonarQube对外暴露的完整基础URL,这样SonarQube生成的所有前端请求都会基于这个URL构建。
修改你的Deployment配置,更新容器的args部分,加上-Dsonar.web.baseUrl=http://localhost:8001/api/v1/namespaces/sonar/services/sonar:80/proxy/sonar:
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: sonarqube spec: replicas: 1 template: metadata: name: sonarqube labels: name: sonarqube spec: containers: - image: sonarqube:latest args: - -Dsonar.web.context=/sonar - -Dsonar.web.baseUrl=http://localhost:8001/api/v1/namespaces/sonar/services/sonar:80/proxy/sonar name: sonarqube env: - name: SONARQUBE_JDBC_PASSWORD value: sonar - name: SONARQUBE_JDBC_URL value: jdbc:postgresql://sonar-postgres:5432/sonar ports: - containerPort: 9000 name: sonarqube
为什么这样有效?
sonar.web.baseUrl参数会告诉SonarQube它对外提供服务的完整URL,包括所有的前缀路径。当前端页面生成API请求时,会基于这个完整URL来拼接具体的API路径,比如原本的/sonar/api/l10n/index?locale=de-DE会变成http://localhost:8001/api/v1/namespaces/sonar/services/sonar:80/proxy/sonar/api/l10n/index?locale=de-DE,这样就能通过Kubernetes Proxy正确路由到SonarQube服务了。
额外注意事项
- 如果之后你的Kubernetes Proxy访问路径发生变化(比如命名空间变更、Service名称变更),需要同步更新
sonar.web.baseUrl的值。 - 这个URL是给前端页面使用的,SonarQube容器本身不需要能访问这个地址,只要客户端(你的浏览器)能正常访问Kubernetes Proxy即可。
内容的提问来源于stack exchange,提问作者Dennis P

