主頁 > 作業系統 > 在 k8S 中搭建 SonarQube 7.4.9 版本(使用 PostgreSQL 資料庫)

在 k8S 中搭建 SonarQube 7.4.9 版本(使用 PostgreSQL 資料庫)

2020-10-30 22:47:35 作業系統

搭建 SonarQube 和 PostgreSQL 服務

本文搭建的 SonarQube 版本是 7.4.9-community,由于在官方檔案中宣告 7.9 版本之后就不再支持使用 MySQL 資料庫,所以此次搭建使用的資料庫是 PostgreSQL 11.4 版本,

一、部署 PostgreSQL 服務

1. 創建命名空間

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

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

2. 創建 PostgreSQL 使用的 PV 和 PVC

為了實作 PostgreSQL 資料的持久化存盤,需要將資料存放在本地存盤中,首先在宿主機的 /opt/ops_ceph_data 目錄下創建如下目錄:

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 檔案內容如下:

---
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,命令如下:

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 檔案內容如下:

---
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 檔案內容如下:

---
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 檔案,內容如下:

---
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 用戶運行的,所以需要確保掛載的目錄要允許其他用戶讀寫,否則容器啟動會失敗,

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

2. 創建 Service

使用 NodePort 型別將 SonarQube 埠映射出來,yaml 檔案內容如下:

---
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 檔案內容如下:

---
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 鏡像本身不能執行這個命令,所以可以使用一個初始化容器來執行該命令(由于 vm.max_map_count 沒有 namespace 化,也就是 namespaced,所以在一個容器中進行修改,另一個容器和宿主機中也可以看到修改后的結果),并且保證該命令已經執行完成的情況下,主容器才會啟動,或者另一種情況是主容器啟動的時候需要安裝一些依賴包,為了避免安裝依賴包時間過長,影響健康檢查策略,可以選擇將這個安裝的任務交給初始化容器去執行,
  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,那么在宿主機的掛載目錄下顯示的就是如下形式:

[@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,那么在宿主機掛載目錄下顯示的就會是如下形式:

[@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 插件用于漢化界面,安裝完成后需要重啟服務(在頁面上方會有提示),

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/195878.html

標籤:其他

上一篇:云計算管理平臺之OpenStack鏡像服務glance

下一篇:給 Mac 添加右鍵選單「使用 VSCode 打開」

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more