Kubernetes 中部署代码质量检测工具 SonarQube
文章目录
!版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。
环境说明:
- Kubernetes 版本:1.14.0
- SonarQube 版本:7.9
- 数据持久化配置: NFS
- 示例 Github 地址:https://github.com/my-dlq/blog-example/tree/master/kubernetes/sonarqube-deploy
一、SonarQube 介绍
简介
SonarQube 是一个用于代码质量管理的开源平台,用于管理源代码的质量。同时 SonarQube 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 SonarQube。此外 SonarQube 的插件还可以对 Java 以外的其他编程语言提供支持,对国际化以及报告文档化也有良好的支持。
特性
- 多语言的平台: 支持超过20种编程语言,包括Java、Python、C#、C/C++、JavaScript等常用语言。
- 自定义规则: 用户可根据不同项目自定义Quality Profile以及Quality Gates。
- 丰富的插件: SonarQube 拥有丰富的插件,从而拥有强大的可扩展性。
- 持续集成: 通过对某项目的持续扫描,可以对该项目的代码质量做长期的把控,并且预防新增代码中的不严谨和冗余。
- 质量门: 在扫描代码后可以通过对“质量门”的比对判定此次“构建”的结果是否通过,质量门可以由用户定义,由多维度判定是否通过。
二、部署过程描述
这里我们将 SonarQube 部署到 Kubernetes 中需要提前知道的是 SonarQube 需要依赖数据库存储数据,且 SonarQube7.9 及其以后版本将不再支持 Mysql,所以这里推荐设置 PostgreSQL 作为 SonarQube 的存储库,下面将记录在 Kubernetes 中部署 PostgreSQL 和 SonarQube 过程。
三、部署 PostgreSQL
存储驱动为 NFS,需要提前在 NFS 目录中创建对应存储文件夹并设置文件夹其它用户拥有一定权限,然后设置 PV 与 NFS 地址和目录绑定。
1、创建 PV & PVC
postgres-storage.yaml
1apiVersion: v1
2kind: PersistentVolume
3metadata:
4 name: postgres
5 labels:
6 app: postgres
7spec:
8 accessModes:
9 - ReadWriteOnce
10 capacity:
11 storage: 5Gi
12 mountOptions: #NFS挂在选项
13 - hard
14 - nfsvers=4.1 #NFS Server版本
15 nfs: #NFS设置
16 server: 192.168.2.11
17 path: /nfs/data/postgres
18---
19kind: PersistentVolumeClaim
20apiVersion: v1
21metadata:
22 name: postgres
23 labels:
24 app: postgres
25spec:
26 accessModes:
27 - ReadWriteOnce
28 resources:
29 requests:
30 storage: 5Gi #设置大小为5G
31 selector:
32 matchLabels:
33 app: postgres
创建 PostgreSQL PV & PVC
- -n:指定启动的 Namespace,这个值替换为自己集群的 Namespace
1$ kubectl apply -f postgres-storage.yaml -n mydlqcloud
2、创建 PostgreSQL
postgres.yaml
1apiVersion: v1
2kind: Service
3metadata:
4 name: postgres
5 labels:
6 app: postgres
7spec:
8 type: NodePort #指定为 NodePort 方式暴露出口
9 ports:
10 - name: server
11 port: 5432
12 targetPort: 5432
13 nodePort: 30543 #指定 Nodeport 端口
14 protocol: TCP
15 selector:
16 app: postgres
17---
18apiVersion: apps/v1
19kind: Deployment
20metadata:
21 name: postgres
22 labels:
23 app: postgres
24spec:
25 replicas: 1
26 selector:
27 matchLabels:
28 app: postgres
29 template:
30 metadata:
31 labels:
32 app: postgres
33 spec:
34 containers:
35 - name: postgres
36 image: postgres:11.4
37 imagePullPolicy: "IfNotPresent"
38 ports:
39 - containerPort: 5432
40 env:
41 - name: POSTGRES_DB #PostgreSQL 数据库名称
42 value: "sonarDB"
43 - name: POSTGRES_USER #PostgreSQL 用户名
44 value: "sonarUser"
45 - name: POSTGRES_PASSWORD #PostgreSQL 密码
46 value: "123456"
47 resources:
48 limits:
49 cpu: 1000m
50 memory: 2048Mi
51 requests:
52 cpu: 500m
53 memory: 1024Mi
54 volumeMounts:
55 - mountPath: /var/lib/postgresql/data
56 name: postgredb
57 volumes:
58 - name: postgredb
59 persistentVolumeClaim:
60 claimName: postgres #引用上面创建的 PVC
创建 PostgreSQL
- -n:指定启动的 Namespace,这个值替换为自己集群的 Namespace
1$ kubectl apply -f postgres.yaml -n mydlqcloud
四、部署 SonarQube
存储驱动为 NFS,需要提前在 NFS 下创建对应存储文件夹,然后设置 PV 与 NFS 地址和目录绑定。
1、创建 PV & PVC
注意:这里用的是 NFS 存储,请提前在 NFS 共享目录中创建该目录 SonarQube 为了安全是不允许使用 Root 用户启动,并且 Dockerfile 中设置了 sonarqube(999) 用户与 sonarqube(999) 用户组,所以为了确保成功启动,请提前设置文件夹权限,否则启动将提升无法加载 ES 或者 Log 等文件。
sonarqube-storage.yaml
1apiVersion: v1
2kind: PersistentVolume
3metadata:
4 name: sonarqube
5 labels:
6 app: sonarqube
7spec:
8 accessModes:
9 - ReadWriteOnce
10 capacity:
11 storage: 5Gi
12 mountOptions: #NFS挂在选项
13 - hard
14 - nfsvers=4.1 #NFS Server版本
15 nfs: #NFS设置
16 server: 192.168.2.11
17 path: /nfs/data/sonarqube
18---
19kind: PersistentVolumeClaim
20apiVersion: v1
21metadata:
22 name: sonarqube
23 labels:
24 app: sonarqube
25spec:
26 accessModes:
27 - ReadWriteOnce
28 resources:
29 requests:
30 storage: 5Gi #设置大小为5G
31 selector:
32 matchLabels:
33 app: sonarqube
创建 Sonarqube PV & PVC
- -n:指定启动的 Namespace,这个值替换为自己集群的 Namespace
1$ kubectl apply -f sonarqube-storage.yaml -n mydlqcloud
2、创建 Service & Deployment
sonarqube.yaml
1apiVersion: v1
2kind: Service
3metadata:
4 name: sonarqube
5 labels:
6 app: sonarqube
7spec:
8 type: NodePort #指定 NodePort 端口
9 ports:
10 - name: sonarqube
11 port: 9000
12 targetPort: 9000
13 nodePort: 30900 #指定 NodePort 端口
14 protocol: TCP
15 selector:
16 app: sonarqube
17---
18apiVersion: apps/v1
19kind: Deployment
20metadata:
21 name: sonarqube
22 labels:
23 app: sonarqube
24spec:
25 replicas: 1
26 selector:
27 matchLabels:
28 app: sonarqube
29 template:
30 metadata:
31 labels:
32 app: sonarqube
33 spec:
34 initContainers: #设置初始化镜像,执行 system 命令
35 - name: init-sysctl
36 image: busybox
37 imagePullPolicy: IfNotPresent
38 command: ["sysctl", "-w", "vm.max_map_count=262144"] #必须设置vm.max_map_count这个值调整内存权限,否则启动可能报错
39 securityContext:
40 privileged: true #赋予权限能执行系统命令
41 containers:
42 - name: sonarqube
43 image: "sonarqube:7.9-community"
44 ports:
45 - containerPort: 9000
46 env:
47 - name: SONARQUBE_JDBC_USERNAME
48 value: "sonarUser" #引用 PostgreSQL 配置中设置的用户名
49 - name: SONARQUBE_JDBC_PASSWORD
50 value: "123456" #引用 PostgreSQL 配置中设置的密码
51 - name: SONARQUBE_JDBC_URL
52 value: "jdbc:postgresql://postgres:5432/sonarDB" #指定 PostgreSQL 在 Kubernetes 中的地址
53 livenessProbe:
54 httpGet:
55 path: /sessions/new
56 port: 9000
57 initialDelaySeconds: 60
58 periodSeconds: 30
59 readinessProbe:
60 httpGet:
61 path: /sessions/new
62 port: 9000
63 initialDelaySeconds: 60
64 periodSeconds: 30
65 failureThreshold: 6
66 resources:
67 limits:
68 cpu: 2000m
69 memory: 2048Mi
70 requests:
71 cpu: 1000m
72 memory: 1024Mi
73 volumeMounts:
74 - mountPath: /opt/sonarqube/conf
75 name: sonarqube
76 subPath: conf
77 - mountPath: /opt/sonarqube/data
78 name: sonarqube
79 subPath: data
80 - mountPath: /opt/sonarqube/extensions
81 name: sonarqube
82 subPath: extensions
83 volumes:
84 - name: sonarqube
85 persistentVolumeClaim:
86 claimName: sonarqube #绑定上面创建的 PVC
创建 SonarQube
- -n:指定启动的 Namespace,这个值替换为自己集群的 Namespace
1$ kubectl apply -f sonarqube.yaml -n mydlqcloud
注意:如果项目启动失败,或者显示无法执行 initContainers 操作,那么可能是没有 RBAC 权限导致,请创建一个有一定权限的 ServiceAccount 后,再在 SonarQube 部署文件中指定这个 ServiceAccount 即可。
五、配置 SonarQube
1、登录 SonarQube
程序启动完成后,进入 SonarQube 页面,上面 SonarQube Service 以 NodePort 方式暴露 SonarQube 到集群外,并且本人 Kubernetes 集群地址为"192.168.2.11",所以这里输入地址 http://192.168.2.11:30900 访问 SonarQube UI 界面。
输入默认用户名"admin",密码与用户名一致,进而登录到 SonarQube 控制台
2、SonarQube 安装插件
我们按照 SonarQube 后需要安装许多插件来完善这个工具,这里我们安装 Chinese 和 SonarJava 俩个插件,其中第一个插件为界面提供汉化,第二个插件是 Java 语言分析插件。当然,也可以选择你自己想安装的插件进行安装。
待安装插件列表:
- Chinese
- SonarJava
(1)、安装 Chinese:
打开 Administration->Marktplace ,然后搜索栏输入 "Chinese" ,等待一段时间(国内访问国外地址比较慢)后弹出相关插件列表,选择 Chinese Pack 进行安装。
安装完成后会弹出重启 SonarQube 服务的窗口,点击一下进行容器,再次进入后可以看到界面已经汉化
(2)、安装 SonarJava:
安装过程跟上面类似,搜索 "Java" 选择 SonarJava 插件安装
到此完成在 Kubernetes 部署 SonarQube 这个过程。
六、安装过程中遇到的问题
(1)、对 Mysql 不再支持
在 SonarQube7.9 及以后版本将不再支持 Mysql,请使用 Postgresql 数据库
12019.07.04 04:40:50 INFO web[][o.s.p.ProcessEntryPoint] Starting web
22019.07.04 04:40:50 INFO web[][o.a.t.u.n.NioSelectorPool] Using a shared selector for servlet write/read
32019.07.04 04:40:51 INFO web[][o.e.p.PluginsService] no modules loaded
42019.07.04 04:40:51 INFO web[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.join.ParentJoinPlugin]
52019.07.04 04:40:51 INFO web[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.percolator.PercolatorPlugin]
62019.07.04 04:40:51 INFO web[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.transport.Netty4Plugin]
72019.07.04 04:40:53 INFO web[][o.s.s.e.EsClientProvider] Connected to local Elasticsearch: [127.0.0.1:9001]
82019.07.04 04:40:53 INFO web[][o.s.s.p.LogServerVersion] SonarQube Server / 7.9.0.26994 / 687d8007c0f62bfaaa44a890d93397de0a588119
92019.07.04 04:40:53 ERROR web[][o.s.s.p.Platform] Web server startup failed:
10#############################################################################################################
11# End of Life of MySQL Support : SonarQube 7.9 and future versions do not support MySQL. #
12# Please migrate to a supported database. Get more details at #
13# https://community.sonarsource.com/t/end-of-life-of-mysql-support #
14# and https://github.com/SonarSource/mysql-migrator #
15#############################################################################################################
(2)、 vm.max_map_count 错误
12019.07.04 04:39:13 INFO app[][o.e.p.PluginsService] loaded plugin [org.elasticsearch.transport.Netty4Plugin]
2ERROR: [1] bootstrap checks failed
3[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
42019.07.04 04:39:19 WARN app[][o.s.a.p.AbstractManagedProcess] Process exited with exit value [es]: 78
这个错误主要是镜像系统中设置的内存权限过小,需要初始化容器时候执行"sysctl -w vm.max_map_count=262144"命令,可以按下面方法解决:
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: sonarqube-server
5 labels:
6 app: sonarqube-server
7spec:
8 replicas: 1
9 selector:
10 matchLabels:
11 app: sonarqube-server
12 template:
13 metadata:
14 labels:
15 app: sonarqube-server
16 spec:
17 initContainers: #设置初始化镜像,执行 system 命令
18 - name: init-sysctl
19 image: busybox
20 imagePullPolicy: IfNotPresent
21 command: ["sysctl", "-w", "vm.max_map_count=262144"]
22 securityContext:
23 privileged: true
24 ......
(3)、exited with exit value [es] 错误
12019.07.04 02:40:53 WARN app[][o.s.a.p.AbstractProcessMonitor] Process exited with exit value [es]: 1
发现这个错误主要原因是,Sonarqube 要求以非 root 用户启动,如果设置容器安全"runAsUser: 0"等参数,以 root 用户运行就会抛出以下错误,去掉 root 用户权限,设置镜像默认用户启动即可。
!版权声明:本博客内容均为原创,每篇博文作为知识积累,写博不易,转载请注明出处。