系統城裝機大師 - 唯一官網:www.farandoo.com!

當前位置:首頁 > 系統教程 > Linux教程 > 詳細頁面

在 k8S 中搭建 SonarQube 7.4.9 版本(使用 PostgreSQL 數據庫)

時間:2020-10-29來源:www.farandoo.com作者:電腦系統城

搭建 SonarQube 和 PostgreSQL 服務#

本文搭建的 SonarQube 版本是 7.4.9-community,由于在官方文檔中聲明 7.9 版本之后就不再支持使用 MySQL 數據庫。所以此次搭建使用的數據庫是 PostgreSQL 11.4 版本。

一、部署 PostgreSQL 服務#

1. 創建命名空間

將 PostgreSQL 和 SonarQube 放在同一個命名空間 ns-sonar 中,創建命名空間的 yaml 文件如下:


 
Copy
  ---
  apiVersion: v1
  kind: Namespace
  metadata:
  name: ns-sonar
  labels:
  name: ns-sonar

2. 創建 PostgreSQL 使用的 PV 和 PVC

為了實現 PostgreSQL 數據的持久化存儲,需要將數據存放在本地存儲中。首先在宿主機的 /opt/ops_ceph_data 目錄下創建如下目錄:


 
Copy
mkdir -p /opt/ops_ceph_data/sonarqube/{PostgreSQL_data,sonar}

在我的機器環境中,/opt/ops_ceph_data 是掛載的 cephfs 文件系統,所以在任意節點上創建目錄后,其他節點上都會存在。這也保證了 PostgreSQL 容器可以在任意節點上進行漂移。

同時由于我是將 cephfs 直接掛載到物理機上,所以在下面創建 pv 的時候,指定的存儲類型是 local。

如果希望學習如何搭建 Ceph 集群,可以參考我的另一篇博文:CentOS 7 搭建 Ceph 集群(nautilus 版本)

創建 PV 和 PVC 的 yaml 文件內容如下:


 
Copy
  ---
  apiVersion: v1
  kind: PersistentVolume
  metadata:
  name: postgresql-pv
  namespace: ns-sonar
  spec:
  accessModes:
  - ReadWriteOnce
  capacity:
  storage: 5Gi
  local:
  path: /opt/ops_ceph_data/sonarqube/PostgreSQL_data
  nodeAffinity:
  required:
  nodeSelectorTerms:
  - matchExpressions:
  - key: sonar-node
  operator: In
  values:
  - "true"
  persistentVolumeReclaimPolicy: Retain
  ---
  kind: PersistentVolumeClaim
  apiVersion: v1
  metadata:
  name: postgresql-pvc
  namespace: ns-sonar
  spec:
  accessModes:
  - ReadWriteOnce
  resources:
  requests:
  storage: 5Gi

3. 配置 labels

由于上面配置的 PV 存儲類型是 local,所以需要在允許運行 PostgreSQL 容器的 Node 上設置 labels,labels 為 sonar-node=true,這里我是將所有的 Node 節點上都添加了這個 label,命令如下:


 
Copy
  for i in 1 2 3 4 5
  do
  kubectl label nodes k8s-node${i} sonar-node=true
  done

注意,PV 中配置的 matchExpressions 一定要與 labels 一致,不然會無法匹配。

4. 創建 Service

接下來需要配置用于映射 PostgreSQL 容器端口的 Service 文件,這里我使用 NodePort 類型,yaml 文件內容如下:


 
Copy
  ---
  apiVersion: v1
  kind: Service
  metadata:
  name: postgresql-service
  namespace: ns-sonar
  labels:
  app: postgresql
  spec:
  type: NodePort
  ports:
  - port: 5432
  targetPort: 5432
  nodePort: 30543
  protocol: TCP
  selector:
  app: postgresql

5. 創建 PostgreSQL 的 Pod

因為我搭建的環境中,PostgreSQL 使用的單點模式,所以直接使用 Deployment 類型來創建 Pod,yaml 文件內容如下:


 
Copy
  ---
  apiVersion: apps/v1
  kind: Deployment
  metadata:
  name: postgresql
  namespace: ns-sonar
  labels:
  app: postgresql
  spec:
  replicas: 1
  selector:
  matchLabels:
  app: postgresql
  template:
  metadata:
  labels:
  app: postgresql
  spec:
  containers:
  - name: postgresql-for-sonar
  image: postgres:11.4
  imagePullPolicy: "IfNotPresent"
  ports:
  - containerPort: 5432
  env: # 這里設置 PostgreSQL 啟動時候所需要的環境變量
  - name: POSTGRES_DB # 定義要創建的數據庫名稱
  value: sonarDB
  - name: POSTGRES_USER # 定義要創建訪問數據庫的用戶
  value: sonarUser
  - name: POSTGRES_PASSWORD # 定義數據庫的密碼
  value: sonar_admin
  resources:
  limits:
  cpu: 1000m
  memory: 2048Mi
  requests:
  cpu: 500m
  memory: 1024Mi
  volumeMounts:
  - mountPath: /var/lib/postgresql/data # 這個目錄是 PostgreSQL 容器內默認的數據存儲路徑
  name: postgredb
  volumes:
  - name: postgredb
  persistentVolumeClaim:
  claimName: postgresql-pvc # 將上面創建的 PVC 掛載到 PostgreSQL 的數據目錄下

