k8s部署SonarQube

1:环境

Kubernetes 1.24
SonarQube lts

2:简介

SonarQube 是一款用于代码质量管理的开源工具,它主要用于管理源代码的质量。 通过插件形式,可以支持众多计算机语言,比如 java, C#, go,C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等。sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具来检测你的代码,帮助你发现代码的漏洞,Bug,异味等信息。 Sonar 不仅提供了对 IDE 的支持,可以在 Eclipse和 IntelliJ IDEA 这些工具里联机查看结果;同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。
Sonar可以从以下七个维度检测代码质量,而作为开发人员至少需要处理前5种代码质量问题:
1:不遵循代码标准 sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写。
2:潜在的缺陷 sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检 测出潜在的缺陷。
3:糟糕的复杂度分布 文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员 难以理解它们, 且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试。
4:重复 显然程序中包含大量复制粘贴的代码是质量低下的,sonar可以展示 源码中重复严重的地方。
5:注释不足或者过多 没有注释将使代码可读性变差,特别是当不可避免地出现人员变动 时,程序的可读性将大幅下降 而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷。
6:缺乏单元测试 sonar可以很方便地统计并展示单元测试覆盖率。
7:糟糕的设计 通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系,可以检测自定义的架构规则 通过sonar可以管理第三方的jar包,可以利用LCOM4检测单个任务规则的应用情况, 检测耦合。

3:部署

存储环境:
本集群中kubernetes底层存储使用的是NFS,并且以NFS作为存储创建了storageclass便于动态创建pv
[root@kubernetes-master-1 sonarqube]# kubectl get sc
NAME                  PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
managed-nfs-storage   fuseim.pri/ifs   Delete          Immediate           false                  13h

# 部署PostgreSQL
在k8s集群部署PostgreSQL,需要将数据库的数据文件持久化,因此需要创建对应的pv,本次安装通过storageclass创建pv。由于postgre只需要集群内部连接,因此采用Headless service来创建数据库对应的svc,数据库的端口是5432,最终的yaml如下

[root@kubernetes-master-1 sonarqube]# cat pgsql.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: sonarqube
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-data
  namespace: sonarqube
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "managed-nfs-storage"
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-sonar
  namespace: sonarqube
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres-sonar
  template:
    metadata:
      labels:
        app: postgres-sonar
    spec:
      imagePullSecrets:
      - name: harbor
      containers:
      - name: postgres-sonar
        image: registry.kubernetes-devops.cn/library/postgres:14.2
        ports:
        - containerPort: 5432
        env:
        - name: POSTGRES_DB
          value: "sonarDB"
        - name: POSTGRES_USER
          value: "sonarUser"
        - name: POSTGRES_PASSWORD 
          value: "123456"
        volumeMounts:
          - name: data
            mountPath: /var/lib/postgresql/data
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: postgres-data
[root@kubernetes-master-1 sonarqube]# kubectl apply -f pgsql.yaml 
namespace/sonarqube unchanged
persistentvolumeclaim/postgres-data unchanged
deployment.apps/postgres-sonar unchanged
service/postgres-sonar created
[root@kubernetes-master-1 sonarqube]# kubectl get pod,svc,pvc -n sonarqube 
NAME                                  READY   STATUS    RESTARTS   AGE
pod/postgres-sonar-74cb68dfc9-mvtnb   1/1     Running   0          113s

NAME                     TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
service/postgres-sonar   ClusterIP   None         <none>        5432/TCP   9s

NAME                                  STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
persistentvolumeclaim/postgres-data   Bound    pvc-99ebecf8-3d6e-4929-802d-81bbeebce9e2   1Gi        RWX            managed-nfs-storage   113s

# 部署SonarQube
[root@kubernetes-master-1 sonarqube]# cat sonarqube.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sonarqube-data
  namespace: sonarqube
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "managed-nfs-storage"
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sonarqube
  namespace: sonarqube
  labels:
    app: sonarqube
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sonarqube
  template:
    metadata:
      labels:
        app: sonarqube
    spec:
      imagePullSecrets:
      - name: harbor
      initContainers:
      - name: init-sysctl
        image: registry.kubernetes-devops.cn/library/busybox:latest
        command: ["sysctl", "-w", "vm.max_map_count=262144"]
        securityContext:
          privileged: true
      containers:
      - name: sonarqube
        image: registry.kubernetes-devops.cn/library/sonarqube:lts
        ports:
        - containerPort: 9000
        env:
        - name: SONARQUBE_JDBC_USERNAME
          value: "sonarUser"
        - name: SONARQUBE_JDBC_PASSWORD
          value: "123456"
        - name: SONARQUBE_JDBC_URL
          value: "jdbc:postgresql://postgres-sonar:5432/sonarDB"
        livenessProbe:
          httpGet:
            path: /sessions/new
            port: 9000
          initialDelaySeconds: 60
          periodSeconds: 30
        readinessProbe:
          httpGet:
            path: /sessions/new
            port: 9000
          initialDelaySeconds: 60
          periodSeconds: 30
          failureThreshold: 6
        volumeMounts:
        - mountPath: /opt/sonarqube/conf
          name: data
        - mountPath: /opt/sonarqube/data
          name: data
        - mountPath: /opt/sonarqube/extensions
          name: data
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: sonarqube-data 
---
apiVersion: v1
kind: Service
metadata:
  name: sonarqube
  namespace: sonarqube
  labels:
    app: sonarqube
spec:
  type: NodePort
  ports:
  - name: sonarqube
    port: 9000
    targetPort: 9000
    protocol: TCP
  selector:
    app: sonarqube

[root@kubernetes-master-1 sonarqube]# kubectl apply -f sonarqube.yaml 
persistentvolumeclaim/sonarqube-data created
deployment.apps/sonarqube created
service/sonarqube created
[root@kubernetes-master-1 sonarqube]# kubectl get po,svc -n sonarqube 
NAME                                  READY   STATUS    RESTARTS        AGE
pod/postgres-sonar-74cb68dfc9-zx7fq   1/1     Running   1 (2m41s ago)   8m51s
pod/sonarqube-59b79db98d-7gjxf        1/1     Running   0               92s

NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/postgres-sonar   ClusterIP   None            <none>        5432/TCP         21m
service/sonarqube        NodePort    200.1.180.235   <none>        9000:32668/TCP   92s

1:实践中value: "jdbc:postgresql://postgres-sonar:5432/sonarDB"中的postgres-sonar直接写入集群IP也可以的
2:通过官方的sonar镜像部署,通过环境变量指定连接数据库的地址信息,同样通过storageclass来提供存储卷,通过NodePort方式暴露服务。
3:与常规部署不同的是,这里对sonar通过init container进行了初始化,执行修改了容器的vm.max_map_count大小。修改这里的原因可以参考官方文档(https://docs.sonarqube.org/latest/requirements/requirements/)

image

账号:admin
密码:admin

image

更新一下密码

image

posted @ 2022-05-08 02:02  Layzer  阅读(468)  评论(0编辑  收藏  举报