Kubernetes中部署代码质量检测工具SonarQube

转载自:https://blog.csdn.net/qq_32641153/article/details/94918308

环境说明:

一、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 地址和目录绑定。

这里使用的云上nfs,默认只有nfs的/目录,所以新的目录需要进行创建。

首先将云上的nfs挂载到服务器本地/mnt下,然后在进行创建需要的目录。
mkdir /mnt/{postgres,sonarqube}

1、创建 PV & PVC

postgres-storage.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: postgres
  labels:
    app: postgres
spec:
  accessModes:
    - ReadWriteMany
  capacity:
    storage: 50Gi
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  mountOptions:
    - hard
  nfs:
    server: 10.0.0.10
    path: /postgres
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: postgres
  labels:
    app: postgres
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  resources:
    requests:
      storage: 50Gi
  selector:
    matchLabels:
      app: postgres

AccessModes(访问模式)

AccessModes 是用来对 PV 进行访问模式的设置,用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:

  • ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载
  • ReadOnlyMany(ROX):只读权限,可以被多个节点挂载
  • ReadWriteMany(RWX):读写权限,可以被多个节点挂载
  • 下图是一些常用的 Volume 插件支持的访问模式:voluem-accessmodes

persistentVolumeReclaimPolicy(回收策略)

我这里指定的 PV 的回收策略为 Recycle,目前 PV 支持的策略有三种:

  • Retain(保留)- 保留数据,需要管理员手工清理数据
  • Recycle(回收)- 清除 PV 中的数据,效果相当于执行 rm -rf /thevoluem/*
  • Delete(删除)- 与 PV 相连的后端存储完成 volume 的删除操作,当然这常见于云服务商的存储服务,比如 ASW EBS。

不过需要注意的是,目前只有 NFS 和 HostPath 两种类型支持回收策略。当然一般来说还是设置为 Retain 这种策略保险一点。

状态

一个 PV 的生命周期中,可能会处于4中不同的阶段:

  • Available(可用):表示可用状态,还未被任何 PVC 绑定
  • Bound(已绑定):表示 PVC 已经被 PVC 绑定
  • Released(已释放):PVC 被删除,但是资源还未被集群重新声明
  • Failed(失败): 表示该 PV 的自动回收失败

 

2、创建 PostgreSQL

postgres.yaml

apiVersion: v1
kind: Service
metadata:
  name: postgres
  labels:
    app: postgres
spec:
  ports:
    - name: server
      port: 5432
      targetPort: 5432
      protocol: TCP
  selector:
    app: postgres
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
  labels:
    app: postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:11.4
        imagePullPolicy: "IfNotPresent"
        ports:
        - containerPort: 5432
        env:
        - name: TZ
          value: Asia/Shanghai
        - name: POSTGRES_DB             #PostgreSQL 数据库名称
          value: "sonarDB"
        - name: POSTGRES_USER           #PostgreSQL 用户名
          value: "sonarUser"
        - name: POSTGRES_PASSWORD       #PostgreSQL 密码
          value: "123456"
        resources:
          limits:
            cpu: 1000m
            memory: 2048Mi
          requests:
            cpu: 500m
            memory: 1024Mi
        volumeMounts:
          - mountPath: /var/lib/postgresql/data
            name: postgredb
      volumes:
        - name: postgredb
          persistentVolumeClaim:
            claimName: postgres         #引用上面创建的 PVC

创建 PostgreSQL

kubectl apply -f postgres.yaml

如果PostgreSQL日志打印时间与PostgreSQL数据库时间对不上,可更改配置文件的值
配置文件:postgresql.conf

 

四、部署 SonarQube

存储驱动为 NFS,需要提前在 NFS 下创建对应存储文件夹,然后设置 PV 与 NFS 地址和目录绑定。

1、创建 PV & PVC

这里用的是 NFS 存储,请提前在 NFS 共享目录中创建该目录

sonarqube-storage.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: sonarqube
  labels:
    app: sonarqube
spec:
  accessModes:
    - ReadWriteMany
  capacity:
    storage: 50Gi
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  nfs:
    server: 10.0.0.10
    path: /sonarqube
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: sonarqube
  labels:
    app: sonarqube
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs
  resources:
    requests:
      storage: 50Gi
  selector:
    matchLabels:
      app: sonarqube

创建 Sonarqube PV & PVC

kubectl apply -f sonarqube-storage.yaml

2、创建 Service & Deployment

sonarqube.yaml

apiVersion: v1
kind: Service
metadata:
  name: sonarqube
  labels:
    app: sonarqube
spec:
  type: NodePort            #指定 NodePort 端口
  ports:
    - name: sonarqube
      port: 9000
      targetPort: 9000
      nodePort: 30900       #指定 NodePort 端口
      protocol: TCP
  selector:
    app: sonarqube
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sonarqube
  labels:
    app: sonarqube
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sonarqube
  template:
    metadata:
      labels:
        app: sonarqube
    spec:
      initContainers:               #设置初始化镜像,执行 system 命令
      - name: init-sysctl
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ["sysctl", "-w", "vm.max_map_count=262144"]  #必须设置vm.max_map_count这个值调整内存权限,否则启动可能报错
        securityContext:
          privileged: true          #赋予权限能执行系统命令
      containers:
      - name: sonarqube
        image: "sonarqube:7.9-community"
        ports:
        - containerPort: 9000
        env:
        - name: TZ
          value: Asia/Shanghai
        - name: SONARQUBE_JDBC_USERNAME
          value: "sonarUser"        #引用 PostgreSQL 配置中设置的用户名
        - name: SONARQUBE_JDBC_PASSWORD
          value: "123456"           #引用 PostgreSQL 配置中设置的密码
        - name: SONARQUBE_JDBC_URL
          value: "jdbc:postgresql://postgres:5432/sonarDB"   #指定 PostgreSQL 在 Kubernetes 中的地址
        livenessProbe:
          httpGet:
            path: /sessions/new
            port: 9000
          initialDelaySeconds: 60
          periodSeconds: 30
        readinessProbe:
          httpGet:
            path: /sessions/new
            port: 9000
          initialDelaySeconds: 60
          periodSeconds: 30
          failureThreshold: 6
        resources:
          limits:
            cpu: 2000m
            memory: 2048Mi
          requests:
            cpu: 1000m
            memory: 1024Mi
        volumeMounts:
        - mountPath: /opt/sonarqube/conf
          name: sonarqube
          subPath: conf
        - mountPath: /opt/sonarqube/data
          name: sonarqube
          subPath: data
        - mountPath: /opt/sonarqube/extensions
          name: sonarqube
          subPath: extensions
      volumes:
      - name: sonarqube
        persistentVolumeClaim:
          claimName: sonarqube    #绑定上面创建的 PVC

创建 SonarQube

kubectl apply -f sonarqube.yaml

五、配置 SonarQube

1、登录 SonarQube

程序启动完成后,进入 SonarQube 页面,上面 SonarQube Service 以 NodePort 方式暴露 SonarQube 到集群外,并且本人 Kubernetes 集群地址为”192.168.2.11”,所以这里输入地址 http://192.168.2.11:30900 访问 SonarQube UI 界面。

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 数据库

 

(2)、 vm.max_map_count 错误

这个错误主要是镜像系统中设置的内存权限过小,需要初始化容器时候执行”sysctl -w vm.max_map_count=262144”命令,可以按下面方法解决:

(3)、exited with exit value [es] : 1错误

 

(4)、exited with exit value [es] : 1错误

发现这个错误主要原因是,没有权限操作nfs挂载的sonarqube目录,授权777即可

chmod -R 777 /mnt/sonarqube

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值