在環境變量設置的部分,我一開始使用的是引用 Secret 的方式,但是在容器啟動后沒有正確創建用戶和密碼。所以還是使用了直接指定 value 的方式。具體為什么 Secret 沒有生效現在還不清楚,后續查出原因后再補充。

6. 驗證數據庫連接

使用容器搭建 PostgreSQL 服務,默認會在容器內監聽 0.0.0.0 地址,所以像傳統方式部署那樣去手動修改監聽地址。

在其他機器中驗證連接 PostgreSQL,IP 地址為任意 Node 節點 IP。用戶名密碼和數據庫名稱參考上面的 yaml 文件。測試是否可以正常連接即可。

二、部署 SonarQube 服務#

1. 創建 SonarQube 使用的 PV 和 PVC

用于 SonarQube 的持久化存儲目錄已經在前面創建好了,下面直接編寫 yaml 文件,內容如下:


 
Copy
  ---
  apiVersion: v1
  kind: PersistentVolume
  metadata:
  name: sonar-pv
  namespace: ns-sonar
  spec:
  accessModes:
  - ReadWriteOnce
  capacity:
  storage: 20Gi
  local:
  path: /opt/ops_ceph_data/sonarqube/sonar_data
  nodeAffinity:
  required:
  nodeSelectorTerms:
  - matchExpressions:
  - key: sonar-node
  operator: In
  values:
  - "true"
  persistentVolumeReclaimPolicy: Retain
  ---
  kind: PersistentVolumeClaim
  apiVersion: v1
  metadata:
  name: sonar-pvc
  namespace: ns-sonar
  spec:
  accessModes:
  - ReadWriteOnce
  resources:
  requests:
  storage: 20Gi

需要注意的是,PV 中匹配的 labels 已經在前面創建好了,所以此處不需要重復設置 labels。

另外 SonarQube 容器運行的時候,不是以 root 用戶運行的,所以需要確保掛載的目錄要允許其他用戶讀寫,否則容器啟動會失敗。


 
Copy
chmod -R 777 /opt/ops_ceph_data/sonarqube/sonar_data

2. 創建 Service

使用 NodePort 類型將 SonarQube 端口映射出來,yaml 文件內容如下:


 
Copy
  ---
  apiVersion: v1
  kind: Service
  metadata:
  name: sonarqube-service
  labels:
  app: sonarqube-service
  spec:
  type: NodePort
  ports:
  - port: 9000
  targetPort: 9000
  nodePort: 30900
  protocol: TCP
  selector:
  app: sonarqube

3. 創建 SonarQube 的 Pod

SonarQube 的 Pod 使用 Deployment 來創建,yaml 文件內容如下:


 
Copy
  ---
  apiVersion: apps/v1
  kind: Deployment
  metadata:
  name: sonarqube
  namespace: ns-sonar
  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 # 設置可以以 root 權限執行命令
  containers:
  - name: sonarqube
  image: sonarqube:7.9.4-community
  ports:
  - containerPort: 9000
  env:
  - name: SONARQUBE_JDBC_USERNAME # 設置 SonarQube 連接數據庫使用的用戶名
  value: sonarUser
  - name: SONARQUBE_JDBC_PASSWORD # 設置 SonarQube 連接數據庫使用的密碼
  value: sonar_admin
  - name: SONARQUBE_JDBC_URL # 設置 SonarQube 連接數據庫使用的地址
  value: "jdbc:postgresql://10.16.12.206:30543/sonarDB" # 這里可以指定 Node 節點的 IP 地址和 PostgreSQL 映射出來的端口
  livenessProbe: # 設置容器存活檢查策略,如果失敗將殺死容器,然后根據 Pod 的 restartPolicy 來決定是否進行重啟操作
  httpGet:
  path: /sessions/new
  port: 9000
  initialDelaySeconds: 60 # 設置在容器啟動多長時間后開始探針檢測,此處設置為 60s
  periodSeconds: 30 # 設置探針檢查的頻率,此處設置為每 30s 檢查一次
  readinessProbe: # 設置容器的就緒檢查策略,查看容器是否準備好接受 HTTP 請求
  httpGet:
  path: /sessions/new
  port: 9000
  initialDelaySeconds: 60 # 設置在容器啟動多長時間后開始探針檢測,此處設置為 60s
  periodSeconds: 30 # 設置探針檢查的頻率,此處設置為每 30s 檢查一次
  failureThreshold: 6 # 在檢查失敗的情況下,重復檢查的次數,此處設置為 6
  resources:
  limits:
  cpu: 2000m
  memory: 2048Mi
  requests:
  cpu: 1000m
  memory: 1024Mi
  volumeMounts:
  - mountPath: /opt/sonarqube/conf
  name: sonarqube
  subPath: conf # 使用 subPath 在宿主機的掛載目錄上設置一個子目錄,用于存放上面指定目錄的數據
  - mountPath: /opt/sonarqube/data
  name: sonarqube
  subPath: data
  - mountPath: /opt/sonarqube/extensions
  name: sonarqube
  subPath: extensions
  volumes:
  - name: sonarqube
  persistentVolumeClaim:
  claimName: sonar-pvc #綁定上面創建的 PVC

