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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章