K8s部署SonarQube:FQDN无法访问但IP可行问题求助
问题:GitLab流水线无法通过HTTPS FQDN访问Kubernetes上的SonarQube
已在Kubernetes通过Helm部署SonarQube,配置Ingress实现HTTPS访问,且已设置正确的Server base URL。但GitLab流水线执行时报错:
[ERROR] SonarQube server [https://sonarqube.mydomain.com] can not be reached
改用不带HTTPS的Service外部IP+端口9000访问则正常。
部署环境细节
Helm安装命令
helm upgrade --install -n sonarqube sonarqube sonarqube/sonarqube -f values.yaml
Ingress配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: ingressClassName: nginx meta.helm.sh/release-name: sonarqube meta.helm.sh/release-namespace: sonarqube nginx.ingress.kubernetes.io/proxy-body-size: 64m labels: app: sonarqube app.kubernetes.io/managed-by: Helm chart: sonarqube-10.1.0_628 heritage: Helm release: sonarqube name: sonarqube-sonarqube namespace: sonarqube spec: ingressClassName: nginx rules: - host: sonarqube.mydomain.com http: paths: - backend: service: name: sonarqube-sonarqube port: number: 9000 path: / pathType: ImplementationSpecific tls: - hosts: - sonarqube.mydomain.com secretName: sonar-tls
Kubernetes资源状态
执行kubectl -n sonarqube get all输出:
NAME READY STATUS RESTARTS AGE pod/sonarqube-postgresql-0 1/1 Running 0 23h pod/sonarqube-sonarqube-0 1/1 Running 0 23h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/sonarqube-postgresql ClusterIP 10.104.77.155 <none> 5432/TCP 23h service/sonarqube-postgresql-headless ClusterIP None <none> 5432/TCP 23h service/sonarqube-sonarqube LoadBalancer 10.97.71.8 10.10.10.33 9000:31092/TCP 23h NAME READY AGE statefulset.apps/sonarqube-postgresql 1/1 23h statefulset.apps/sonarqube-sonarqube 1/1 23h
排查与解决方案
1. 验证GitLab Runner的网络可达性
登录GitLab Runner所在节点(或Pod,若Runner部署在K8s集群内),执行curl -v https://sonarqube.mydomain.com,根据输出定位问题:
- DNS解析失败:确认Runner节点的DNS配置能解析
sonarqube.mydomain.com,或在Runner配置中手动添加hosts映射。 - 证书信任问题:如果使用自签证书,需将
sonar-tls中的CA证书导入Runner的系统信任根目录(如/usr/local/share/ca-certificates/),并更新证书缓存。 - 连接超时/拒绝:检查Ingress Controller的外部IP是否能被Runner访问,同时确认防火墙、安全组已开放443端口。
2. 检查Ingress Controller的运行状态
- 确认Ingress Controller已正常部署,且外部IP配置正确:执行
kubectl get ingress -n sonarqube,查看ADDRESS字段是否为Ingress Controller的有效外部IP。 - 查看Ingress日志,确认请求是否到达:
若没有相关日志输出,说明请求未到达Ingress,需排查DNS解析或网络路由问题。kubectl logs -n ingress-nginx deployment/ingress-nginx-controller -f | grep sonarqube.mydomain.com
3. 完善Ingress与SonarQube的HTTPS转发配置
- 确认SonarQube后台的
Server base URL已设置为https://sonarqube.mydomain.com(路径:Administration > Configuration > General Settings > Server)。 - 更新Ingress配置,添加HTTPS转发相关注解,确保SonarQube识别HTTPS请求:
在Ingress的metadata.annotations中添加:
应用更新后,重启SonarQube Pod使配置生效:nginx.ingress.kubernetes.io/ssl-redirect: "true" nginx.ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/proxy-set-header: "X-Forwarded-Proto https"kubectl delete pod sonarqube-sonarqube-0 -n sonarqube
4. 修正GitLab流水线的SonarQube配置
- 确保GitLab CI/CD变量中
SONAR_HOST_URL设置为https://sonarqube.mydomain.com(Ingress默认使用443端口,无需额外指定)。 - 若使用自签证书,需在流水线的
before_script中添加信任证书的步骤,示例:
其中before_script: - echo "$SONAR_CERT" > /usr/local/share/ca-certificates/sonar.crt - update-ca-certificatesSONAR_CERT是存储在GitLab项目/组变量中的证书内容(需提前导出sonar-tls中的证书)。
内容的提问来源于stack exchange,提问作者tba
相关产品推荐
相关产品推荐

