以下是在Kubernetes集群中部署SonarQube服务的分步指南,包含持久化存储、数据库配置和高可用性建议:
1. 前置条件
- 已部署Kubernetes集群(版本≥1.19)
- 安装
kubectl
和helm
工具 - 配置StorageClass(如NFS、Ceph、EBS等)
2. 部署PostgreSQL数据库
创建PersistentVolumeClaim(PVC)
# postgres-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: postgres-pvc
spec:storageClassName: "standard" # 替换为实际StorageClassaccessModes:- ReadWriteOnceresources:requests:storage: 10Gi
部署PostgreSQL
# postgres-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: postgres
spec:replicas: 1selector:matchLabels:app: postgrestemplate:metadata:labels:app: postgresspec:containers:- name: postgresimage: postgres:13env:- name: POSTGRES_USERvalue: sonar- name: POSTGRES_PASSWORDvalue: sonar-secret- name: POSTGRES_DBvalue: sonarqubeports:- containerPort: 5432volumeMounts:- name: postgres-datamountPath: /var/lib/postgresql/datavolumes:- name: postgres-datapersistentVolumeClaim:claimName: postgres-pvc
---
apiVersion: v1
kind: Service
metadata:name: postgres
spec:selector:app: postgresports:- protocol: TCPport: 5432targetPort: 5432
执行命令:
kubectl apply -f postgres-pvc.yaml
kubectl apply -f postgres-deployment.yaml
3. 部署SonarQube
创建SonarQube PVC
# sonarqube-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: sonarqube-pvc
spec:storageClassName: "standard"accessModes:- ReadWriteOnceresources:requests:storage: 20Gi
部署SonarQube
# sonarqube-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: sonarqube
spec:replicas: 1selector:matchLabels:app: sonarqubestrategy:type: Recreate # 确保单副本时数据一致性template:metadata:labels:app: sonarqubespec:containers:- name: sonarqubeimage: sonarqube:9.9.1-communityenv:- name: SONAR_JDBC_URLvalue: jdbc:postgresql://postgres:5432/sonarqube- name: SONAR_JDBC_USERNAMEvalue: sonar- name: SONAR_JDBC_PASSWORDvalue: sonar-secretports:- containerPort: 9000volumeMounts:- name: sonarqube-datamountPath: /opt/sonarqube/data- name: sonarqube-extensionsmountPath: /opt/sonarqube/extensionsvolumes:- name: sonarqube-datapersistentVolumeClaim:claimName: sonarqube-pvc- name: sonarqube-extensionsemptyDir: {}
---
apiVersion: v1
kind: Service
metadata:name: sonarqube
spec:type: NodePort # 生产环境建议使用Ingressselector:app: sonarqubeports:- protocol: TCPport: 9000targetPort: 9000nodePort: 31000
执行命令:
kubectl apply -f sonarqube-pvc.yaml
kubectl apply -f sonarqube-deployment.yaml
4. 验证部署
# 检查Pod状态
kubectl get pods -l app=sonarqube# 查看日志
kubectl logs -f deployment/sonarqube# 获取访问地址
kubectl get svc sonarqube
访问地址:http://<NodeIP>:31000
默认账号:admin/admin
(首次登录需修改)
5. 进阶配置
(a) 使用Ingress暴露服务
# sonarqube-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: sonarqubeannotations:nginx.ingress.kubernetes.io/proxy-body-size: "100m"
spec:rules:- host: sonarqube.demonlg.cnhttp:paths:- path: /pathType: Prefixbackend:service:name: sonarqubeport:number: 9000
(b) 高可用配置(企业版)
# 需要SonarQube企业版支持集群模式
spec:replicas: 3strategy:type: RollingUpdatecontainers:- name: sonarqubeenv:- name: SONAR_CLUSTER_ENABLEDvalue: "true"- name: SONAR_CLUSTER_SEARCH_HOSTSvalue: "sonarqube-0.sonarqube-headless:9000,sonarqube-1.sonarqube-headless:9000"
© 资源限制
resources:requests:memory: "2Gi"cpu: "1000m"limits:memory: "4Gi"cpu: "2000m"
6. 备份与维护
数据库备份
# 手动备份PostgreSQL数据
kubectl exec postgres-pod -- pg_dump -U sonar sonarqube > sonarqube-backup.sql
升级SonarQube
- 停止当前Deployment
- 备份数据库和存储卷
- 修改镜像版本(如
sonarqube:10.0.0-community
) - 逐步滚动更新
7. 故障排查
- Pod启动失败:
- 检查数据库连接配置(
SONAR_JDBC_URL
) - 确认PVC是否正确挂载(
kubectl describe pod sonarqube-pod
)
- 检查数据库连接配置(
- 性能问题:
- 增加JVM堆内存:
-Dsonar.ce.javaOpts=-Xmx4g -Dsonar.web.javaOpts=-Xmx4g
- 增加JVM堆内存:
通过以上步骤,您可以在Kubernetes集群中部署一个生产可用的SonarQube服务,实现代码质量的持续分析。