轉載自:https://blog.csdn.net/qq_32641153/article/details/94918308
環境說明:
- Kubernetes 版本:1.14.3
- SonarQube 版本:7.9
- 數據持久化配置: NFS
- 示例 Github 地址:https://github.com/my-dlq/blog-example/tree/master/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 地址和目錄綁定。
這裏使用的雲上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 插件支持的訪問模式:
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