搭建 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。
创建 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。