對于上面的 yaml 文件有些配置需要進行如下說明。

3.1 initContainers

initContainers 就是初始化容器,也就是在主容器啟動之前,首先啟動初始化容器。如果有多個初始化容器,會按照定義的順序依次啟動。只有在初始化容器啟動完成后,主容器才會啟動。

使用初始化容器有如下幾個作用:

  1. 為主容器初始化環境:例如本文中的例子,由于 SonarQube 在啟動服務的時候,要確保已經設置了 vm.max_map_count 這個值,但是由于 SonarQube 鏡像本身不能執行這個命令,所以可以使用一個初始化容器來執行該命令(同一個Pod下的容器是共享文件系統的),并且保證該命令已經執行完成的情況下,主容器才會啟動?;蛘吡硪环N情況是主容器啟動的時候需要安裝一些依賴包,為了避免安裝依賴包時間過長,影響健康檢查策略,可以選擇將這個安裝的任務交給初始化容器去執行。
  2. 等待其他服務 Ready:例如一個 web 服務的 Pod 啟動時,需要確保另一個數據庫服務的 Pod 已經啟動了并且可以接受連接(不然 web 服務可能會報錯或者啟動失?。?,所以可以在 web 服務的 Pod 中部署一個初始化容器,去檢查數據庫服務是否已經準備好,直到數據庫可以開始連接,初始化容器才會推出。
  3. 初始化集群配置:例如可以使用初始化容器檢測當前業務集群中已經存在的節點信息,并為主容器準備好集群的配置信息,這樣集群啟動時就可以根據這個配置信息加入到集群中。

需要注意的是,initContainers 是以 sideCar 模式運行在 Pod 中的。

3.2 健康檢查策略

關于健康檢查策略,上面的 yaml 文件中已經給出了一些注釋。其他的配置項可以參考官網文檔:配置存活探針和就緒探針

3.3 subPath 配置

上面的 yaml 文件中在存儲掛載的部分使用了 subPath 配置,這是因為 SonarQube 中一共有三個需要掛載的目錄:

  • /opt/sonarqube/conf
  • /opt/sonarqube/data
  • /opt/sonarqube/extensions

而宿主機上的存儲目錄只提供了一個 /opt/ops_ceph_data/sonarqube/sonar_data,默認情況下,以上三個目錄的數據都會存儲在宿主機這一個目錄下,這樣就會造成數據混亂,沒有辦法區分某個數據文件或目錄具體是哪個父目錄下的??梢允褂?subPath 配置解決這個問題,這個配置的功能就是在宿主機的掛載目錄下創建一個子目錄來存放對應目錄的數據。

例如上面的 subPath 配置項分別創建了三個子目錄:conf、data、extensions,那么在宿主機的掛載目錄下顯示的就是如下形式:


 
Copy
  [@k8s-master1 ~]# ll /opt/ops_ceph_data/sonarqube/sonar_data/
  總用量 0
  drwxrwxrwx 1 root root 0 10月 29 11:41 conf
  drwxrwxrwx 1 root root 2 10月 29 15:57 data
  drwxrwxrwx 1 root root 2 10月 29 16:01 extensions

這三個子目錄的名稱可以隨意指定,上面的 yaml 文件中 subPath 指定的子目錄名稱與容器中的目錄名稱一致是為了更方便的區分。如果將 subPath 的配置分別改為:sonar_conf、sonar_data、sonar_extensions,那么在宿主機掛載目錄下顯示的就會是如下形式:


 
Copy
  [@k8s-master1 ~]# ll /opt/ops_ceph_data/sonarqube/sonar_data/
  總用量 0
  drwxrwxrwx 1 root root 0 10月 29 11:41 sonar_conf
  drwxrwxrwx 1 root root 2 10月 29 15:57 sonar_data
  drwxrwxrwx 1 root root 2 10月 29 16:01 sonar_extensions

4. 訪問 SonarQube 并安裝插件

SonarQube 部署完成后,可以通過任意 Node 節點的 IP 地址加上映射的端口訪問。

默認的登錄用戶名和密碼均為 admin。登錄完成后,首先點擊 Administration --> Marketplace ,在 Plugin 部分查找 chinese 插件和 Codehawk Java 進行安裝。chinese 插件用于漢化界面,安裝完成后需要重啟服務(在頁面上方會有提示)。

分享到:

相關信息

系統教程欄目

欄目熱門教程

人氣教程排行

站長推薦

熱門系統下載

jlzzjlzz亚洲乱熟在线播放